Использование только одного фрагмента с RecyclerView для нескольких TabLayout, неправильное обновление данных при изменении вкладок - PullRequest
0 голосов
/ 15 октября 2018

Есть вопрос, похожий на меня, но это решение не сработало для моего случая.Вопрос, который я упомянул: this У меня есть фрагмент с именем "HomeFragment", который состоит из VieWPager и TabLayout.Я добавляю вкладки динамически из бэкэнда.Поэтому я использую другой Фрагмент с именем «SecondFragment» для всех вкладок, поскольку все вкладки содержат только RecyclerView.Я заполняю RecyclerView onCreate () второго фрагмента.Моя проблема здесь заключается в том, что когда я провожу или меняю вкладку, RecyclerView не обновляется правильно.При продолжении считывания данные изменяются, но не соответствуют выбранной вкладке.Я зарегистрировал поток и получаю правильные данные из бэкенда при смахивании, но он не обновляет RrecyclerView.

Мой класс HomeFragment равен

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 имеет вид

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 ();}}

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();, он работает, но требуется скрытие предыдущих данных на вкладке смахивания.

Кто-нибудь, пожалуйста, предложите мне решение.Я ответил на многие вопросы, но у меня ничего не работает.Весь ваш ответ приветствуется.

1 Ответ

0 голосов
/ 16 октября 2018

Это, похоже, проблема с обналичиванием страниц ViewPager.Пожалуйста, позвоните ниже код из onCreateView () из HomeFragment.

mViewPager.setOffscreenPageLimit(1);
...