java - ListItem.onItemClickListener 与 CustomAdapter 无响应

标签 java listview android-sqlite simplecursoradapter

我有一个自定义 list_item,它所在的 ListView 有一个转到新 Activity 的 onItemClickListener。我面临的问题是 onItemClickListener 由于无法识别所单击项目的 ID 而没有响应。我怀疑这个问题源于我的 CustomAdapter 但我不确定可以采取什么措施来解决它。记录的 ID 列出为:

D/ListDataActivity: onItemClick: You Clicked on android.database.sqlite.SQLiteCursor@22fda4b

ListDataActivity.java:

public class ListDataActivity extends AppCompatActivity {

private static final String TAG = "ListDataActivity";

DatabaseHelper mDatabaseHelper;
TextView mTaskName;
TextView mTaskDesc;
ArrayAdapter adapter;
CustomAdapter customAdapter;
private ListView mListView;
DatabaseHelper db = new DatabaseHelper(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);
    mListView = (ListView) findViewById(R.id.listView);
    mDatabaseHelper = new DatabaseHelper(this);
    mTaskDesc = (TextView) findViewById(R.id.task_desc);
    mTaskName = (TextView) findViewById(R.id.task_name);

    populateListView();
}
private void populateListView() {
    String[] fromColumns = mDatabaseHelper.databaseToStringArray();
    int[] toViews = new int[]{R.id.task_name, R.id.task_desc};
    Cursor cursor;
    cursor = mDatabaseHelper.getWritableDatabase().rawQuery(" SELECT * FROM " + mDatabaseHelper.TABLE_NAME + " WHERE 1 ", null);
    Log.d(TAG, "populateListView: Displaying data in the ListView.");
    SimpleCursorAdapter customAdapter = new CustomAdapter(this, R.layout.list_item, cursor, fromColumns, toViews,0);
    mListView.setAdapter(customAdapter);



    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            String name = adapterView.getItemAtPosition(i).toString();
            Log.d(TAG, "onItemClick: You Clicked on " + name);
            Cursor data = mDatabaseHelper.getItemID(name);
            int priority = 10;
            int itemID = -1;
            while(data.moveToNext()){
                itemID = data.getInt(0);
            }
            if(itemID > -1){
                Log.d(TAG, "onItemClick: The ID is: " + itemID);
                Intent editScreenIntent = new Intent(ListDataActivity.this, EditDataActivity.class);
                editScreenIntent.putExtra("id",itemID);
                editScreenIntent.putExtra("name",name);
                editScreenIntent.putExtra("priority",priority);
                startActivity(editScreenIntent);
            }
            else{
                toastMessage("No ID associated with that name");
            }
        }
    });
}
private void toastMessage(String message){
    Toast.makeText(this,message, Toast.LENGTH_SHORT).show();
}

}

自定义适配器.java:

public class CustomAdapter extends SimpleCursorAdapter {

private int layout;
private Context context;
private DatabaseHelper mDatabaseHelper;

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

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    Cursor c = getCursor();

    final LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(R.layout.list_item, parent, false);
    bindView(v, context, c);
    return v;
}

@Override
public void bindView(View v, Context context, Cursor c) {

    int taskNameColumn = c.getColumnIndex(mDatabaseHelper.COL2);
    int taskDescColumn = c.getColumnIndex(mDatabaseHelper.COL4);

    String mTaskName = c.getString(taskNameColumn);
    String mTaskDesc = c.getString(taskDescColumn);

    TextView taskName = (TextView) v.findViewById(R.id.task_name);
    if (taskName != null){
        taskName.setText(mTaskName);
    }
    TextView taskDesc = (TextView) v.findViewById(R.id.task_desc);
    if (taskDesc != null){
        taskDesc.setText(mTaskDesc);
    }
}

}

这是我的 list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@color/colorWhite">

        <TextView
            android:id="@+id/task_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="55dp"
            android:layout_marginTop="25dp"
            android:text="TextView" />

        <View
            android:id="@+id/viewbutton"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="21dp"
            android:layout_marginTop="24dp"
            android:background="@layout/round" />

        <TextView
            android:id="@+id/task_desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/task_name"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="55dp"
            android:layout_marginTop="53dp"
            android:layout_marginBottom="10dp"
            android:focusable="false"
            android:text="Undefined"
            android:textStyle="bold" />


</RelativeLayout>

如果您希望我详细说明其中任何内容,我将很乐意。提前致谢!

最佳答案

当您使用 CursorAdapter 时,l(传递给覆盖的 onItemClick 方法的第四个参数)将是 id。这假设 _id 列是 rowid 的别名(即您有 _id INTEGER PRIMARY KEY 编码,有或没有 AUTOINCREMENT )。

  • 注意第四个参数'l',对于其他适配器(例如ArrayAdapter)将不是id 相反,它通常是位置(长整型),因此与第三个参数相同。

因此尝试Log.d(TAG, "onItemClick: You Clicked on " + name + " with an id of " + String.valueOf(l));

名称显示为android.database.sqlite.SQLiteCursor@22fda4b因为由 getItem 检索的底层项是 Cursor,而它的 toString 方法将是打印对象引用的默认继承方法。

你可能想要这样的东西:-

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Intent editScreenIntent = new Intent(ListDataActivity.this, EditDataActivity.class);
        editScreenIntent.putExtra("id",l); //<<<<<<<<<< THE ID AS kindly supplied by the CursorAdapter
        editScreenIntent.putExtra("name",data.getString(data.getColumnIndex(mDatabaseHelper.COL2)));
        editScreenIntent.putExtra("priority",data.getColumnIndex(mDatabaseHelper.COL4));
        startActivity(editScreenIntent);
        }
    }
});
  • 但是,您可以轻松(并且可以说更正确)通过意图传递 ID,然后从调用的 Activity 中的表中检索数据(名称和优先级)。
  • 请注意,上述代码是原则代码,尚未经过测试,因此可能包含错误。
  • 光标应位于当前行/相应行,因此需要进行任何移动。

关于java - ListItem.onItemClickListener 与 CustomAdapter 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52882972/

相关文章:

java - 枚举类型为 Class 时如何使用 Java 反射?

java - 如何解析字符串二十一点游戏结果

c++ - 如何在一次只允许 1 个选定项目的 ListView 中选择一个项目

android - 自定义 Listview - 我在哪里设置我的点击处理程序

android - 无法将新记录添加到sqlite数据库android

android - Sugar ORM 中的独特列

java - 服务器非托管线程中出现无法解释的 ClassNotFoundException

Java:如何从包含更多参数类型的列表中仅返回一种参数类型的对象?

c# - 从 ListView 控件获取索引项

android-sqlite - 从表中获取单行