【问题标题】:Data is getting over each other when setting my Base adapter with SQLite Database使用 SQLite 数据库设置我的基本适配器时,数据正在相互覆盖
【发布时间】:2017-11-20 04:35:36
【问题描述】:

我正在制作一个待办事项列表应用程序,我创建了一个 SQLite 数据库并将其与我的应用程序链接,除了数组中的数据之外,一切似乎都工作得很好,它们在创建新项目时会互相影响,就像当我设置第一个任务(研究)和第二个任务(研究)时,它会创建两个不同的项目,每个项目都有名称(StudyResearch)......这是我的基本适配器、光标和充气器的代码。

 class MyCustomAdapter extends BaseAdapter
{
    ArrayList<ListItem> Items=new ArrayList<ListItem>();
    MyCustomAdapter(ArrayList<ListItem> Items ) {
        this.Items=Items;

    }


    @Override
    public int getCount() {
        return (int) DatabaseUtils.queryNumEntries(db, "tasks");
    }

    @Override
    public String getItem(int position) {
        return Items.get(position).Name;

    }

    @Override
    public long getItemId(int position) {
        return  position;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        String[] cols = {"id", "name", "time", "date"};
        Cursor pointer = db.query("tasks", cols, null,null,null,null,null);
        String name = "";
        String time = "";
        String date = "";
        //String data = "";
        while (pointer.moveToNext()){
            name += pointer.getString(1);
            time += pointer.getString(2);
            date += pointer.getString(3);

            //data += pointer.getInt(0) + " - " +  pointer.getString(1) + " - " + pointer.getInt(2) +" - "  + pointer.getInt(3);

        }

        LayoutInflater linflater =getLayoutInflater();
        View view1=linflater.inflate(R.layout.row_view, null);

        final CheckedTextView tvTasks =(CheckedTextView) view1.findViewById(R.id.tvTasks);
        CheckedTextView tvDesc =(CheckedTextView) view1.findViewById(R.id.tvDesc);
        tvTasks.setText(name);
        tvDesc.setText(date + "(" + time + ")");   //date + "(" + time + ")"


        tvTasks.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tvTasks.toggle();
            }
        });

        return view1;

    }

【问题讨论】:

    标签: android sqlite listview arraylist


    【解决方案1】:

    您遇到的问题是您正在遍历游标中的所有数据,结合 += 正在连接检索到的数据。 相反,您想要做的是 position 到光标中的适当行并仅从该行获取数据 (我不推荐这种方式,因为 CursorAdapter 更适合)。

    所以不是:-

        while (pointer.moveToNext()){
            name += pointer.getString(1);
            time += pointer.getString(2);
            date += pointer.getString(3);
        }
    

    你可以使用:-

         if (pointer.moveToPosition(i)){
            name = pointer.getString(1);
            time = pointer.getString(2);
            date = pointer.getString(3);
        }
    

    这确实假设指针光标和源数组的构建顺序是相同的。

    【讨论】:

    • 这确实立即解决了问题,非常感谢,我已经研究了大约 4 个小时了:D
    • @HadyElHawary 我的荣幸。
    • @HadyElHawary PS 你真的应该有pointer.Close() 在上面(在if 子句/构造之后和之外),所以光标总是关闭,以避免打开太多。
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多