如何使用自定义适配器从listView中删除行

时间:2015-01-29 08:30:49

标签: android listview android-listview

我有ListView与cusomised适配器扩展BaseAdapter。 listview项目布局包含(textView,Checkbox和imageView)。

要做的是,单击图像视图时,应从listView中删除包含此图像视图的行。

对于一个例子,如果listView包含6个项目,并且用户在listView中打开第4个项目的imageView,则应该从列表视图中删除第4行, 因此,lisview应该包含5个项目,依此类推。

我尝试的是,在getView()方法"发布在"在Baseadapter中,我创建了imageview的onClickListener,它如下:

iv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            parent.removeView(convertView);
            notifyDataSetChanged();
        }
    });

问题是,在上面提到的监听器中,我必须将converView设置为final,并且应该将convertView赋值给它以初始化它,如果它为null,那么它不能是final,

现在我不知道如何解决这个问题,我不确定我的方式是否是从listView中删除项目的正确方法

getView

@Override
public View getView(int position, final View convertView, final ViewGroup parent) {
    // TODO Auto-generated method stub


    if (convertView == null) {
        LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = layoutinflater.inflate(R.layout.list_items_layout, null);// here convertView cannot be final
    }

    final TextView tv = (TextView) convertView.findViewById(R.id.tvlist_topic);
    final CheckBox cb = (CheckBox) convertView.findViewById(R.id.cbList_hook);
    final ImageView iv = (ImageView) convertView.findViewById(R.id.ivList_delete);

    tv.setText(this.arrayList.get(position));

    iv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            parent.removeView(convertView);
            notifyDataSetChanged();
        }
    });

    return convertView;
}

5 个答案:

答案 0 :(得分:1)

要实现它,您必须从数据集中删除元素并调用notifydatasetchanged,以重新安排重写ListView的行。您需要的是要删除的行的位置。你可以做的是用位置标记iv对象,并在按下它时检索标记:

iv.setTag(position);
iv.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (v.getTag() != null) {  
           arrayList.remove((int) v.getTag);
           notifyDataSetChanged();
        }
    }
});

答案 1 :(得分:0)

要更新视图,您应该通过位置从ArrayList中删除元素,然后调用notifydataSetChanged()

答案 2 :(得分:0)

问题是您正在尝试销毁视图,但是您应该删除ArrayList中创建ListView中每个元素的条目。

 //assuming that the data source for your listview is called "arrayList"
 //this code should be in your getView() method

    //set the position as a tag on your view
    iv.setTag(position);

    iv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //retrieve the tag
                int posToRemove= (int) v.getTag();
                //remove position from your source array
                arrayList.remove(posToRemove);
                //let your adapter know that there was a change in the dataset
                notifyDataSetChanged();
            }
        });

答案 3 :(得分:0)

你怎么做convertViewparent最终?我有一个类似的用例,在我的适配器(扩展ArrayAdapter)中我有

@Override
public View getView(int position, View convertView, ViewGroup parent) {
}

Eclipse是否提示您添加final修饰符?

编辑:这就是我在做的方式 - 希望这是正确的方式,它对我有用!

监听

public void onClick(DialogInterface dialog, int id) {
  doDelete();
}

ListActivity

private void doDelete() {
  Item[] newList = new Item[_itemList.length -1];
  // ... update the Array
  itemList= newList ;
  setListAdapter(new YourAdapter(this, R.layout.list_item, _itemList));
}

答案 4 :(得分:0)

从适配器中删除数据,然后调用notifyDataSetChanged()。列表将刷新。不要从列表中删除视图。