更改 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());
}
}
}
我正在开发一个用于餐厅管理的应用程序,但卡在需要在 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());
}
}
}