0

我正在尝试从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

4 回答 4

2

首先,您传递了一个仅包含最后一个条目的字段的列表,因为您每次都重新创建该列表。您创建一个适配器并在那里传递一个包含 8 个字符串的列表 - 这就是它有 8 行的原因。结束你写相同内容的每一行。您可以声明一个 EducationDetail 类,创建详细信息列表并将其传递给您的适配器。但最重要的是使用CursorAdapter

于 2015-04-08T10:02:14.237 回答
0
    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));

        ....
于 2015-04-08T10:19:43.997 回答
0

你不应该调用“a = new ArrayList();” 在循环内 - 这就是为什么你会丢失之前迭代的所有数据。

于 2015-04-08T09:54:15.580 回答
0

您没有沿着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”设计模式的内容(关于该主题有很多问题)。

于 2015-04-08T09:51:11.747 回答