首页 > 解决方案 > 在嵌套片段中,当 TabLayout 更改添加片段的新实例但 RecyclerView 未更新时

问题描述

我有一个Fragmentnamed HomeFragment,由一个TabLayoutand组成ViewPagerTabLayout填充了来自后端的数据。所以每个选项卡项都有一个名称,并且在更改选项卡位置时,我从后端获取数据并添加另一个片段,命名SecondFragmentViewPager. SecondFragment包括,RecyclerView我用来自后端的数据填充它。What I need is when tabs changes then an urlcorresponding to it is called and the response data should updated to RecyclerViewin SecondFragmentwithin the ViewPager.

到目前为止,我所做的如下:

填充TabLayout

mViewPager= (ViewPager)rootview.findViewById(R.id.viewpager);
mTabLayout= (TabLayout)rootview.findViewById(R.id.tabs);


HomeModel model;
planList = new ArrayList<>();
adapter = new ViewPagerAdapter(getChildFragmentManager());
try {
    jsonArray = resultData.getJSONArray("details");
    editor.putString("tab",jsonArray.getJSONObject(0).getString("name"));
    editor.commit();
    for(int i=0; i<jsonArray.length();i++){
        jsonObject2 = jsonArray.getJSONObject(i);
        model = new HomeModel();
        model.setCatid(jsonObject2.getString("id"));
        model.setImage(jsonObject2.getString("image"));
        model.setName(jsonObject2.getString("name"));
        planList.add(model);
        setupViewPager(mViewPager,jsonObject2.getString("name"));
    }
    setAdapter();
} catch (JSONException e) {
    e.printStackTrace();
}
private void setAdapter() {
    mViewPager.setAdapter(adapter);
    mTabLayout.setupWithViewPager(mViewPager);  
}

private void setupViewPager(ViewPager mViewPager,String name) {
    adapter.addFragment(new SecondFragment(), name);
}

TabsSelectListener

mTabLayout.setOnTabSelectedListener(
    new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            super.onTabSelected(tab);
            numTab = tab.getPosition();
            HomeModel browsePlan = planList.get(numTab);
            editor.putString("tab", browsePlan.getName()).apply();
        }
    });

在我的SecondFragment我正在使用自定义适配器类just填充数据:Recyclerview

SecondFragment代码片段:

planList = new ArrayList<>();
try {
    jsonArray = resultData.getJSONArray("products");
    for(int i=0; i<jsonArray.length();i++){
        jsonObject2 = jsonArray.getJSONObject(i);
        model = new Spaceship();
        model.setName(jsonObject2.getString("package_name"));
        model.setImage(jsonObject2.getString("images"));
        planList.add(model);
    }
    setAdapter();
} catch (JSONException e) {
    e.printStackTrace();
}

添加到适配器:

private void setAdapter() {
    adapter = new RecyclerHomeAdapter(getContext(), planList);
    rv.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

自定义适配器类

public class RecyclerHomeAdapter extends RecyclerView.Adapter<RecyclerHomeAdapter.MyHolder> {
    private ArrayList<Spaceship> spaceships;
    private Context c;

    public RecyclerHomeAdapter(Context c, ArrayList<Spaceship> spaceships) {
        this.spaceships = spaceships;
        this.c = c;
    }
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(c).inflate(R.layout.home_package,parent,false);
        return new MyHolder(v);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        Spaceship s=spaceships.get(position);

        holder.nameTxt.setText(s.getName());

        Glide.with(c).load(s.getImage())
                .thumbnail(0.5f)
                .crossFade()
                .fitCenter()
                .placeholder(R.drawable.loading_image)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.img);
    }

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

    class MyHolder extends RecyclerView.ViewHolder
    {
        TextView nameTxt;
        ImageView img;

        public MyHolder(View itemView) {
            super(itemView);

            nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
            img= (ImageView) itemView.findViewById(R.id.spacecraftImage);
        }
    }
}

添加选项卡,SecondFragment在里面显示ViewPager填充RecyclerView正在工作。
我的问题是更改标签时。我已经登录并发现我SecondFragment在更改每个选项卡时得到了正确的数据,但该数据没有更新到RecyclerView. When tabs changes RecyclerViewshows previous data.

我怎样才能使它在标签更改时正常工作,即更新RecyclerVierw我在添加每个实例时获得的SecondFragment数据ViewPager

感谢所有回复。

添加一些屏幕截图以识别我的问题。如图所示,我有多个标签、乐透、板球、足球等。 在此处输入图像描述

当每个选项卡被选中时,我从后端获取数据并将其填充到 anotherFragment“SecondFragment”中的 RecyclerView,它被添加到 TabLayout 下方的 ViewPager,如图所示。

但是,当我滑动到下一个片段选项卡更改为 cricket 时,在“SecondFragment”中获取来自后端的与“cricket”相对应的数据,但它没有更新RecyclerView,如第二张图片所示。
在此处输入图像描述

同样,在滑动到下一个选项卡“足球”时,显示与“板球”相对应的数据,依此类推,如图 3 所示,然后滑动回第一个选项卡,它显示与任何其他选项卡对应的数据。
我不知道为什么它没有得到更新。

在此处输入图像描述

标签: androidandroid-viewpagerandroid-tablayoutcustom-adapterandroid-nested-fragment

解决方案


推荐阅读