passing values from recycler adapter to fragment in android

痞子三分冷 提交于 2019-11-28 06:36:42

问题


I've a recycler adapter where I've added setOnClickListener for items in adapter. Code is as given below:

@Override
    public void onBindViewHolder(final FiltersAdapter.MyViewHolder holder, final int position) {
        holder.mOrganizer.setText(filtersList.get(position));
        holder.mLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    //Log.e("message","ONclick FIlter");
                    if (holder.mOrganizerCheck.isChecked()){
                        holder.mOrganizerCheck.setChecked(false);
                    }else {
                        holder.mOrganizerCheck.setChecked(true);
                        int pos = holder.getAdapterPosition();

                        filtersList.get(pos);

                        /*Bundle bundle = new Bundle();
                        bundle.putInt(pos, );*/

                        Log.d(TAG, "onClick: " +filtersList);
                        Log.d(TAG, "onClick of position: " +pos);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });  

And here is fragment code which deals with getting values from adapter to fragment.

private void initView() {
        mrvFilterBySender = (RecyclerView) mFilterView.findViewById(R.id.rvFilterBySender);
        mFiltersAdapter = new FiltersAdapter(getActivity(), mListOrganizer);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
        mrvFilterBySender.setLayoutManager(mLayoutManager);

        mrvFilterBySender.setAdapter(mFiltersAdapter);
        mFiltersAdapter.notifyDataSetChanged();

        mrvFilterBySender.setAdapter(mFiltersAdapter);
        mrvFilterBySender.setRecyclerListener(new RecyclerView.RecyclerListener() {
            @Override
            public void onViewRecycled(RecyclerView.ViewHolder holder) {
                holder.getAdapterPosition();
            }
        });

    }  

I'm trying to pass pos and value having that pos from adapter to fragment. But my code isn't working. How can I fix it?


回答1:


make interface to handle click event into recyclerview .. used below code for handling click event.

onItemClickListner onItemClickListner;

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);//pass your object types.
}
   @Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    String data=mStringList.get(position); // if you pass object of class then create that class object.
    holder.textView.setText(data);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
 }

then after when you bind adapter into RecyclerView call below code..

mRvData.setLayoutManager(new LinearLayoutManager(this));
mRvData.setAdapter(recyclerViewAdpater);
recyclerViewAdpater.notifyDataSetChanged();
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
    @Override
    public void onClick(String str) {
        Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
    }
});



回答2:


Create an interface in your adapter

public interface OnItemClickListener {
  void onItemClicked(int position, Object object);
}

in your adapter call

Adapter adapter = new Adapter(context, list, new Adapter.OnItemClickListener() {
            @Override
            public void onItemClicked(int position, Object object) {
                  // Handle Object of list item here
            }
        });

on your adapter

private OnItemClickListener onItemClickListener; // Global scope 

in constructor call:

this.onItemClickListener = onItemClickListener;

on your item clicked event :

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      onItemClickListener.onItemClicked(position, _list.get(position));
    }
});



回答3:


Please use an interface like below, pass it in the adapter's constructor, and than use it in your activity / Fragment

   public MyAdapter(Context context, List<Object> data, MyAdapterListener myAdapterListener) {
             this.context = context;
             this.data = data;
              this.myAdapterListener = myAdapterListener;
        }

        public interface MyAdapterListener {

    void onContainerClick(View view, int position); 
    }

     }

    public class ViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener {
        public LinearLayout container;

        public ImageView poster;

        public ViewHolderItem(View v) {
            super(v);

            container = (LinearLayout) v.findViewById(R.id.container);

            poster = (ImageView) v.findViewById(R.id.poster);

            container =setOnClickListener(this); /// this line must include
        }

        @Override
        public void onClick(View v) {
            int id = v.getId();

            if (id == R.id.container) {
               if (myAdapterListener != null) {
    myAdapterListener.onContainerClick(v,getAdapterPosition());
                }
            }
        }
    }

Use it like this in your fragment/Activity

mAdapter = new MyAdapter(getApplicationContext() , data, new MyAdapter.MyAdapterListener() {
                    @Override
                    public void onContainerClick(View v, int position) {
                        Log.d(TAG, "iconTextViewOnClick at position "+position);
                    }

                });
mRecycler.setAdapter(mAdapter);



回答4:


I thing this is work for you

Add in you adapter

    public interface ClickEvent {
        void clickEventItem(int position,String value);
    }

    ClickEvent clickevent;


    public void setClickEvent(ClickEvent event) {
        this.clickevent = event;
    }

   itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            clickevent.clickEventItem(position, list.get(position));
        }
    });

in your fragment set interface

adapter.setClickEvent(your class context);

implement ClickEvent intereface and generate @Override method

  @Override
  public void clickEventItem(int position,String value) {
       //write your code here
  }


来源:https://stackoverflow.com/questions/49574358/passing-values-from-recycler-adapter-to-fragment-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!