0

我有一个ListView使用网络服务填充的。我想从ListViewFor 中删除一个特定条目,我需要获取一个 ID(一个 texview 字段),它是其中的一个元素ListView并将其传递给数据库。ImageView对于需要单击以删除该条目的每个列表元素,我都有一个(红十字)。我只想在单击同一列表元素的删除图像时获取文本字段的值。我使用android:onClickxml 属性来调用函数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 为空。

4

3 回答 3

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>

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

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);
于 2012-07-16T19:36:44.663 回答
1

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

于 2012-07-16T20:03:39.033 回答
1

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

也就是说,从 ListView 中删除列表项由适配器负责,基本上您的适配器必须有一个 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() {...}

    ...
}

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

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

于 2012-07-16T21:24:06.327 回答