【问题标题】:Getting the content of a recyclerView item in the Activity获取Activity中一个recyclerView项的内容
【发布时间】:2017-09-05 19:52:44
【问题描述】:

在我的代码中,我有一个正在填充数据的 recyclerView。在每个项目上,我都有一个单选按钮和几个 TextView。如何在我的 Activity 中访问被点击项目的 TextViews 的内容?

这是我的适配器:

public class SelectCategoryAdapter extends RecyclerView.Adapter<SelectCategoryAdapter.MyViewHolder> {

    private Context mContext;
    private List<Category2> categoryList;
    private Category2 category;
    private RadioButton radioButton;
    int mCheckedPositon = -1;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, count, nameCategory;
        public RadioButton radioButton;

        public MyViewHolder(View view) {
            super(view);
            nameCategory = (TextView) view.findViewById(R.id.edittext_category);
            count = (TextView) view.findViewById(R.id.count);
            radioButton = (RadioButton) view.findViewById(R.id.radio1);
            //overflow = (ImageView) view.findViewById(R.id.overflow);
        }
    }


    public SelectCategoryAdapter(Context mContext, List<Category2> categoryList) {
        this.mContext = mContext;
        this.categoryList = categoryList;
    }

    @Override
    public SelectCategoryAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.adapter_select_category, parent, false);

        return new SelectCategoryAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final SelectCategoryAdapter.MyViewHolder holder, final int position) {
        category = categoryList.get(position);
        holder.nameCategory.setText(category.getName());
        if (category.getTasks() < 10){
            holder.count.setText(" " + Integer.toString(category.getTasks()) + " ");
        } else {
            holder.count.setText(Integer.toString(category.getTasks()));
        }

        holder.radioButton.setOnCheckedChangeListener(null);
        holder.radioButton.setChecked(position == mCheckedPositon);
        holder.radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                mCheckedPositon = position;
                notifyDataSetChanged();
            }
        });

    }


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

}

我希望能够在我的 Activity 中看到“nameCategory”的内容。但只有与用户刚刚单击的项目相关的一项。

【问题讨论】:

  • 您能否提供您的活动代码。或者只是您想从中查看“nameCategory”内容的 sn-p 代码。此外,最好提供在项目上设置 OnClickListener() 的 sn-p 代码。

标签: android android-recyclerview onitemclicklistener


【解决方案1】:
public class SelectCategoryAdapter extends RecyclerView.Adapter<SelectCategoryAdapter.MyViewHolder> {

     MyCallBack myCallback;

     public interface MyCallBack{
         void listenerMethod(String textViewvalue);
     }

     public SelectCategoryAdapter(Context context, ArrayList<TaskComments> items, MyCallBack myCallBack) {
         this.context = context;
         this.items = items;
         this.myCallBack = myCallBack;
     }

     @Override
     public void onBindViewHolder(final SelectCategoryAdapter.MyViewHolder holder, final int position) {

         category = categoryList.get(position);
         holder.nameCategory.setText(category.getName());
         if (category.getTasks() < 10){
             holder.count.setText(" " + Integer.toString(category.getTasks()) + " ");
         } else {

          holder.count.setText(Integer.toString(category.getTasks()));
         }

         holder.radioButton.setOnCheckedChangeListener(null);
         holder.radioButton.setChecked(position == mCheckedPositon);
         holder.radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 myCallBack.listenerMethod("Your data you want to transfer")
                 mCheckedPositon = position;
                 notifyDataSetChanged();
             }
         });

     }


}

并且在您的活动中,您可以实现此接口以像这样使用它。

MyActivity.class

public class MyActivity extends AppCompatActivity implements 
   SelectCategoryAdapter. MyCallBack{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SelectCategoryAdapter adapter = new SelectCategoryAdapter(this, yourData, this);
    }




     public void listenerMethod(String textViewValue){
         Toast.makeText(this, "You have " + textViewValue +" Access in the activity now")

     }
}

【讨论】:

  • 感谢您的回答,但如果我这样做了,在活动中调用适配器时,我会在第三个参数中出现错误。因为我通过了这个并且它期待 myCallBack。我该怎么办?
  • 你在活动中实现了 myCallBack 吗??
  • 我该怎么办?把接口的代码放在activity里面和adapter里面?
  • 正如我的代码中提到的,您必须实现接口,然后您将覆盖活动内部的 listenerMethod,因此当您在适配器构造函数中使用 this 时,它不会出错。参考 MyActivity.class 代码。
  • 我收到了这个错误: void com.construct.v2.adapters.categories.SelectCategoryAdapter$MyCallBack.listenerMethod(java.lang.String)' 在空对象引用和 category.getName() 上上面用了几行,那里不为空。
【解决方案2】:

您可以添加一个接口来在您的 Activity 和 Adapter 之间进行通信。

public interface SelectCategoryListener {
    void categorySelected(Category2 category);
}

然后您可以将 SelectCategoryListener 添加到 Adapter 的构造函数并将其设置为全局变量

public SelectCategoryAdapter(Context mContext, List<Category2> categoryList, 
                             SelectCategoryListener listener) {
    this.mContext = mContext;
    this.categoryList = categoryList;
    this.listener = listener
}

现在在您设置 onClickListener 的 onBindViewHolder 中,您应该能够使用侦听器在 Activity 和 Adapter 之间进行通信。

【讨论】:

  • 感谢您的回答。现在,如何在 Activity 中调用适配器以及如何访问从适配器发送到 Activity 的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2015-08-10
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多