2017-11-20 1 views
0

私はリストアプリケーションを作成しています。私はSQLiteデータベースを作成してアプリケーションにリンクしています。最初のタスク(Study)と2番目のタスク(Research)を設定したときのように、それぞれが名前を持つ2つの異なるアイテム(StudyResearch)を作成するような、新しいアイテムを作成している間に、ベースアダプター、カーソル、インフレーターのコード。SQLiteデータベースでベースアダプタを設定すると、データが互いに重なり合っています

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; 

    } 

答えて

0

問題は、+ =と組み合わせたカーソル内のすべてのデータをトラバースしていることです。 はむしろ何がやりたいことはカーソル内の適切な行に位置で、ちょうどその行(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); 
    } 

これは、ポインタカーソルとソースアレイが構築された順序が同一であることを前提としていません。

+0

これで問題は直ちに解決しました。今度は約4時間、これを調べてくれてありがとうございます。D –

+0

@HadyElHawary私のプレゼンテーション。 – MikeT

+0

@HadyElHawary PS上記の後に(if節/構造体の後と外に) 'pointer.Close()'を実際に置いてください。そうすれば、Cursorは常に閉じられています。 – MikeT

関連する問題