使用 ArrayAdapter 的 ListView 中的按钮
Posted
技术标签:
【中文标题】使用 ArrayAdapter 的 ListView 中的按钮【英文标题】:Button in ListView using ArrayAdapter 【发布时间】:2012-12-18 17:20:05 【问题描述】:我有一个使用 POJO 类填充的 ArrayAdapter。列表视图包含 2 个布局。 1 用于菜单项,1 用于类别。带分隔符的 Listview 很好。
后来我尝试在每个菜单项行中添加一个按钮来编辑其中的详细信息。在这里,当我尝试获取单击按钮的行的位置时,我遇到了问题。
我尝试使用日志显示位置。 1.如果行数较少,不需要滚动。日志显示正确的位置。 2. 如果我有更多的行进入页面,那么我的日志中的位置不正确。
能否请您指导我的代码需要更正的那一行? 提前致谢
public class ConfirmAdapter extends ArrayAdapter<POJO_ConfirmMenu>
private ArrayList<POJO_ConfirmMenu> ticketItem;
Context context;
LayoutInflater vi;
public ConfirmAdapter(Context context ,ArrayList<POJO_ConfirmMenu> menu)
super(context, 0, menu );
this.ticketItem = new ArrayList<POJO_ConfirmMenu>();
this.ticketItem.addAll(menu);
this.context =context;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
private class ViewHolder
TextView ticketItem;
TextView type;
TextView quantity;
Button cancel,edit;
public boolean isEnabled(int position)
if (ticketItem.get(position).getItemType().equals("menucategory"))
return false;
return true;
public int getItemViewType(int position)
if (ticketItem.get(position).getItemType().equals("menucategory"))
return 0;
return 1;
public int getViewTypeCount()
return 2;
public View getView(final int position, View convertView, ViewGroup parent)
ViewHolder holder;
int type = getItemViewType(position);
if (convertView == null)
holder = new ViewHolder();
switch (type)
case 0:
convertView = vi.inflate(R.layout.group, null);
holder.ticketItem = (TextView) convertView.findViewById(R.id.tvGroup);
convertView.setBackgroundColor(Color.RED);
break;
case 1:
convertView = vi.inflate(R.layout.confirmitem, null);
holder.ticketItem = (TextView) convertView.findViewById(R.id.tvConfirmItem);
holder.quantity = (TextView) convertView.findViewById(R.id.tvQuantity);
holder.cancel = (Button) convertView.findViewById(R.id.bCancel);
holder.edit = (Button) convertView.findViewById(R.id.bEdit);
holder.edit.setTag(position);
// Edit button
holder.edit.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
int pos = (Integer) v.getTag();
Log.i("ConfirmAdapter ","Order Edit @ position : " + pos);
);
break;
convertView.setTag(holder);
else
holder = (ViewHolder) convertView.getTag();
switch (type)
case 0:
holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getCategoryName()) ;
convertView.setBackgroundColor(Color.RED);
break;
case 1:
holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getName());
holder.quantity.setText(Integer.toString(ticketItem.get(position).getTicketItemObject().getItemCount()));
break;
return convertView;
【问题讨论】:
【参考方案1】:在getView()
方法中,您必须为您的按钮设置标签,当您点击按钮时,获取整数内的标签,它将返回您点击按钮的正确位置,如下所示。
else
holder = (ViewHolder) convertView.getTag();
holder.edit.setTag(position); //to get the orignal position later in onClick() of button
holder.edit.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
int pos = (Integer) v.getTag(); //the real and updated position
Log.i("ConfirmAdapter ","Order Edit @ position : " + pos);
);
更新
注意:获取转换视图标签后,将标签设置为您的按钮并处理点击。
What is the main purpose of setTag() getTag() methods of View?
【讨论】:
罗宾。我使用了 Set 和 getTag 但我仍然得到错误的位置。我已经更新了问题中的代码 如果我将 setTag 放在 convertView.getTag() 之后。我在 holder.edit.setTag(position); 行中收到错误(NullPointerException) Robin.. 我已经粘贴了链接中的代码。当控件到达行 holder.edit.setTag(position); 时出现错误(第 366 行).. 我在链接 pastie.org/5620823 中添加了错误日志 正如你所说.. 它有效 :) 现在我明白为什么它以前不起作用.. 感谢您的知识/时间/奉献以上是关于使用 ArrayAdapter 的 ListView 中的按钮的主要内容,如果未能解决你的问题,请参考以下文章
ListView:setItemChecked 仅适用于标准 ArrayAdapter - 在使用自定义 ArrayAdapter 时不起作用?
使用带有 ArrayAdapter<Objects> 而不是 ArrayAdapter<Strings> 的 Android AutoCompleteTextView