Во вложенном фрагменте, когда TabLayout изменяет новый экземпляр фрагмента, добавляется, но RecyclerView не обновляется - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть Fragment с именем HomeFragment, состоящий из TabLayout и ViewPager.TabLayout заполняется данными из бэкэнда.Таким образом, у каждого элемента вкладки есть имя, и при изменении положения вкладки я выбираю данные из бэкэнда и добавляю еще один фрагмент с именем SecondFragment к ViewPager.SecondFragment состоит из RecyclerView, и я заполняю его данными из бэкэнда.Что мне нужно, так это когда вкладки меняются, тогда вызывается url, соответствующий ему, и данные ответа должны обновляться до RecyclerView в SecondFragment в пределах 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.При изменении вкладок RecyclerView показывает предыдущие данные.

Как сделать так, чтобы все работало нормально при смене вкладок, т.е. обновите RecyclerVierw данными, которые я получаю при добавлении каждого экземпляра SecondFragment в ViewPager?

Все ответы приветствуются.

Добавление нескольких скриншотов для определения моей проблемы.У меня есть несколько вкладок, лото, крикет, футбол и т. Д., Как показано на рисунке.enter image description here

Когда выбрана каждая вкладка, я извлекаю данные из бэкэнда и заполняю их в RecyclerView в anotherFragment «SecondFragment», который добавляется в ViewPager под TabLayout, как показанов изображении.

Но когда я пролистываю до следующего фрагмента, вкладка меняется на крикет, и данные из бэкэнда, соответствующего "крикету", выбираются во "SecondFragment", но не обновляют RecyclerView, как показанона втором изображении.
enter image description here

И снова, при пролистывании до следующей вкладки «футбол», отображаются данные, соответствующие «крикету» и так далее, как показано наизображение 3, а затем, возвращаясь к первой вкладке, показывает данные, соответствующие любой другой вкладке.
Я не знаю, почему ее не обновляют.

enter image description here

...