【问题标题】:Need to pass recyclerview clicked item id to second recyclerview需要将 recyclerview 点击的项目 id 传递给第二个 recyclerview
【发布时间】:2019-03-28 11:27:21
【问题描述】:

我正在开发一个 Android 应用程序。

有一个activity有两个独立的recyclerviews。

第一个是水平的,有自己的适配器。 第二个是垂直的,也有自己的适配器。

第一次启动活动时,两个回收站视图都会显示来自各自来源的所有项目。

但稍后我需要根据从第一个回收站视图中选择的项目过滤要在第二个回收站视图上显示的项目。

在第一个适配器上,当单击一个项目时,我会从中获取 id,我可以使用它来过滤来自第二个 recyclerview 的项目。

将id从第一个recyclerview点击的项目传递到第二个recyclerview而不需要重新加载活动的最佳方法是什么?

这是我从第一个适配器获取 id 的方式:

class MenuClickListener implements PopupMenu.OnMenuItemClickListener {
            Integer pos;

            public MenuClickListener(int pos) {
                this.pos = pos;
            }

            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_favourite:


                        String positi = marcaList.get(pos).getnombre();
                        Integer positid = marcaList.get(pos).getId();


                        return true;

                    default:
                }
                return false;
            }
        }

两个 recyclerviews 都是从远程数据库中填充的。

编辑

片段代码

public class HomeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
    private static final String TAG = "MainActivity";
    private static final String URL_PRODUCTS = "https://.../Api.php";


    SwipeRefreshLayout mSwipeRefreshLayout;
    //a list to store all the products
    List<Marca> marcaList;

    //the recyclerview
    RecyclerView recyclerView;
    RecyclerView recyclerView1;
    public List<Dispositivo> dispositivos;


    EditText cadenaNf,cadenaCf;
    private GridLayoutManager gridLayout;
    private DispositivoAdapter adapter;


    private Button botonbuscar;

    private String cadenaC,cadenaN;


    private SearchView searchView = null;
    private SearchView.OnQueryTextListener queryTextListener;
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);



    }
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Do something that differs the Activity's menu here
        super.onCreateOptionsMenu(menu, inflater);
    }





    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.home, container, false);

        //getting the recyclerview from xml
        recyclerView = v.findViewById(R.id.recyclerMarcas);
        recyclerView.setHasFixedSize(true);



        LinearLayoutManager layoutManager
                = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);

        marcaList = new ArrayList<>();
        loadProducts();


        // SwipeRefreshLayout
        mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipeRefreshLayout);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        mSwipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary,
                android.R.color.holo_green_dark,
                android.R.color.holo_orange_dark,
                android.R.color.holo_blue_dark);

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        mSwipeRefreshLayout.post(new Runnable() {

            @Override
            public void run() {

                mSwipeRefreshLayout.setRefreshing(true);
              //  dispositivos.clear();
                // Fetching data from server
               // getDispositivosFromDB(0);
            }
        });


        cadenaNf = (EditText) getActivity().findViewById(R.id.cadenaNtxt);

        cadenaNf.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                Log.d("SEARCH string", "pulsado search ANTES DE ESCRIBIR CADENA N "+ charSequence);

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                Log.d("SEARCH string", "pulsado search ESCRIBIENDO CADENA N "+ charSequence);

                if(charSequence.length() >3 ){
                    dispositivos.clear();

                    getDispositivosBusquedaFromDB(0, charSequence.toString());
                }
                if(charSequence.length()== 0 ){
                    dispositivos.clear();
                    getDispositivosFromDB(0);
                }



                Log.d("SEARCH string", "pulsado search submit N FFF CHANGE "+ charSequence);
            }

            @Override
            public void afterTextChanged(Editable editable) {
                dispositivos.clear();
                Log.d("SEARCH string", "pulsado search submit N FFF "+editable );
                Log.d("SEARCH string", "pulsado search ENVIADA CADENA N "+ editable);
            }
        });
        cadenaCf = (EditText) getActivity().findViewById(R.id.cadenaCtxt);
        cadenaCf.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                Log.d("SEARCH string", "pulsado search ANTES DE ESCRIBIR CADENA C "+ charSequence);
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                Log.d("SEARCH string", "pulsado search ESCRIBIENDO CADENA C "+ charSequence);
                Log.d("SEARCH string", "pulsado search submit N FFF CHANGE "+ charSequence);
                if(charSequence.length() >3 ){
                    dispositivos.clear();

                    getDispositivosBusquedaFromDB(0, charSequence.toString());
                }
                if(charSequence.length()== 0 ){
                    dispositivos.clear();
                    getDispositivosFromDB(0);
                }


            }

            @Override
            public void afterTextChanged(Editable editable) {
                dispositivos.clear();
                Log.d("SEARCH string", "pulsado search submit CCC FFF "+editable );
                Log.d("SEARCH string", "pulsado search ENVIADA CADENA C "+ editable);
            }
        });







        // getData();





        recyclerView1 = (RecyclerView) v.findViewById(R.id.recyclerView1);
        dispositivos = new ArrayList<>();


        gridLayout = new GridLayoutManager(getActivity(), 2);
        recyclerView1.setLayoutManager(gridLayout);

        adapter = new DispositivoAdapter(getActivity(), dispositivos);
        dispositivos.clear();

        recyclerView1.setAdapter(adapter);




        getDispositivosFromDB(0);

        return v;

    }

    private void getDispositivosBusquedaFromDB(int id, final String busqueda) {

        Log.d("HOLA ADDRESSES", "DIRECCION LEIDA ESTOY BUSCANDO: "+busqueda);

        dispositivos.clear();

        mSwipeRefreshLayout.setRefreshing(true);

        Log.d("estoy en directorio= ",busqueda);

        Log.d("Texto buscado= ",busqueda);
        AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
            @Override
            protected Void doInBackground(Integer... addressesIds) {

                String URL = "https://._busca.php?id="+busqueda;
                OkHttpClient client = new OkHttpClient();
                okhttp3.Request request = new okhttp3.Request.Builder()
                        .url(URL)
                        .build();
                try {
                    okhttp3.Response response = client.newCall(request).execute();
                    Log.d("Texto buscado=estoy ",busqueda);
                    JSONArray array = new JSONArray(response.body().string());

                    for (int i = 0; i < array.length(); i++) {
                        Log.d("Texto buscado loop= ",busqueda);
                        JSONObject object = array.getJSONObject(i);
                        Log.d("HOLA ADDRESSES", "DIRECCION LEIDA: " + i);
                        Dispositivo dispositivo = new Dispositivo(object.getInt("id_dispositivo"),
                                object.getString("usuario_dispositivo"),
                                object.getString("fecha_dispositivo"),
                                object.getString("precio_dispositivo"),
                                object.getString("garantia"),
                                object.getString("estado"),
                                object.getString("estado_publicacion"),
                                object.getString("localizacion"),
                                object.getString("comentarios"),
                                object.getString("modelo_dispositivo"),
                                object.getString("foto_dispositivo"),
                                object.getString("foto2"),
                                object.getString("foto3"),
                                object.getString("foto4"),
                                object.getString("foto5"),
                                object.getString("hora_dispositivo"),
                                object.getString("modelo_del_dispositivo"),
                                object.getString("logo_marca")


                        );

                        dispositivos.add(dispositivo);
                    }


                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {


                recyclerView1.swapAdapter(adapter, true);

                mSwipeRefreshLayout.setRefreshing(false);
            }
        };

        asyncTask.execute(id);
    }


    private void getDispositivosFromDB(int id) {
        Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR: ");

        dispositivos.clear();
        mSwipeRefreshLayout.setRefreshing(true);

        AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
            @Override
            protected Void doInBackground(Integer... addressesIds) {
                //  Log.d("HOLA PERFIL", "UID REGISTRADO ANTES DE CARGAR REECYCLER: " + user_id);

//******** 这里我需要从适配器 1 收到的 ID // String id = (从adapter1接收到的id)

                OkHttpClient client = new OkHttpClient();
                okhttp3.Request request = new okhttp3.Request.Builder()
                        .url("...todos.php?id="+id)
                        .build();
                try {
                    okhttp3.Response response = client.newCall(request).execute();

                    JSONArray array = new JSONArray(response.body().string());

                    for (int i = 0; i < array.length(); i++) {

                        JSONObject object = array.getJSONObject(i);
                        Log.d("HOLA ADDRESSES", "DIRECCION LEIDA busqueda: " + i);
                        Log.d("DISPOSITIVOS", "DISPOSITIVO: " + object);
                        Dispositivo dispositivo = new Dispositivo(object.getInt("id_dispositivo"),
                                object.getString("usuario_dispositivo"),
                                object.getString("fecha_dispositivo"),
                                object.getString("precio_dispositivo"),
                                object.getString("garantia"),
                                object.getString("estado"),
                                object.getString("estado_publicacion"),
                                object.getString("localizacion"),
                                object.getString("comentarios"),
                                object.getString("modelo_dispositivo"),
                                object.getString("foto_dispositivo"),
                                object.getString("foto2"),
                                object.getString("foto3"),
                                object.getString("foto4"),
                                object.getString("foto5"),
                                object.getString("hora_dispositivo"),
                                object.getString("modelo_del_dispositivo"),
                                object.getString("logo_marca")
                        );

                        dispositivos.add(dispositivo);
                    }


                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {


                adapter.notifyDataSetChanged();
                mSwipeRefreshLayout.setRefreshing(false);
            }
        };

        asyncTask.execute(id);
    }


    private void loadProducts() {

        /*
         * Creating a String Request
         * The request type is GET defined by first parameter
         * The URL is defined in the second parameter
         * Then we have a Response Listener and a Error Listener
         * In response listener we will get the JSON response as a String
         * */
        StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_PRODUCTS,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //converting the string to json array object
                            JSONArray array = new JSONArray(response);

                            Log.d("HOLA PERFIL", "RESPONSE 2 valor=" + response);
                            //traversing through all the object
                            for (int i = 0; i < array.length(); i++) {

                                //getting product object from json array
                                JSONObject marca = array.getJSONObject(i);

                                //adding the product to product list
                                marcaList.add(new Marca(
                                        marca.getInt("id"),
                                        marca.getString("nombre"),

                                        marca.getString("icono")
                                ));
                            }

                            //creating adapter object and setting it to recyclerview
                            MarcasAdapter adapter = new MarcasAdapter(getActivity(), marcaList);
                            recyclerView.setAdapter(adapter);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

        //adding our stringrequest to queue
        Volley.newRequestQueue(getActivity()).add(stringRequest);
    }


    @Override
    public void onRefresh() {
        dispositivos.clear();
        getDispositivosFromDB(0);
    }

    public void onResume(){
        super.onResume();
        Log.d("HOLA PERFIL", "BUSCANDO ONCREATEA CCAA:ONRESUME ANTES DE CLEAR ");


        Log.d("HOLA PERFIL", "BUSCANDO ONCREATEA CCAA:ONRESUME DESPUES DE CLEAR ");
        // Set title bar
        ((MainActivity) getActivity())
                .setActionBarTitle("Portada de Jogua");

    }
}

适配器 1 代码 MarcasAdapter

public class MarcasAdapter extends RecyclerView.Adapter<MarcasAdapter.ProductViewHolder>  {


    private Context mCtx;
    private List<Marca> marcaList;
    private SharedPreferences mPref;
    public MarcasAdapter(Context mCtx, List<Marca> marcaList) {
        this.mCtx = mCtx;
        this.marcaList = marcaList;
    }




    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.marcas_list, null);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ProductViewHolder holder, int position) {
        Marca marca = marcaList.get(position);
String url = "https://jogua.es/administrar/application/admin/iconos/";
        //loading the image
        Glide.with(mCtx)
                .load(url+marca.geticono())
                .into(holder.imageView);





    }

    @Override
    public int getItemCount() {

        return marcaList.size();
    }

    class ProductViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView textViewTitle;
        ImageView imageView;

        public ProductViewHolder(View itemView) {
            super(itemView);


            imageView = itemView.findViewById(R.id.imageView);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            showPopupMenu(v, position);

            Log.d("HOLA PERFIL", "RESPONSE 2 valor=" + position);
        }

        private void showPopupMenu(View view, int poaition) {
            PopupMenu popup = new PopupMenu(mCtx, view);
            MenuInflater inflater = popup.getMenuInflater();
            inflater.inflate(R.menu.menu_context_directorio, popup.getMenu());
            popup.setOnMenuItemClickListener(new MenuClickListener(poaition));
            popup.show();
        }

        class MenuClickListener implements PopupMenu.OnMenuItemClickListener {
            Integer pos;

            public MenuClickListener(int pos) {
                this.pos = pos;
            }

            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_favourite:


                        String positi = marcaList.get(pos).getnombre();
                        Integer positid = marcaList.get(pos).getId();


                        return true;

                    default:
                }
                return false;
            }
        }
    }
}

适配器 2 代码 DispositivosAdapter

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.mpidesarrollo.jogua.R;

import java.util.List;

import static android.content.Context.MODE_PRIVATE;


public class DispositivoAdapter extends RecyclerView.Adapter<DispositivoAdapter.ViewHolder> {

    private Context context;
    private List<Dispositivo> dispositivos;
    private String emailsegundo;

    private SharedPreferences mPref;
    private  static final String PREF_NAME = "dispositivo";

    private static final String BACK_STACK_ROOT_TAG = "detalle_disp";

    public DispositivoAdapter(Context context, List<Dispositivo> dispositivos) {
        this.context = context;
        this.dispositivos = dispositivos;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.dispositivo_card,parent,false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {


        holder.txtnombre.setText(dispositivos.get(position).getmodelo_del_dispositivo());

        String precio = dispositivos.get(position).getprecio_dispositivo().toString();
        String newString = precio.replace(".", ",");


        holder.txtPrecio.setText(newString+" €");

        String url_foto = "https://jogua.es/administrar/application/admin/dispositivos/"+dispositivos.get(position).getfoto_dispositivo();
        Glide.with(context).load(url_foto).into(holder.imageView);

        String url_logoMarca = "https://jogua.es/administrar/application/admin/iconos/"+dispositivos.get(position).getlogo_marca();
        Glide.with(context).load(url_logoMarca).into(holder.logoMarca);


    }



    @Override
    public int getItemCount() {
        return dispositivos.size();
    }

    public  class ViewHolder extends  RecyclerView.ViewHolder implements View.OnClickListener{



        public TextView txtnombre,txtPrecio;



        public ImageView imageView;
        public ImageView logoMarca;

        public ViewHolder(View itemView) {
            super(itemView);
            txtnombre = (TextView) itemView.findViewById(R.id.txtnombre);
            txtPrecio = (TextView) itemView.findViewById(R.id.txtprecio);
           imageView = (ImageView) itemView.findViewById(R.id.foto);
            logoMarca = (ImageView) itemView.findViewById(R.id.logoMarca);

            itemView.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            mPref = context.getSharedPreferences(PREF_NAME, MODE_PRIVATE);


            SharedPreferences.Editor editor = mPref.edit();

            Log.d("DISPOSITIVO", "dispositivo pulsado"+position );

            editor.putInt("ID_DISPOSITIVO", dispositivos.get(position).getid_dispositivo());
            editor.putString("FOTO_DISPOSITIVO", dispositivos.get(position).getfoto_dispositivo());
            editor.putString("FOTO2", dispositivos.get(position).getfoto2());
            editor.putString("FOTO3", dispositivos.get(position).getfoto3());
            editor.putString("FOTO4", dispositivos.get(position).getfoto4());
            editor.putString("FOTO5", dispositivos.get(position).getfoto5());

            editor.apply();

            DetalleDispositivoFragment firstFragment = new DetalleDispositivoFragment();
            ((MainActivity)context).getSupportFragmentManager().beginTransaction()
                    .addToBackStack(BACK_STACK_ROOT_TAG)

                    .replace(R.id.content_frame, firstFragment).commit();
            //showPopupMenu(v,position);
        }
    }


}

【问题讨论】:

  • 在第二个适配器中创建刷新 fun(public) 并传递 id 和过滤数据,或者使用 notifyDataSetChanged(...) 仅为该适配器重新加载。您可以随时从活动中访问刷新方法
  • 将 id 传递给 adapter 并重新填写您的 listnotifyadapter()
  • @MD,谢谢,但我不明白你的提议
  • 你能告诉我你的适配器吗?
  • 从第一个列表中获取项目ID并根据该ID过滤第二个列表,然后将过滤后的列表发送到第二个适配器或通知适配器。

标签: android android-recyclerview


【解决方案1】:
class MenuClickListener implements PopupMenu.OnMenuItemClickListener {
        Integer pos;

        public MenuClickListener(int pos) {
            this.pos = pos;
        }

        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.action_favourite:


                    String positi = marcaList.get(pos).getnombre();
                    Integer positid = marcaList.get(pos).getId();
                    // do network operation here
                    // Eg: arraylist = api.getMobile(positid);
                    // update vertical recyclerview's data here
                    // verticalAdapter = new  VerticalAdapter(arraylist);

                    return true;

                default:
            }
            return false;
        }
    }

【讨论】:

  • 但我需要执行从第二个适配器加载过滤项目的方法,即在不在适配器中的活动上
  • 发布初始调用块
【解决方案2】:

当第一个recycler view item被点击时,将对应的id或信息传递给另一个方法(例如:setSecondRV(id OR information))。在这个方法中,你可以做网络操作或者正常操作来得到你想要的列表。然后通过将列表传递给第二个适配器来设置第二个回收器视图。 不要忘记通知 Adapter (secondAdapter.notifyDataSetChanged();)

这是一个新闻应用程序的链接,它根据点击的第一个回收站视图项目为第二个回收站视图执行网络操作。

NewsUltimate

【讨论】:

  • 您的应用完全符合我的需要,但我不知道您在哪里进行所需的网络操作
  • 在适配器中。您也可以在 Activity 中执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多