在具有自定义视图和 CursorAdapter 的 ListView 中单击的位置
Position of click within ListView with custom view and a CursorAdapter
我正在使用 ListView
显示来自 cursor
的数据。每个 ListView
行都使用下面 template_item.xml
定义的自定义布局。
当我单击 ID 为 tv_item_name
的 TextView
时,我想获取包含 TextView
的 ListView
的行位置。我需要行号,以便可以从 cursor
中提取其他列,因此使用 TextView.getString()
不足以完成我需要做的事情。
我正在努力寻找在 onClick
侦听器中执行此操作的方法。
到目前为止我已经尝试过:
Cursor c = myAdapter.getCursor()
- 游标似乎总是在最后一行,所以调用 c.getPosition()
returns 例如 3 如果游标有 4 行,无论哪个项目名称我点击。
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
我正在使用 ListView
显示来自 cursor
的数据。每个 ListView
行都使用下面 template_item.xml
定义的自定义布局。
当我单击 ID 为 tv_item_name
的 TextView
时,我想获取包含 TextView
的 ListView
的行位置。我需要行号,以便可以从 cursor
中提取其他列,因此使用 TextView.getString()
不足以完成我需要做的事情。
我正在努力寻找在 onClick
侦听器中执行此操作的方法。
到目前为止我已经尝试过:
Cursor c = myAdapter.getCursor()
- 游标似乎总是在最后一行,所以调用c.getPosition()
returns 例如 3 如果游标有 4 行,无论哪个项目名称我点击。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