Как отредактировать повторное представление элемента из фрагмента в viewpager2 - PullRequest
0 голосов
/ 21 апреля 2020

Я начинаю с 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.

...