如何从ListView获取行的行ID,其中包含可单击的项目?

时间:2011-03-16 09:08:30

标签: android listview

在我为行的布局XML添加按钮之前,在单击列表项时,在回调onListItemClick()中返回行ID。现在我在列表行布局中添加了一个按钮,此回调不再起作用。我读到这是正常的。我已经能够通过在我的列表行的布局XML文件中包含这类内容来获取文本和新按钮来引用新的回调:

<Button
    android:onClick="newCallBackFunctionName"/>

问题是我似乎无法找到一种方法来检索与按下的特定按钮所在的列表项对应的行ID号。在onListItemClick()的情况下,它作为回调的一部分传递,但在上面的例子中,只有被点击的View对象被传递回回调newCallBackFunctionName。我该怎么办?

*编辑:我的列表由SimpleCursorAdaptor填充,以防重要。

*编辑:我的列表和列表行XML布局如下:

列表:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/basic_linear_layout_v1">

<TextView 
    android:id="@+id/category_selection_page_name"
    style="@style/page_heading_v1"/>

<ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:drawSelectorOnTop="false"/>

<TextView
    android:id="@id/android:empty"
    style="@style/problem_text_v1"
    android:text="@string/search_list_empty" />

<Button
    android:id="@+id/select_category_button"
    android:textSize="20sp"
    android:layout_weight="10"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:onClick="reload"/>

行:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView android:id="@+id/category_browse_name" style="@style/basic_list_item_v1"
    android:layout_weight="1"
    android:layout_gravity="left"
    android:focusable="true"
    android:clickable="true"/>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_gravity="right">
    <Button 
        android:text="..." 
        android:id="@+id/subcategories_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:focusable="true"
        android:onClick="onSubcategoryButtonClick">
    </Button>
</LinearLayout>

2 个答案:

答案 0 :(得分:5)

您可以在适配器的getView方法中使用适当的ID或位置标记您的按钮。例如:

myButton.setTag(id);

然后在onClick处理程序中,从单击的视图中检索标记。例如:

public void newCallBackFunctionName(View v) {
    long id = (Long) v.getTag();
    // ...
}

答案 1 :(得分:2)

你必须采取一点点差异 你必须创建自己的cursorAdapter,如果它是SimpleCursorAdapter然后代码将是这样的事情

首先创建一个cursoradapter的子类,然后重写getView方法,然后为它们定义onclicklistener

public class SMSimpleCursorAdapter extends SimpleCursorAdapter{

Context context;
Activity activity;
public SMSimpleCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {
    super(context, layout, c, from, to);
    this.context=context;
    this.activity=(Activity) context;
}


@Override
public View getView(int position, View convertView, ViewGroup parent){
    View view = super.getView(position, convertView, parent);
    long id=getItemId(position);
    Button button = (Button)view.findViewById(R.id.btnDelete);
     //pass id in your handler
    button.setOnClickListener(new DeleteItemHandler(id, activity,this));        
}

你的句柄类就是这样的

public class DeleteItemHandler implements OnClickListener,
        android.view.View.OnClickListener {
long id;
Activity activity;
SMSimpleCursorAdapter smSimpleCursorAdapter;
public DeleteItemHandler(long id, Activity activity,
        SMSimpleCursorAdapter smSimpleCursorAdapter) {
    super();
    this.id = id;
    this.activity = activity;
    this.smSimpleCursorAdapter = smSimpleCursorAdapter;
}
@Override
public void onClick(View v) {
          //your own item click code
}
}