从ListView中删除列表元素

时间:2012-07-16 19:32:27

标签: android android-listview

我有一个使用网络服务填充的ListView。我想删除ListView中的特定条目。因为我需要获取ID(texview字段),ListView中的一个元素并将其传递给数据库。我为每个列表元素都有一个ImageView(一个红色十字),需要点击才能删除该条目。我想要的是在单击同一列表元素的删除图像时获取文本字段的值。我使用android:onClick xml属性来调用函数deleteEntry。但我不知道如何获得与删除图像位于同一列表元素中的ID的特定值。我怎么能这样做?

修改

这是我的适配器:

public class MyCustomAdapterWorkEntry extends ArrayAdapter<ViewWorkEntryBean> {


Context context;
int layoutResourceId;
ViewWorkEntryBean currentMRB;
Vector<ViewWorkEntryBean> data;

public MyCustomAdapterWorkEntry(Context context, int layoutResourceId, Vector<ViewWorkEntryBean> data) 
{
    super(context,layoutResourceId,data);
    this.layoutResourceId = layoutResourceId;
    this.context=context;
    this.data = data;
}

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

    View row = convertView;
    MyStringReaderHolder holder;


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

        holder= new MyStringReaderHolder();

        holder.workLogID = (TextView)row.findViewById(R.id.worklog_id);

        holder.delete = (ImageView) row.findViewById(R.id.delete);

        row.setTag(holder);
    }
    else
    {
        holder=(MyStringReaderHolder) row.getTag();
    }


    ViewWorkEntryBean mrb = data.elementAt(position);

    holder.workLogID.setText(mrb.workLogID);

    holder.delete.setTag(mrb.workLogID);
    return row;
}

static class MyStringReaderHolder
{
TextView workLogID;
ImageView delete;

}
}

这是删除功能:

public void DeleteWorkEntryClick(View v) {


    String workLogID = null;        

    workLogID = (String) v.getTag();


    deleteWorkEntry(workLogID);

}

它仍然不起作用! workLogID为空。

3 个答案:

答案 0 :(得分:1)

  

我想要的是在单击同一列表元素的删除图像时获取文本字段的值。

发布一些相关代码会有所帮助,但这是一种通用方法。

我们假设您的行布局如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

我们可以为Button设置一个OnClickListener来读取TextView文本,如下所示:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        LinearLayout parent = (LinearLayout) view.getParent();
        TextView textView = (TextView) parent.getChildAt(0);
        String text = textView.getText().toString();
        // text has what you want
    }
});

如果您想要更加面向未来但劳动密​​集型的方法,请使用:

TextView text = (TextView) parent.findViewById(R.id.text);

答案 1 :(得分:1)

使用setTag()将您需要传递给函数的特定ID值设置为列表中每个“X”按钮的标记值。这样,当点击的视图传递给您的onClick()方法时,您可以调用view.getTag()再次获取该数字并将其传递给您的数据库函数。

答案 2 :(得分:1)

我假设你使用适配器来构建ListView,无论是标准版还是自定义版, 这并不重要。

也就是说,从ListView中删除列表项是负责适配器,基本上是你的 adapter必须有一个removeItem方法,该方法将从列表中删除该项并通知数据集已更改。

我不知道代码的结构,但它应该是这样的:

public class YourAdapter extends BaseAdapter {

...

List<YourDataClass> list;

...

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

...

public void removeItem(YourDataClass instance) {
    list.remove(instance);
    notifyDataSetChanged();
}

...
}

public class YourActivity extends Activity {

...

private ListView listView;
private YourAdapter yourAdapter;

...

private final OnItemClickListener listItemOnClickListener = new OnItemClickListener()     {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            YourDataClass itemToRemove = yourAdapter.getItem(position);
            yourAdapter.removeItem(itemToRemove);
    }
};

...

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    list.setOnItemClickListener(listItemOnClickListener);
    ...
}

...

}

关键是yourDataClass必须覆盖:

public YourDataClass {

    ...

    @Override
    public boolean equals(Object obj) {...}

    @Override
    public int hashCode() {...}

    ...
}

在不知道您的代码的情况下,我认为您的代码以某种方式构建代码,希望如此 会有所帮助!

PS。我使用项目单击侦听器构建了示例,如果您希望列表项的子视图可单击并执行delition,则需要将逻辑移动到适配器中的getView方法。