Android - 无法从列表项中增加或减少值
Posted
技术标签:
【中文标题】Android - 无法从列表项中增加或减少值【英文标题】:Android - Unable to increment or decrement value from list item 【发布时间】:2016-05-05 19:56:41 【问题描述】:大家好,我正在使用自定义列表视图从服务器获取数据并显示在列表视图中。我能够获取数据并在列表视图中显示它,但我不知道在列表项中实现按钮的单击事件。有两个按钮可以增加和减少数量。我的 clicklistener 正在工作,但它的工作方式不正确。请帮我纠正这个问题。我确实在堆栈溢出中搜索了太多帖子但无法理解它......
这是我的适配器类
private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
private List<FeedItem> filteredfeedItems;
ImageView plus;
ImageView minus;
int qty = 0;
String result;
String formattedDate;
int id;
public FeedListAdapter(Activity activity, List<FeedItem> feedItems)
this.activity = activity;
this.feedItems = feedItems;
this.filteredfeedItems = feedItems;
@Override
public int getCount()
return filteredfeedItems.size();
@Override
public Object getItem(int position)
return filteredfeedItems.get(position);
@Override
public long getItemId(int position)
return position;
@Override
public View getView(int position, View convertView, ViewGroup parent)
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.feed_item, null);
FeedItem item = filteredfeedItems.get(position);
id = item.getId();
convertView.setTag(Integer.valueOf(id));
TextView date = (TextView) convertView.findViewById(R.id.name);
TextView initiator = (TextView) convertView
.findViewById(R.id.timestamp4);
TextView assignTo = (TextView) convertView.findViewById(R.id.timestamp);
final TextView location = (TextView) convertView.findViewById(R.id.timestamp2);
//TextView category = (TextView) convertView.findViewById(R.id.category);
data.setText(item.getData();
price
.setText(item.getPrice());
description.setText(item.getDescription());
plus = (ImageView) convertView.findViewById(R.id.btnAddToCart1);
plus.setTag(item.getId());
plus.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
int position = (Integer) view.getTag();
//convertView.setTag(Integer.valueOf(id));
FeedItem item = filteredfeedItems.get(position);
item.quantity++;
location.setText(String.valueOf(item.quantity));
);
minus = (ImageView) convertView.findViewById(R.id.btnAddToCart5);
minus.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
Integer taggedPosition = (Integer) view.getTag();
if (qty>0)
//minus.setImageResource(R.drawable.minus_pressed);
qty--;
location.setText(String.valueOf(qty));
else
qty = 0;
);
return convertView;
这是我的 FeedItem 类:
public class FeedItem
int quantity = 0;
int id;
public FeedItem(int id,int quantity)
super();
this.id = id;
this.quantity = quantity;
public int getId()
return id;
public void setId(int id)
this.id = id;
public int getQuantity()
return quantity;
public void setQuantity(int quantity)
this.quantity = quantity;
【问题讨论】:
它以什么“方式”工作?什么是“正确的方式”? 因为我已经在全局范围内声明了这个值,所以它也会增加并显示在其他列表项中。我不知道如何创建接口或使用 arraylist 以便只更新特定的列表项值。 以上代码中的data
、price
和description
是什么?
【参考方案1】:
最后我自己解决了我的答案。只需要实现接口并在片段类中调用..
更新的适配器类
public class FeedListAdapter extends RecyclerView.Adapter<FeedListAdapter.ViewHolder>
private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
private List<FeedItem> filteredfeedItems;
ImageView plus;
ImageView minus;
String result;
String formattedDate;
int id;
private View.OnClickListener onAddNum;
private View.OnClickListener onSubNum;
public FeedListAdapter(Activity activity, List<FeedItem> feedItems)
this.activity = activity;
this.feedItems = feedItems;
this.filteredfeedItems = feedItems;
inflater = ( LayoutInflater )activity.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// create interface method
public void setOnAddNum(View.OnClickListener onAddNum)
this.onAddNum = onAddNum;
public void setOnSubNum(View.OnClickListener onSubNum)
this.onSubNum = onSubNum;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
@Override
public void onBindViewHolder(final ViewHolder holder, int position)
FeedItem item =(FeedItem)filteredfeedItems.get(position);
holder.date.setText(item.getObservation());
holder.initiator
.setText(item.getObservation());
holder.location.setText(String.valueOf(item.getNum())+"");
holder.assignTo.setText(item.getSummary());
// set tag to know which button you clicked'
holder.plus.setTag(position);
holder.plus.setFocusable(true);
holder.plus.setClickable(true);
// set callback interface ,
holder.plus.setOnClickListener(onAddNum);
holder.minus.setTag(position);
holder.minus.setOnClickListener(onSubNum);
@Override
public int getItemCount()
return filteredfeedItems.size();
public long getItemId(int position)
return position;
class ViewHolder extends RecyclerView.ViewHolder
ImageView plus;
ImageView minus;
TextView date;
TextView initiator;
TextView assignTo;
TextView location;
public ViewHolder(View vi)
super(vi);
date = (TextView) vi.findViewById(R.id.name);
initiator = (TextView) vi
.findViewById(R.id.timestamp4);
assignTo = (TextView) vi.findViewById(R.id.timestamp);
location = (TextView) vi.findViewById(R.id.timestamp2);
plus = (ImageView) vi.findViewById(R.id.btnAddToCart1);
minus = (ImageView) vi.findViewById(R.id.btnAddToCart5);
现在在活动类中为按钮事件实现 View.OnClickListener。
public class MyFragment extends Fragment implements View.OnClickListener
@Override
public void onClick(View view)
Object tag = view.getTag();
switch (view.getId())
case R.id.item_btn_add: // click add buttons number , performs corresponding processing
if (tag != null && tag instanceof Integer)
int position = (Integer) tag;
Your pojo class
int num =feedItems.get(position).getNum();
num++;
feedItems.get(position).setNum(num);
adapter.notifyDataSetChanged();
break;
case R.id.btnAddToCart5:
if (tag != null && tag instanceof Integer)
int position = (Integer) tag;
int num =feedItems.get(position).getNum();
if (num>0)
num--;
feedItems.get(position).setNum(num);
listAdapter.notifyDataSetChanged();
else
num= 0;
listAdapter.notifyDataSetChanged();
break;
享受编码
【讨论】:
【参考方案2】:目前,每个活动都有 1 个变量来存储数量。如果您想按项目存储它,您应该添加:int qty;
成为FeedItem
类的成员。
删除:
convertView.setTag(Integer.valueOf(id));
与 plus 类似,您需要添加:
minus.setTag(item.getId());
然后你需要使用item.qty
,而不是qty++;
,或者基本上在onClick的每个地方而不是qty
:
Integer id = view.getTag();
FeedItem item = filteredfeedItems.get(id);
item.qty++;
location.setText(String.valueOf(item.qty));
更新:
我认为您将 FeedItem.id 与位置混合在一起。如果您不更改列表中项目的顺序/数量,那么您可以始终使用位置。而不是:
minus.setTag(item.getId());
尝试:
minus.setTag(position);
加号也一样
【讨论】:
好的,我将作为成员添加.. 请您写一点代码,以便我理解。我是 android 新手,对我来说这些东西有点奇怪.. 谢谢。 如果我使用整数 id = view.getTag();该应用程序正在崩溃,如果我没有使用该行,那么它的工作但其他列表值也在更新..我也使用了 notifyDataSetChanged() 但没有工作。 试试:Integer id = view.getParent().getTag();
我试过了,但现在的问题是我的项目位置错误..像 o,1,2,5,7 等等..其他位置值也在更新..如果你想要我可以更新我的适配器代码。
我希望我是对的:+ 有效,但是 - 不是吗?查看我的最新更新【参考方案3】:
像这样创建一个 MyListItem 类:
public class MyListItem
private int qty;
private int itemId;
public void setQty(int qty)
this.qty=qty;
public void setQty(int qty)
this.qty=qty;
public int getItemId()
return this.itemId;
public int getQty()
return this.qty;
public MyListItem(int qty,int itemId)
this.qty=qty;
this.itemId=itemId;
当您加载项目时,将所有项目初始化为 MyListItem。
你的听众应该改变对象的数量值。
现在制作一个 MyListItem
的数组列表 NOT AN ARRAY 因为你不知道你当时有多少项目
希望对你有所帮助
【讨论】:
以上是关于Android - 无法从列表项中增加或减少值的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio - Gradle 实现 (...) exclude ... 不起作用(无法从依赖项中排除组)