如何使用Viewpager用子片段替换片段

时间:2020-05-26 08:16:45

标签: android android-viewpager

嗨,我想做的是我有一个带Viewpager的bottomNavigationView,因此当在Viewpager上滑动导航片段时添加/替换意味着Viewpager是片段容器

现在我的问题是-如何从 MainFragmen 调用 Child_Fragment

我尝试过的是下面的

public class FirstActivity extends FragmentActivity {
BottomNavigationView bottomNavigationView;
//This is our viewPager
private ViewPager viewPager;
//Fragments
CategoryFragment categoryFragment;
FavouriteFragment favouriteFragment;
MyPostFragment myPostFragment;
SettingFragment settingFragment;
MenuItem prevMenuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
    //Initializing viewPager
    viewPager =  findViewById(R.id.viewpager);
    //Initializing the bottomNavigationView
    bottomNavigationView = findViewById(R.id.nav_view);
    bottomNavigationView.setOnNavigationItemSelectedListener(
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.navigation_home:
                            viewPager.setCurrentItem(0);
                            break;
                        case R.id.navigation_dashboard:
                            viewPager.setCurrentItem(1);
                            break;
                        case R.id.navigation_notifications:
                            viewPager.setCurrentItem(2);
                            break;
                        case R.id.navigation_setting:
                            viewPager.setCurrentItem(3);
                            break;
                    }
                    return false;
                }
            });

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if (prevMenuItem != null) {
                prevMenuItem.setChecked(false);
            }
            else
            {
                bottomNavigationView.getMenu().getItem(0).setChecked(false);
            }
            Log.d("page", "onPageSelected: "+position);
            bottomNavigationView.getMenu().getItem(position).setChecked(true);
            prevMenuItem = bottomNavigationView.getMenu().getItem(position);

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });


    setupViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
    categoryFragment=new CategoryFragment();
    favouriteFragment=new FavouriteFragment();
    myPostFragment=new MyPostFragment();
    settingFragment=new SettingFragment();
    adapter.addFragment(categoryFragment);
    adapter.addFragment(favouriteFragment);
    adapter.addFragment(myPostFragment);
    adapter.addFragment(settingFragment);
    viewPager.setAdapter(adapter);
}

}

现在我的CategoryFragment是这个,它是NavigationView默认选中的第一项

public class CategoryFragment extends Fragment implements AdapterInterface {

Multimap<String, String> multiMaphsmap = ArrayListMultimap.create();
static HashMap<String, String> subcategoryID_HasmapList = new HashMap<>();
ArrayList<String> idlist = new ArrayList<>();
ArrayList<String> name_list = new ArrayList<>();
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView recyclerView;
IResult mResultCallback;
CatLoadingView dialog;
public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {

    View root = inflater.inflate( R.layout.fragment_home, container, false );

    recyclerView = root.findViewById(R.id.my_recycler_view);
    recyclerView.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    dialog = new CatLoadingView();

    //  Call Volly TO Fetch Data From Server CatLoadin Dialog
    dialog.show(getActivity().getSupportFragmentManager(), "");
    try {
        initVolleyCallback();
        VolleyService mVolleyService = new VolleyService(mResultCallback, getActivity());
        mVolleyService.postDataVolley(0,"");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return root;
}



void initVolleyCallback(){
    mResultCallback = new IResult() {
        @Override
        public void notifySuccess(String  response) {
            Log.e("response",  response);
            JSONObject obj = null;
            JSONObject heroObject = null;
            try {
                obj = new JSONObject(response);
                JSONArray responseData = obj.getJSONArray("responseData");
                for (int i = 0; i < responseData.length(); i++) {
                    //getting the json object of the particular index inside the array
                    heroObject = responseData.getJSONObject(i);
                    String cat_name = heroObject.getString("category_name");
                    name_list.add(cat_name);
                    String id = heroObject.getString("id");
                    idlist.add(id);
                    Log.e("ALL ID-", id);
                    JSONArray subcatarray = heroObject.getJSONArray("subcategory_list");
                    for (int j = 0; j < subcatarray.length(); j++) {
                        JSONObject suboject = subcatarray.getJSONObject(j);
                        String category_id = suboject.getString("category_id");
                        Log.e("category_id", category_id);
                        String subcatname = suboject.getString("subcategory_name");
                        String subid = suboject.getString("id");
                        Log.e("id", subid);
                        subcategoryID_HasmapList.put(subid, subcatname);
                        HaspMapSetMethod(category_id, subcatname);

                    }
                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
            if (dialog.isAdded()) {
                dialog.dismiss();
            }

            //dismiss CatDialog is showing already
            if (dialog.isAdded())dialog.dismiss();

            adapter = new CustomAdapter(getActivity(), mCallback, name_list, idlist, multiMaphsmap,subcategoryID_HasmapList);
            recyclerView.setAdapter(adapter);
            //

        }

        @Override
        public void notifyError(VolleyError error) {
            error.printStackTrace();
            //dismiss CatDialog is showing already
            if (dialog.isAdded())dialog.dismiss();
        }
    };
}
private void HaspMapSetMethod(String category_id, String subcatname) {

    multiMaphsmap.put(category_id, subcatname);

}


@Override
public void onItemClicked(int position) {
    Toast.makeText( getActivity(),"Click"+position,Toast.LENGTH_LONG ).show();

}

}

这是我的CustomAdapter,从那里我必须调用下一个片段

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
private Multimap<String, String> multiMaphsmap;
private ArrayList<String> idlist ;
private ArrayList<String> name_list;
private static final String font = "Billabong.ttf";
private Context ctx;
private ArrayList<String> subcategoryList;
private HashMap<String, String> subcategoryID_HasmapList;
AdapterInterface adaptercallback;

public static String ID;
    public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView textViewName;
    ImageView imageViewIcon;
        private  FragmentManager mFragmentManager;
    public MyViewHolder(View itemView) {
        super(itemView);
        this.textViewName = itemView.findViewById(R.id.textViewName);
        this.imageViewIcon = itemView.findViewById(R.id.imageView);
        // on item click
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // get position
                int pos = getAdapterPosition();

                // check if item still exists
                if (pos != RecyclerView.NO_POSITION) {
                    subcategoryList.clear();

                    for (Map.Entry<String, String> entry : multiMaphsmap.entries()) {
                        String key = entry.getKey(), value = entry.getValue();
                        if (key.equalsIgnoreCase(idlist.get(pos))) {
                            subcategoryList.add(entry.getValue());

                        }
                    }

                    adaptercallback.onItemClicked(pos);

                  /*  Intent i =new Intent(ctx, CategoryActivity.class);
                    Bundle args = new Bundle();
                    args.putSerializable("ARRAYLIST",(Serializable) subcategoryList);
                    i.putExtra("hasmaplist",subcategoryID_HasmapList);
                    i.putExtra("BUNDLE",args);
                    Log.e("ID--",idlist.get(pos));
                    ID=idlist.get(pos);
                    ctx.startActivity(i);*/
                }

            }
        });
    }
}
public CustomAdapter(Context ctx,ArrayList<String> name_list ,ArrayList<String> idlist, Multimap<String, String> multiMaphsmap,HashMap<String, String> subcategoryID_HasmapList) {
    this.name_list = name_list;
    this.ctx = ctx;
    this.idlist=idlist;
    this.multiMaphsmap=multiMaphsmap;
    this.subcategoryID_HasmapList=subcategoryID_HasmapList;
}

public CustomAdapter(Context ctx, AdapterInterface adaptercallback, ArrayList<String> name_list , ArrayList<String> idlist, Multimap<String, String> multiMaphsmap, HashMap<String, String> subcategoryID_HasmapList) {
    this.name_list = name_list;
    this.ctx = ctx;
    this.adaptercallback = adaptercallback;
    this.idlist=idlist;
    this.multiMaphsmap=multiMaphsmap;
    this.subcategoryID_HasmapList=subcategoryID_HasmapList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cards_layout, parent, false);
    subcategoryList=new ArrayList<>();
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

    TextView textViewName = holder.textViewName;
    ImageView imageView = holder.imageViewIcon;
    final Typeface typeface = Typeface.createFromAsset(ctx.getAssets(), font);
    textViewName.setTypeface(typeface);
    textViewName.setText(name_list.get(listPosition));
    Log.e("Size of list--", name_list.size() + "");
    //imageView.setImageResource(dataSet.get(listPosition).getImage());
}

@Override
public int getItemCount() {
    return name_list.size();
}

}

我试图在项目单击上获取回调单击侦听器,但获取回调null错误也不起作用,不知道为什么。我发现getChildFragmentManger运作良好,但是我无法在片段中获得位置,因为getChildFragmentManger()仅从片段而不是从适配器调用。我尝试的另一种方法是直接用Viewpager替换片段,但出现错误viewID空类型

 Vi

0 个答案:

没有答案
相关问题