将值从recycleler adapter传递到android中的fragment

时间:2018-03-30 12:22:17

标签: android android-fragments android-adapter

我是一个回收器适配器,我在适配器中添加了setOnClickListener项目。代码如下:

@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();
                }
            }
        });  

这里是片段代码,用于处理从适配器到片段的值。

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();
            }
        });

    }  

我试图传递pos并将pos的值从适配器传递到片段。但我的代码不起作用。我该如何解决?

4 个答案:

答案 0 :(得分:3)

制作界面以将click事件处理到recyclerview中.. 用于处理点击事件的代码如下。

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);
        }
    });
 }

然后将适配器绑定到代码下面的RecyclerView调用..

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();
    }
});

答案 1 :(得分:3)

  

在适配器中创建一个界面

public interface OnItemClickListener {
  void onItemClicked(int position, Object object);
}
  适配器调用中的

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

private OnItemClickListener onItemClickListener; // Global scope 
  

在构造函数调用中:

this.onItemClickListener = onItemClickListener;
  

点击您的商品:

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

答案 2 :(得分:1)

请使用如下界面,将其传递到适配器的构造函数中,然后在您的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());
                }
            }
        }
    }

在片段/活动

中使用它
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);

答案 3 :(得分:0)

我认为这对你有用

添加适配器

    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));
        }
    });

在你的片段集接口

adapter.setClickEvent(你的类上下文);

实现ClickEvent intereface并生成@Override方法

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