【问题标题】:How to press on listview to show infomation // Android如何按下列表视图以显示信息 // Android
【发布时间】:2017-05-03 16:58:05
【问题描述】:

现在我尝试从数据库 [SQLite] 中查询数据以通过搜索显示 接下来我想按下在搜索后发现但出现错误的列表视图

android.database.CursorIndexOutOfBoundsException: 请求索引 2,大小为 2 在 android.database.AbstractCursor.checkPosition(AbstractCursor.java:460) 在 android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 在 th.kusrc.devbeginner.sqlite4.SearchActivity$1.onItemClick(SearchActivity.java:50) 在 android.widget.AdapterView.performItemClick(AdapterView.java:310) 在 android.widget.AbsListView.performItemClick(AbsListView.java:1145) 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:3066) 在 android.widget.AbsListView$3.run(AbsListView.java:3903) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5451) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

在 SearchActivity 中

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    Search_name = (EditText) findViewById(R.id.search_name);
    listView = (ListView) findViewById(R.id.listView);

    listDataAdapter = new ListDataAdapter(getApplicationContext(), R.layout.row_layout);
    listView.setAdapter(listDataAdapter);
    // OnClick Item
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> myAdapter, View myView, int position, long mylng) {

            String user_name = cursor.getString(cursor.getColumnIndex("USER_NAME"));
            Toast.makeText(getApplicationContext(),
                    "Selected User : " + user_name, Toast.LENGTH_SHORT).show();

        }
    });

    searchBtn = (Button) findViewById(R.id.searchContact);
    searchBtn.setOnClickListener(this);
}

public void searchContact() {
    search_name = Search_name.getText().toString();
    userDbHelper = new UserDbHelper(getApplicationContext());
    sqLiteDatabase = userDbHelper.getReadableDatabase();
    cursor = userDbHelper.getContact(search_name, sqLiteDatabase);
    if(cursor.moveToFirst()) {
        do {
            String name, mobile, email;
            name = cursor.getString(0);
            mobile = cursor.getString(1);
            email = cursor.getString(2);
            DataProvider dataProvider = new DataProvider(name, mobile, email);
            listDataAdapter.add(dataProvider);
        }
        while (cursor.moveToNext());
    }
}

在 userDbHelper 中

public class UserDbHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "USERINFO.DB";
private static final int DATABASE_VERSION = 4;
private static final String CREATE_QUERY =
        "CREATE TABLE " + UserContact.NewUserInfo.TABLE_NAME + "(" + UserContact.NewUserInfo.USER_NAME + " TEXT," +
                UserContact.NewUserInfo.USER_MOB + " TEXT," + UserContact.NewUserInfo.USER_EMAIL + " TEXT" + ");";

public UserDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    Log.d("Database Operation", "Database created......");
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_QUERY);
    Log.d("Database Operation", "Table created......");
}
public Cursor getContact(String user_name, SQLiteDatabase db) {
    String[] projections = {UserContact.NewUserInfo.USER_NAME, UserContact.NewUserInfo.USER_MOB, UserContact.NewUserInfo.USER_EMAIL};
    String selection = UserContact.NewUserInfo.USER_NAME + " LIKE ?";
    String[] selection_args = {user_name};
    Cursor cursor = db.query(UserContact.NewUserInfo.TABLE_NAME, projections, selection, selection_args, null, null, null);
    return cursor;
}

和 UserContact.NewUserInfo

    public class UserContact {

public static abstract class NewUserInfo {
    public static final String USER_NAME = "user_name";
    public static final String USER_MOB = "user_mob";
    public static final String USER_EMAIL = "user_email";
    public static final String TABLE_NAME = "user_info";
}

}

我该如何解决?

编辑:更新 userDbHelper

【问题讨论】:

  • 如何创建新的数据库语句?请给我一个 CREATE 声明
  • 好的,我更新了 userDbHelper。

标签: android sqlite listview


【解决方案1】:
   String user_name = cursor.getString(cursor.getColumnIndex("USER_NAME"));

您将列名用作“USER_NAME”,而您已将其定义为

      public static final String USER_NAME = "user_name";

所以更正列名的大小写。

【讨论】:

  • 这意味着我将修复 String user_name = cursor.getString(cursor.getColumnIndex("user_name"));对吗?
【解决方案2】:

我没有看到你所有的代码,但很明显导致崩溃的行是:

cursor.getString(cursor.getColumnIndex("USER_NAME"));

我假设cursor 是您的SearchActivity 的成员。我不知道你为什么认为它一定会指向正确的行(我看到你在其他地方更新它并且它用于迭代整个数据库)。我认为你有两个选择:

1) 创建列表项时,将用户名保存在持有者视图中(参见example)。因此,您可以直接访问点击侦听器上的数据,而无需挖掘数据库。

2) 更新您的点击侦听器并根据位置从数据库中获取正确的行。比如:

    public void onItemClick(AdapterView<?> myAdapter, View myView, int position, long mylng) {
        // You need to write initTheCursorToPointIndex() on your own (I am not sure how you organized your data so I can't implement it)
        cursor = initTheCursorToPointIndex(position); 
        String user_name = cursor.getString(cursor.getColumnIndex("USER_NAME"));
        Toast.makeText(getApplicationContext(),
                "Selected User : " + user_name, Toast.LENGTH_SHORT).show();

    }

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2019-09-21
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多