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));
....