我有一个使用网络服务填充的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为空。
答案 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方法。