2012-07-16 97 views
0

我有一个ListView它是使用Web服务填充的。我想从ListView中删除一个特定的条目为此,我需要从ListView中获取ID(texview字段)中的一个元素,并将其传递到数据库。我有一个ImageView(红色十字),每个列表元素需要点击以删除该条目。我想要的是当我点击同一列表元素的删除图像时,获取文本字段的值。我使用了 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为空。

回答

1

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

+0

我在哪里设置标签? – Harsh 2012-07-16 21:05:17

+0

无论你正在将列表数据映射到视图。通常在ListAdapter的'getView()'方法中。 – Devunwired 2012-07-16 21:11:22

+0

它不起作用!我上传了代码。你能检查吗? – Harsh 2012-07-16 21:46:27

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> 

我们可以设置一个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); 
+0

我上传了代码。你能告诉我现在有什么问题吗? – Harsh 2012-07-16 21:47:05

+1

ListView中的行是否显示正确的ID? – Sam 2012-07-16 22:05:39

+0

他们不是!谢谢你指出。它现在有效。 – Harsh 2012-07-17 14:33:39

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() {...} 

    ... 
} 

不知道你的代码我假设你以某种方式构建你的代码,希望它对 有帮助!

ps。我使用项目点击侦听器构建了这个示例,如果您想让列表项目的子视图可点击并执行删除,那么您需要将逻辑移至适配器中的getView方法。

+0

我不想直接从列表视图中删除项目。我只是想获得该ID的价值并刷新页面以获得新列表 – Harsh 2012-07-16 21:48:03

+0

没有得到你想要做的事情... – gwa 2012-07-16 21:48:48