仅将一个带有RecyclerView的片段用于多个TabLayout,而不正确更新选项卡上的数据更改 [英] Using only one Fragment with RecyclerView for multiple TabLayout , not updating data correctly on tabs change

查看:77
本文介绍了仅将一个带有RecyclerView的片段用于多个TabLayout,而不正确更新选项卡上的数据更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个与我相似的问题,但该解决方案不适用于我的情况. 我提到的问题是 我有一个名为"HomeFragment"的片段,它由VieWPager和TabLayout组成.我正在从后端动态添加标签.因此,我为所有选项卡使用了另一个名为"SecondFragment"的片段,因为所有选项卡仅包含一个RecyclerView.我正在填充SecondFragment的RecyclerView onCreate().我的问题是,当我滑动或更改选项卡时,RecyclerView无法正确更新.继续滑动时,数据会更改,但与所选选项卡不对应.我已经记录了该流程,并且在刷卡时从后端获取了正确的数据,但是它没有更新RrecyclerView.

There is a question similar to me, but that solution didn't work for my case. The question I have referred is this I have a fragment named "HomeFragment" which consists of a VieWPager and TabLayout. I am adding tabs dynamically from the backend. So I am using another Fragment named "SecondFragment" for all tabs since all tabs contain a RecyclerView only. I am populating the RecyclerView onCreate() of the SecondFragment. My issue comes here that when I swipe or change the tab, the RecyclerView not updating correctly. On continuing swiping, the data changes but it does not correspond to the selected tab. I have logged the flow and I am getting correct data from backend on swiping, but it does not updating the RrecyclerView.

我的HomeFragment类是

My HomeFragment class is

public class HomeFragment extends Fragment implements HTTPCallback {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private OnFragmentInteractionListener mListener;
private RecyclerView recyclerView;
private CardView cardview;
private boolean isShow;
View rootview;
private Toolbar toolbar;
private ImageView imageView, tabBg;
private CollapsingToolbarLayout collapsingToolbar;
private TabLayout mTabLayout;
Context context;
private ViewPager mViewPager, mViewPager1;
AppBarLayout appBarLayout;
Integer url_size;
int i;
boolean stopSliding = false;
String url, url2;
String message, version;
private ArrayList<HomeModel> planList;
JSONObject jsonObject, jsonObject2;
JSONArray jsonArray, jsonArray2;
ViewPagerAdapter adapter;

List<Product> products;
int numTab = 0;
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;

public HomeFragment() {
}

public static HomeFragment newInstance(String param1, String param2) {
    HomeFragment fragment = new HomeFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {

    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootview = inflater.inflate(R.layout.fragment_home, container, false);
    appBarLayout = (AppBarLayout) rootview.findViewById(R.id.appbar);
    mViewPager1 = (ViewPager) rootview.findViewById(R.id.view_pager);
    collapsingToolbar = (CollapsingToolbarLayout) rootview.findViewById(R.id.collapsing_toolbar);
    sharedPreferences = getContext().getSharedPreferences("spade", Context.MODE_PRIVATE);
    editor = sharedPreferences.edit();

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

    mTabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FF0000"));
    mTabLayout.setSelectedTabIndicatorHeight((int) (5 * getResources().getDisplayMetrics().density));
    mTabLayout.setTabTextColors(Color.parseColor("#727272"), Color.parseColor("#FF0000"));

    new HTTPRequest(getContext(), null, null, HTTPRequest.METHOD.GET, this).execute(url2);

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

        }

        @Override
        public void onPageSelected(int position) {
            if (position == 0) {
                appBarLayout.setExpanded(true);

            } else {
                appBarLayout.setExpanded(false);
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    try {

    } catch (Exception e) {
        e.printStackTrace();
    }

    mTabLayout.setOnTabSelectedListener(
            new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    super.onTabSelected(tab);

                    mViewPager.setCurrentItem(tab.getPosition());
                    numTab = tab.getPosition();
                    HomeModel browsePlan = planList.get(numTab);
                    editor.putString("tab", browsePlan.getName()).commit();
                }
            });

    return rootview;
}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onConnectionStarted() {
}

@Override
public void onConnectionFailed() {
}

@Override
public void onCompleted(JSONObject resultData) {

    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() {

    appBarLayout.setExpanded(false);
    mViewPager.setAdapter(adapter);
    mTabLayout.setupWithViewPager(mViewPager);
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

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

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

}

SecondFragment类是

SecondFragment class is

public class SecondFragment extends Fragment implements HTTPCallback {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
String mParam1;
String mParam2;
Button solo, grp;
View rootview;
Fragment fragment;
String url;
JSONObject jsonObject, jsonObject2;
JSONArray jsonArray, jsonArray2;
private ArrayList<Spaceship> planList;
RecyclerView rv;
private RecyclerHomeAdapter adapter = new RecyclerHomeAdapter(getContext(), planList);
;
private SharedPreferences sharedPreferences;
String tab_name;

private OnFragmentInteractionListener mListener;

public SecondFragment() {
}

public static SecondFragment newInstance(String s, String s1) {
    SecondFragment fragment = new SecondFragment();
    Bundle args = new Bundle();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootview = inflater.inflate(R.layout.fragment_second, container, false);
    sharedPreferences = getContext().getSharedPreferences("spade", Context.MODE_PRIVATE);

    tab_name = sharedPreferences.getString("tab", "onnumilla");
    rv = (RecyclerView) rootview.findViewById(R.id.rv);
    rv.setLayoutManager(new LinearLayoutManager(getContext()));
    url = "My_url_here";

    HashMap<String, String> data = new HashMap<String, String>();

    data.put("name", tab_name);

    new HTTPRequest2(getContext(), data, null, HTTPRequest2.METHOD.POST, this).execute(url);


    return rootview;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {

        adapter.notifyDataSetChanged();

//getFragmentManager().beginTransaction().detach(this).attach(this).commit(); } }

// getFragmentManager().beginTransaction().detach(this).attach(this).commit(); } }

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onConnectionStarted() {
}

@Override
public void onConnectionFailed() {
}

@Override
public void onCompleted(JSONObject resultData) {

    Spaceship model;
    planList = new ArrayList<>();
    planList.clear();
    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);
    adapter.notifyDataSetChanged();
    rv.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}

这对我不起作用.但是在setUserVisibleHint(boolean isVisibleToUser)方法中,当我添加getFragmentManager().beginTransaction().detach(this).attach(this).commit(); 代替adapter.notifyDataSetChanged();可以,但是要花一些时间才能在滑动"选项卡上隐藏以前的数据.

This doesn't work for me. But in the setUserVisibleHint(boolean isVisibleToUser) method when i add getFragmentManager().beginTransaction().detach(this).attach(this).commit(); instead of adapter.notifyDataSetChanged(); it works but it takes some time to hide previous data on swiping tab.

任何人,请给我建议一个解决方案.我提到了很多问题,但对我没有任何帮助.感谢您的答复.

Anyone, please suggest me a solution. I have referred many questions but nothing works for me. All your response is appreciated.

推荐答案

这似乎是ViewPager页面兑现的问题.请从onCreateView()调用以下代码 的HomeFragment.

This seems to be ViewPager page cashing issue. pls call below code from onCreateView() of HomeFragment.

mViewPager.setOffscreenPageLimit(1);

这篇关于仅将一个带有RecyclerView的片段用于多个TabLayout,而不正确更新选项卡上的数据更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆