Sqlite данные абстракция к макету

Я пытаюсь абстрагировать данные от SQLite база данных. Я получаю данные правильно, но я думаю, что есть проблема в макете.

Я вставил две строки, но он показывает только одну строку несколько раз.

long id;     

DBAdapter db = new DBAdapter(getActivity());
db.open();
id = db.insertEducationDetail(1, "a", "b", "c", "d");
id = db.insertEducationDetail(1, "1", "1", "1", "1");
Cursor c = db.getAllContact();
if(c.moveToFirst()){
   Display(c);
}
db.close();

Дисплей:

ArrayList<String> _data = null;
  for(int i=0 ; i<cur.getCount(); i++){
    _data = new ArrayList<String>();
    for(int j=0 ; j<cur.getColumnCount(); j++){
    _data.add(cur.getString(j));
   }
}
list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),a));

Запрос:

public long insertEducationDetail(int id,String title,String degree,
                                                 String duration,String stream){
    ContentValues value = new ContentValues();
    value.put(KEY.ID, id);
    value.put(KEY.TITLE, title);
    value.put(KEY.DEGREE, degree);
    value.put(KEY.DURATION, duration);
    value.put(KEY.STREAM, stream);
    return db.insert(DATABASE_TABLE,null, value);
}

в выводе это повторяет данные 4 раза.

выход

4 ответа

Прежде всего, вы передаете список, который содержит только поля для одной последней записи, потому что вы каждый раз воссоздаете список. Вы создаете адаптер и передаете туда список из 8 строк - вот почему он имеет 8 строк. Конец для каждой строки вы пишете одинаковое содержание. Вы можете объявить класс EducationDetail, создать список деталей и передать его адаптеру. Но лучше всего будет использовать CursorAdapter

Вы не должны вызывать "a = new ArrayList();" внутри цикла - вот почему вы теряете все данные из предыдущей итерации.

Вы не двигаете курсор вдоль строк в вашем Display (должен быть в нижнем регистре!). Так во внешнем for цикл вы должны добавить cur.moveToPosition(i), лайк:

public void Display(Cursor cur){
    ArrayList<String> a = null;
    for(int i=0 ; i<cur.getCount(); i++){
        a = new ArrayList<String>();
        cur.moveToPosition(i);
        for(int j=0 ; j<cur.getColumnCount(); j++){
            a.add(cur.getString(j));
        }
    }
    list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),a));
}

Вот почему ваш курсор отображает 8 раз (должно быть количество строк?) Одно и то же.

Кроме того, вы должны изменить свой адаптер следующим образом:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View listing;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    if(convertView == null){
        listing = new View(context);
        listing = inflater.inflate(R.layout.educational_item, null);
    } else {
        listing = convertView;
    }

    title = (TextView) listing.findViewById(R.id.educational_text1);
    degree = (TextView) listing.findViewById(R.id.educational_text2);
    duration= (TextView)listing.findViewById(R.id.educational_text3);
    stream = (TextView)listing.findViewById(R.id.educational_text4);
    institution = (TextView) listing.findViewById(R.id.educational_text5);
    location=(TextView)listing.findViewById(R.id.educational_text6);
    university = (TextView)listing.findViewById(R.id.educational_text7);
    score= (TextView)listing.findViewById(R.id.educational_text8);

    title.setText(a.get(0));
    degree.setText(a.get(1));
    duration.setText(a.get(2));
    stream.setText(a.get(3));
    institution.setText(a.get(4));
    location.setText(a.get(5));
    university.setText(a.get(6));
    score.setText(a.get(7));

    return listing;
}

Обратите внимание, что этот вид адаптера немного неэффективен. Чтобы повысить производительность по сравнению с большим набором данных, вы можете прочитать кое-что о шаблоне проектирования "ViewHolder" (по этому вопросу много вопросов).

    public void Display(Cursor cur){
        ArrayList<EducationInformation> a = new ArrayList<EducationInformation>;
    EducationInformation obj = null;
        for(int i=0 ; i<cur.getCount(); i++){
            obj = new EducationInformation();

             ArrayList<String> a = new ArrayList<String>();
            for(int j=0 ; j<cur.getColumnCount(); j++){

                a.add(cur.getString(j));
            }
              obj.setInfo(a);

        }
        list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),obj));


    }

private class EducationInformation{
  private ArrayList<String> info;

//getter setter
}

И обновить адаптер как

@Override
public int getCount() {
    return info.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

        ....

        title.setText(a.get(position).get(0));
        degree.setText(a.get(position).get(1));
        duration.setText(a.get(position).get(2));
        stream.setText(a.get(position).get(3));
        institution.setText(a.get(position).get(4));
        location.setText(a.get(position).get(5));
        university.setText(a.get(position).get(6));
        score.setText(a.get(position).get(7));

        ....
Другие вопросы по тегам