在具有自定义视图和 CursorAdapter 的 ListView 中单击的位置

Position of click within ListView with custom view and a CursorAdapter

我正在使用 ListView 显示来自 cursor 的数据。每个 ListView 行都使用下面 template_item.xml 定义的自定义布局。

当我单击 ID 为 tv_item_nameTextView 时,我想获取包含 TextViewListView 的行位置。我需要行号,以便可以从 cursor 中提取其他列,因此使用 TextView.getString() 不足以完成我需要做的事情。

我正在努力寻找在 onClick 侦听器中执行此操作的方法。

到目前为止我已经尝试过:

  1. Cursor c = myAdapter.getCursor() - 游标似乎总是在最后一行,所以调用 c.getPosition() returns 例如 3 如果游标有 4 行,无论哪个项目名称我点击。
  2. LinearLayout ll = (LinearLayout) v.getParent()LinearLayout ll2 = (LinearLayout) ll.getParent() 然后是 ListView lv = (ListView) ll2.getParent(),但是从这里我无法获得所点击项目的位置。 lv.getSelectedItemPosition() returns -1.

非常感谢您的帮助。

template_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv_item_heading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="5">
        <TextView
            android:id="@+id/tv_item_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="4"/>
        <TextView
            android:id="@+id/tv_item_quantity"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

base_layout_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/base_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</ListView>

摘自我的片段

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.base_layout_listview, container, false);
}


private void bindItems (Cursor data) {
    CursorQueries cq = new CursorQueries();

    myAdapter = new CursorAdapter(getContext(), data) {

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

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return LayoutInflater.from(context).inflate(R.layout.template_item, parent, false);
        }

        @SuppressLint("ClickableViewAccessibility")
        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            TextView tvHeading = view.findViewById(R.id.tv_item_heading);
            TextView tvItem = view.findViewById(R.id.tv_item_name);
            TextView tvQuantity = view.findViewById(R.id.tv_item_quantity);
            tvHeading.setText(cursor.getString(cursor.getColumnIndex("rowType")));
            tvItem.setText(cursor.getString(cursor.getColumnIndex("itmName")));
            tvQuantity.setText(cursor.getString(cursor.getColumnIndex("itmQuantity")));

            tvItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    TextView t = (TextView) v;
                    // Want to get the position in the list of this text view    
                }
            });

        }
    };
    ListView lv = getView().findViewById(R.id.base_listview);
    lv.setAdapter(myAdapter);
}

试过的方法一可以:

 Cursor cursor = myAdapter.getCursor()
 ...

要么使用 OnItemClickListener,以便可以访问该位置:

public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
   Cursor cursor = myAdapter.getCursor();
   cursor.moveToPosition(position);
   ...
}

如果您想坚持使用 onClickListener,请在 bindView 中执行以下操作:

public void bindView(View view, Context context, Cursor cursor) {
    ...
    view.setTag(Integer.valueOf(cursor.getPosition());
}

[或在您的任何视图上设置标签,例如 'tvItem',因为现在正在关闭。但是在单个TextView上设置OnClickListener可能会导致用户点击困难?]

然后在onClick方法中做:

 public void onClick(View v) {
     Cursor cursor = myAdapter.getCursor();
     int position = (Integer) v.getTag();
     cursor.moveToPosition(position);
     ...
  }

还值得一提的是,如果滚动性能成为一个问题,那么值得研究 "View Holder Pattern" 或使用本质上随 "View Holder Pattern".

一起提供的 RecyclerView