使用 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 中的按钮的主要内容,如果未能解决你的问题,请参考以下文章

ArrayAdapter - 使用多个搜索词过滤

ArrayAdapter的使用

ListView:setItemChecked 仅适用于标准 ArrayAdapter - 在使用自定义 ArrayAdapter 时不起作用?

Android之ArrayAdapter使用

使用带有 ArrayAdapter<Objects> 而不是 ArrayAdapter<Strings> 的 Android AutoCompleteTextView

OnItemClickListener 为 ListView 使用 ArrayAdapter