0

使用具有a的数组适配器来显示线性布局列表。布局有3个文本字段和一个隐藏按钮,当点击列表项时显示。我试图做的是将一个onclicklistener附加到按钮,将从数组列表/适配器中删除该行并更新数据集。我有以下代码:无法更新ArrayAdapter中的数据

public class CheckAdapter extends ArrayAdapter<Check> { 
    Context context; 
    int layoutResourceId; 
    ArrayList<Check> data = null; 

    public CheckAdapter(Context context, int resource, ArrayList<Check> objects) { 
     super(context, resource, objects); 
     this.context = context; 
     this.layoutResourceId = resource; 
     this.data = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     if(convertView == null){ 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ViewHolder(convertView.findViewById(R.id.checklistRoot)); 
      holder.checkName = (TextView) convertView.findViewById(R.id.checklistname); 
      holder.checkNumber = (TextView) convertView.findViewById(R.id.checklistnumber); 
      holder.checkTotal = (TextView) convertView.findViewById(R.id.checklisttotal); 
      holder.deleteButton = (Button) convertView.findViewById(R.id.deletecheck); 

      holder.swipeButtons(); 

      convertView.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder)convertView.getTag(); 
      holder.swipeButtons(); 
     } 

     String name = data.get(position).getName(); 
     Double total = data.get(position).getAmmount(); 
     Long number = data.get(position).getCheckNumber(); 

     holder.checkName.setText(name); 
     holder.checkNumber.setText(number.toString()); 
     holder.checkTotal.setText(total.toString()); 

     holder.deleteButton.setTag(position); 
     holder.deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Integer position = (Integer) view.getTag(); 
       Log.d("Check Adapter", "Button Clicked: " + position); 
       data.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     return convertView; 

    } 

    static class ViewHolder{ 
     TextView checkName; 
     TextView checkNumber; 
     TextView checkTotal; 
     Button deleteButton; 
     View rootView; 


     ViewHolder(View rootView) { 
      this.rootView = rootView; 
     } 

     public void swipeButtons(){ 
      rootView.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View view, MotionEvent motionEvent) { 
        deleteButton.setVisibility(View.VISIBLE); 
        return false; 
       } 
      }); 
     } 
    } 
} 

我的日志显示我有正确的位置被发送到data.remove(位置);然而,ListView似乎没有更新,数据似乎仍然存在。有什么建议么?

非常感谢!

+0

ListView listvw =(ListView)parent; listvw.invalidateViews(); – 2014-10-02 05:36:12

+0

你可以使用接口并在arrayadapter构造函数中传递它的实例。在deletebutton clicklisterner中,您可以调用此接口并向活动发送消息,在活动中,您可以在adapater实例上调用notifyDataSetChanged()。 – 2014-10-02 05:59:12

回答

5

您也可以尝试使用getView方法本身提供的位置值。 也从getView方法中删除行holder.deleteButton.setTag(position);

所以你的代码会像下面:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     // --- Your other code ---// 


     holder.deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       data.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     return convertView; 

    } 

希望这会帮助你。

+1

这工作!我猜data.remove(整数)而不是int是罪魁祸首。非常感谢。 – 2014-10-02 06:01:30

+0

欢迎! @BrentAureli – AndyN 2014-10-02 06:04:48

+0

@ User22791太棒了! – Piyush 2014-10-02 06:15:43