更改 RecyclerView 中 Item Click 上 TextView 的值?

Change value of TextView on Item Click inside a RecyclerView?

我正在开发一个用于餐厅管理的应用程序,但卡在需要在 RecyclerView 中单击项目时更新 textview(在 RecyclerView 之外)的值。

这是我的适配器,考虑在这个适配器外部设置一个 textView,并在 Plus 和 Minus ImageViews 的项目点击上设置一个值,如下面的代码所示...

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> {

ArrayList<MenuItem> MenuDetailList;
Typeface font;

public MyRecyclerAdapter(ArrayList<MenuItem> MenuDetailArray){
    this.MenuDetailList = MenuDetailArray;
}

@Override
public MyRecyclerAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_menu_row_item, null);
    return new MyHolder(v);
}

@Override
public void onBindViewHolder(final MyRecyclerAdapter.MyHolder holder, final int position) {

    holder.txtSubMenuTitle.setText(MenuDetailList.get(position).getTitle());
    holder.txtSubMenuPrice.setText(MenuDetailList.get(position).getPrice());
    holder.txtSubMenuCount.setText(""+MenuDetailList.get(position).getItemCount());
    setCustomTypeface(holder.txtSubMenuTitle, font);
    setCustomTypeface(holder.txtSubMenuPrice,font);

    holder.ImgViewSubMenuMinus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //holder.OrderCount = Integer.parseInt(holder.txtSubMenuCount.getText().toString());
            int ItemCount = MenuDetailList.get(position).getItemCount();
            if (ItemCount > 0) {
                ItemCount = ItemCount - 1;
                holder.txtSubMenuCount.setText("" + ItemCount);
                MenuDetailList.get(position).setItemCount(ItemCount);
                notifyDataSetChanged();
            }
        }
    });

    holder.ImgViewSubMenuPlus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //holder.OrderCount = Integer.parseInt(holder.txtSubMenuCount.getText().toString());

            int ItemCount = MenuDetailList.get(position).getItemCount();
            if (ItemCount < 20) {
                ItemCount = ItemCount + 1;
                holder.txtSubMenuCount.setText("" + ItemCount);
                MenuDetailList.get(position).setItemCount(ItemCount);
                notifyDataSetChanged();
            }
    });
}

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

public static class MyHolder extends RecyclerView.ViewHolder {
    TextView txtSubMenuTitle;
    TextView txtSubMenuPrice;
    ImageView ImgViewSubMenuMinus;
    ImageView ImgViewSubMenuPlus;
    TextView txtSubMenuCount;

    private MyHolder(View row) {
        super(row);
        this.txtSubMenuTitle = (TextView) row.findViewById(R.id.list_txt_sub_menu_title);
        this.txtSubMenuPrice = (TextView) row.findViewById(R.id.list_txt_sub_menu_price);
        this.txtSubMenuCount = (TextView) row.findViewById(R.id.list_txt_sub_menu_count);
        this.ImgViewSubMenuMinus = (ImageView) row.findViewById(R.id.list_img_sub_menu_minus);
        this.ImgViewSubMenuPlus = (ImageView) row.findViewById(R.id.list_img_sub_menu_plus);
    }
}
private void setCustomTypeface(TextView textView, Typeface font) {
    textView.setTypeface(font);
}
}

提前致谢...

设置标签 onCreateViewHolder() 这是你的支架:

MyHolder holder = new MyHolder(v);
v.setTag(holder);
return holder;

现在您可以在点击监听器中获取数据:

MyHolder holder = (MyHolder)v.getTag();

1.In 你的 activity 初始化 TextView

TextView myTextview = (TextView) findViewByItd(R.id.textView);

2.Add Adapter 的构造函数中的参数 TextView

3.Pass TextView 到适配器

MyRecyclerAdapter adapter = new MyRecyclerAdapter(menu, myTextView);

4.Manipulate随心所欲

ArrayList<MenuItem> MenuDetailList;
Typeface font;
TextView mTextView;

public MyRecyclerAdapter(ArrayList<MenuItem> MenuDetailArray, TextView tv){
     this.MenuDetailList = MenuDetailArray;
     mTextView = tv;
}

mTextView.setText("Eat more pizza");

一个愚蠢的解决方案是在 activity 中声明时尝试将文本视图传递给适配器。当然text view应该在传递之前定义好。因此,您必须向适配器添加一个类型为 TextView 的新成员,并且您必须将类型为 TextView 的参数添加到你的适配器构造函数..... 我希望这个技巧能有所帮助。

在这种情况下你需要使用接口的概念。让我们举个例子。假设 textview 在 activity 中,适配器实例在其中创建,适配器设置为回收视图

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> {

        ArrayList<MenuItem> MenuDetailList;
        Typeface font;
        MyInterface myinterface;

        public MyRecyclerAdapter(ArrayList<MenuItem> MenuDetailArray, MyInterface myinterface){
            this.MenuDetailList = MenuDetailArray;
            this.myinterface = myinterface;
        }

现在您需要在您的 holder 中添加 onClickholder 方法:

public static class MyHolder extends RecyclerView.ViewHolder {
    TextView txtSubMenuTitle;
    TextView txtSubMenuPrice;
    ImageView ImgViewSubMenuMinus;
    ImageView ImgViewSubMenuPlus;
    TextView txtSubMenuCount;
    private final View holderView;

    private MyHolder(View row) {
        super(row);
        // save this view
        holderView = row;
        this.txtSubMenuTitle = (TextView) row.findViewById(R.id.list_txt_sub_menu_title);
        this.txtSubMenuPrice = (TextView) row.findViewById(R.id.list_txt_sub_menu_price);
        this.txtSubMenuCount = (TextView) row.findViewById(R.id.list_txt_sub_menu_count);
        this.ImgViewSubMenuMinus = (ImageView) row.findViewById(R.id.list_img_sub_menu_minus);
        this.ImgViewSubMenuPlus = (ImageView) row.findViewById(R.id.list_img_sub_menu_plus);
    }
}

现在在您的 onBindViewHolder 中,在此方法上设置 clicklistener:

holder.onClickHolder(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        myinterface.myMethod("I want to return string");
      }
    });

现在您的 activity 必须实现此接口。因此它会在你的 activity 中调用 myMethod。现在你可以在 activity 中做任何你想做的事了。在界面中添加任意数量的方法并享受回调。 这解释了接口的强大功能。

接受的答案是 hack。那不是正确的做法。您可以创建一个界面来将您的点击事件传递给您的 activity.

在您的适配器中创建此接口 class。

public interface OnItemClickListener {
  void onItemClick(View view, int position, String tag);
}

然后在 class 级别的适配器上创建一个实例。

private OnItemClickListener mItemClickListener;

以及设置此侦听器的方法。

public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
   this.mItemClickListener = mItemClickListener;
}

现在在您的 activity 中执行此操作。

AdapterClassName.OnItemClickListener onItemClickListener = new AdapterClassName.OnItemClickListener() {
     @Override
     public void onItemClick(View view, int position, String tag) {

    //Do whatever you want to do on item click in your activity

   }
}
mAdapter.setOnItemClickListener(onItemClickListener);
//mAdapter is your adapter instance

然后最后一件事是在您的查看器上设置点击侦听器。我假设您的取景器仅存在于适配器 class 中。

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

  public ViewHolder(View itemView) {
    RelativeLayout mainHolder = (RelativeLayout) itemView.findViewById(R.id.main_holder);
    mainHolder.setOnClickListener(this);
  }

   @Override
    public void onClick(View v) {
      if(mItemClickListener != null) {
        mItemClickListener.onItemClick(itemView, getAdapterPosition(), itemView.getText().toString());
      }
    }


}