У меня есть 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
?
Все ответы приветствуются.
Добавление нескольких скриншотов для определения моей проблемы.У меня есть несколько вкладок, лото, крикет, футбол и т. Д., Как показано на рисунке.
Когда выбрана каждая вкладка, я извлекаю данные из бэкэнда и заполняю их в RecyclerView в anotherFragment «SecondFragment», который добавляется в ViewPager под TabLayout, как показанов изображении.
Но когда я пролистываю до следующего фрагмента, вкладка меняется на крикет, и данные из бэкэнда, соответствующего "крикету", выбираются во "SecondFragment", но не обновляют RecyclerView
, как показанона втором изображении.
И снова, при пролистывании до следующей вкладки «футбол», отображаются данные, соответствующие «крикету» и так далее, как показано наизображение 3, а затем, возвращаясь к первой вкладке, показывает данные, соответствующие любой другой вкладке.
Я не знаю, почему ее не обновляют.