Я начинаю с ViewPager2, у меня есть основной список статей, эти статьи относятся к категории ie, список категорий ie определяет вкладки TabLayout, у каждой вкладки есть фрагмент фрагмента статей со своим отфильтрованным списком, весь список генерируется правильно, проблема возникает, когда я пытаюсь отредактировать какой-то элемент из каждого списка, всегда получаю элементы первого созданного фрагмента.
Это мой код действия.
public class FichaDetallePresupuestoVP extends FragmentActivity {
ViewPager2 viewPager2;
TabLayout tabLayout;
List<CatClasificaciones> clasificacionesList;
RequestQueue requestQueue;
StringRequest stringRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ficha_detalle_presupuesto_v_p);
clasificacionesList = new ArrayList<>();
//This function fill the list and call cargaViewPager() after.
obtieneListaClasificaciones();
}
private void cargaViewPager(){
viewPager2 = findViewById(R.id.viewPager);
viewPager2.setAdapter(new PiezasPageAdapter(this,clasificacionesList));
tabLayout = findViewById(R.id.tabPiezas);
final TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager2,false, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
tab.setText(clasificacionesList.get(position).getDescripcion());
}
});
tabLayoutMediator.attach();
}
}
Код фрагмента
public class CatPiezas_RecyclerView extends Fragment {
List<CatPiezas> catPiezasList;
CatPiezasListadoAdapter catPiezasAdapter;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
int idclasificacion=0;
RequestQueue queueListado;
StringRequest requestListado;
public CatPiezas_RecyclerView() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_cat_piezas__recycler_view, container, false);
recyclerView =view.findViewById(R.id.recyclerViewPiezas);
layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
registerForContextMenu(recyclerView);
if(getArguments()!=null){
idclasificacion = getArguments().getInt("ID_CLASIFICACION");
//this function fill the list and call enlazaRecyclerView() after.
obtieneListado(idclasificacion);
}
return view;
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case CONTEXT_MENU_ITEM_ADD:
//in this point i have the issue, after select the item from a list, when fire
//the function to edit this item, the adapter retrive the list of the first tab-fragment.
catPiezasAdapter.agregaPieza(item.getGroupId());
catPiezasAdapter.notifyDataSetChanged();
return true;
case CONTEXT_MENU_ITEM_DELETE:
catPiezasAdapter.quitaPieza(item.getGroupId());
catPiezasAdapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
public void obtieneListado(int idclasificacion) {
if(idclasificacion!=0){
catPiezasList = new ArrayList<>();
obtieneListadoPiezas(idclasificacion);
}
}
private void enlazaRecyclerView(){
catPiezasAdapter = new CatPiezasListadoAdapter(catPiezasList,R.layout.rvi_piezas,this.getContext());
recyclerView.setAdapter(catPiezasAdapter);
}
}
Код адаптера RecyclerView
public class CatPiezasListadoAdapter extends RecyclerView.Adapter<CatPiezasListadoAdapter.ViewHolder> {
private List<CatPiezas> piezasList;
private int layout;
private Context context;
public CatPiezasListadoAdapter(List<CatPiezas> piezasList, int layout, Context context) {
this.piezasList = piezasList;
this.layout = layout;
this.context = context;
}
@NonNull
@Override
public CatPiezasListadoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(layout,viewGroup,false);
CatPiezasListadoAdapter.ViewHolder viewHolder = new CatPiezasListadoAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull CatPiezasListadoAdapter.ViewHolder viewHolder, int posicion) {
viewHolder.bind(piezasList.get(posicion));
}
@Override
public int getItemCount() {
return piezasList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{
TextView tvDescripcionPieza;
CheckBox chkSeleccionado;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvDescripcionPieza = itemView.findViewById(R.id.tvDescripcionPieza);
chkSeleccionado = itemView.findViewById(R.id.chkSeleccionado);
itemView.setOnCreateContextMenuListener(this);
}
public void bind(CatPiezas catPieza){
this.tvDescripcionPieza.setText(catPieza.getDescripcion());
if(catPieza.getSeleccionado()!=0){
this.chkSeleccionado.setChecked(true);
}else{
this.chkSeleccionado.setChecked(false);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
//Test to see what list is retrive.
String texto = piezasList.get(0).getDescripcion();
TextView pieza = v.findViewById(R.id.tvDescripcionPieza);
String txtPieza = pieza.getText().toString();
// in this point all work fine
menu.add(this.getAdapterPosition(), Utils.CONTEXT_MENU_ITEM_ADD,0,"Agrega " + txtPieza + " al presupuesto");
menu.add(this.getAdapterPosition(), Utils.CONTEXT_MENU_ITEM_DELETE,1,"Quita " + txtPieza + " del presupuesto");
}
}
public void agregaPieza(int position){
CatPiezas piezas = piezasList.get(position);
piezas.setSeleccionado(1);
}
public void quitaPieza(int position){
CatPiezas piezas = piezasList.get(position);
piezas.setSeleccionado(0);
}
}
Код адаптера страницы.
public class PiezasPageAdapter extends FragmentStateAdapter {
List<CatClasificaciones> list;
public PiezasPageAdapter(@NonNull FragmentActivity fragmentActivity,List<CatClasificaciones> list) {
super(fragmentActivity);
this.list = list;
}
@NonNull
@Override
public Fragment createFragment(int position) {
CatPiezas_RecyclerView fragment = new CatPiezas_RecyclerView();
Bundle bundle = new Bundle();
bundle.putInt("ID_CLASIFICACION",position+1);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getItemCount() {
return list.size();
}
}
Надеюсь, что поможет мне.
Tnks.