ListView中的OnClickListener _id与SQLite中的正确行_id不匹配

时间:2016-10-02 15:53:37

标签: java android sqlite listview android-arrayadapter

我是Android新手。我有一个SQLite后端,每行都是唯一的(想想一个人)。然后,我在ListView中为每个人显示此数据。单击ListView项时,它将转到子视图,该子视图包含特定父ListView项的所有信息。我遇到的问题是当我为ListView设置OnItemClickListener时,int位置和long id从0开始。当我通过列表视图中的第一个项目的意图传递其中任何一个时,我得到一个“android。 database.CursorIndexOutOfBoundsException:请求索引0,大小为0“。这是因为我在SQlite中的行ID从1开始,并且int位置或long id从0开始。解决此问题的最佳方法是什么?我已经读过你可以在postion或id中添加1,但是如果用户以不同的方式对ListView进行排序,它是否会将错误的ID传递给数据库?谢谢

MainActivity

   final ArrayList<Person> objects = db.getAllPersons();
        final CustomAdapter customAdapter = new CustomAdapter(this, objects);
        customAdapter.notifyDataSetChanged();
        final ListView listView = (ListView) findViewById(R.id.content_list);
        listView.setAdapter(customAdapter);

//Listen for ListView item click

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {


                Intent intent = new Intent(MainActivity.this, PersonProfile.class);
                intent.putExtra("id", id;
                startActivity(intent);

            }
        });

PersonActivity

    public class PersonProfile extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.person_profile);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

//Get unique ID from MainActivity
            int personID = getIntent().getExtras().getInt("id");

//Fetch individual from the database based on unique ID
            DatabaseHandler db = new DatabaseHandler(this);
            db.getReadableDatabase();
            Person person = db.getPerson(personID);
            db.close();

//Set TextView budget using unique ID
            String budget = String.valueOf(person.getBudget());
            TextView textViewBudget = (TextView) findViewById(R.id.person_budget);
            textViewBudget.setText(budget);

        }    

2 个答案:

答案 0 :(得分:1)

我按照pskink的推荐实现了SimpleCursorAdapter。它需要一些其他代码更改,但我同意这是最简单的方法。

这是我的课程在

之后的样子

<强> MainActivity

DatabaseHandler db = new DatabaseHandler(this);
    db.getWritableDatabase();
    Cursor cur = db.getAllPersons();
    String[] columns = new String[]{"name", "budget"};
    int[] to = new int[]{R.id.name, R.id.budget};

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row_layout, cur, columns, to);
    final ListView listView = (ListView) findViewById(R.id.content_list);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

            Intent intent = new Intent(MainActivity.this, PersonProfile.class);
            intent.putExtra("id", id);
            startActivity(intent);

        }
    });

<强> PersonActivity

public class PersonProfile extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.person_profile);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Long intent = getIntent().getExtras().getLong("id");
    DatabaseHandler db = new DatabaseHandler(this);
    db.getReadableDatabase();

    String budgetSet = db.getPerson(intent);


    TextView textViewBudget = (TextView) findViewById(R.id.person_budget);

    textViewBudget.setText(budgetSet);

    db.close();

}

<强>数据库处理器

Cursor getAllPersons() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.query(TABLE_PERSON, new String[]{KEY_ID,
            KEY_NAME, KEY_BUDGET}, null, null, null, null, null);

    return cursor;
}

答案 1 :(得分:0)

如果你的listview的起始值为0,而你的db的起始值为1,就像你说的那样你可以只为id加1,但是如果用户短缺listview不同你会遇到问题,因为用户4可能在列表视图中的索引为1。

我的兴趣是当你点击你可以调用的项目时,将数据库ID添加到Person

objects.get(listiewClickedPosition).getUserID();

如果我没有遗漏某些内容,这将会检索正确的索引,即使列表视图不同也会缩短

如果您想要不同地缩短它,请在调用objects之后更改notifyDataSetChanged()的顺序