2012-12-14 26 views
-1

我有一个SQLite数据库与多个列,其中一个列是日期。我想将数据库中的数据填充到可扩展列表视图中,并将日期作为标题。因此,对于共享相同日期值的所有行,我想将它们显示为特定日期的孩子。与SQLite数据库的可扩展列表视图

我用arraylist来存储数据库中的数据。我得到了组标题,但当我尝试展开时,我得到空指针异常。该错误来自getChildView方法。

public class MyExpandableListAdapter extends BaseExpandableListAdapter { 

    public Object getChild(int groupPosition, int childPosition) { 
     return infoList.get(groupPosition).get(childPosition); 
    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 
     RelativeLayout infoLayout = (RelativeLayout) findViewById(R.id.infoLayout); 
     String exercise = ((ArrayList<Object>) getChild(groupPosition, childPosition)).get(0).toString(); 
     String weight = ((ArrayList<Object>) getChild(groupPosition, childPosition)).get(1).toString(); 
     String reps = ((ArrayList<Object>) getChild(groupPosition, childPosition)).get(2).toString(); 
     ((TextView) infoLayout.findViewById(R.id.exercise)).setText(exercise); 
     ((TextView) infoLayout.findViewById(R.id.weight)).setText(weight); 
     ((TextView) infoLayout.findViewById(R.id.reps)).setText(reps); 


     return infoLayout; 
    } 

    public int getChildrenCount(int groupPosition) { 
     return infoList.get(groupPosition).size(); 
    } 

    public Object getGroup(int groupPosition) { 
     return dateList.get(groupPosition); 
    } 

    public int getGroupCount() { 
     return dateList.size(); 
    } 

    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     TextView dateView = new TextView(getApplicationContext()); 
     dateView.setText(getGroup(groupPosition).toString()); 
     return dateView; 
    } 

    public boolean hasStableIds() { 
     return false; 
    } 

    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 
} 

这就是我如何填充arraylist。包含子元素的数组列表嵌套两次:最里面的元素包含3个要显示在同一行上的对象,“中间”元素将最内层的数组分组在一起,以便它们出现在可扩展列表视图的正确分组下。

private DatabaseMethods dbm; 
private ArrayList<String> dateList = new ArrayList<String>(); 
private ArrayList<ArrayList<ArrayList<Object>>> infoList = new ArrayList<ArrayList<ArrayList<Object>>>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.stats); 
    dbm = new DatabaseMethods(this); 
    dbm.read(); 
    Cursor dates = dbm.fetchGroup(); 
    int DATES_INDEX = dates.getColumnIndexOrThrow("date"); 
    while (dates.moveToNext()) { 
     String date = dates.getString(DATES_INDEX); 
     if (!dateList.contains(date)) { 
      dateList.add(date); 
     } 
    } 
    for (String date : dateList) { 
     Cursor info = dbm.fetchChildren(date); 
     int EXERCISE_INDEX = info.getColumnIndexOrThrow("exercise"); 
     int WEIGHT_INDEX = info.getColumnIndexOrThrow("weight"); 
     int REPS_INDEX = info.getColumnIndexOrThrow("reps"); 
     ArrayList<ArrayList<Object>> secondInnerInfoList = new ArrayList<ArrayList<Object>>(); 
     while (info.moveToNext()) { 
      String exercise = info.getString(EXERCISE_INDEX); 
      int weight = info.getInt(WEIGHT_INDEX); 
      int reps = info.getInt(REPS_INDEX); 
      ArrayList<Object> thirdInnerInfoList = new ArrayList<Object>(); 
      thirdInnerInfoList.add(exercise); 
      thirdInnerInfoList.add(weight); 
      thirdInnerInfoList.add(reps); 
      secondInnerInfoList.add(thirdInnerInfoList); 
     infoList.add(secondInnerInfoList); 
     } 

    } 
+0

您是否尝试过的东西?向我们显示您尝试过的代码,如果您有任何问题,您将收到帮助。 –

+0

阐述你的问题。如果您的代码有错误,请将其发布到此处。否则,您可以搜索[谷歌](http://goo.gl/uZ1D1)的sqlite教程或SO [问题](http://stackoverflow.com/q/6760948/1050058)。 –

+0

http://stackoverflow.com/questions/17132559/java-lang-nullpointerexception-displaying-records-from-database-in-an-expandab 需要帮助。检查出链接^ – user2468835

回答

0
  1. 写一个方法来获得你的数据转换到一个ArrayList或数组字符串。
  2. 在您的Activity中为ArrayAdapter声明和初始化数据,如: ArrayAdapter mAdapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,yourArrayListOrArray);
  3. ListView.setAdapter(mAdapter);
+0

是的,我最终做了类似的事情。谢谢。 – CoffeeCrisp

0
public View getChildView(int parentPosition, int childPosition, boolean isLastChild, View convertView, 
     ViewGroup parent) { 
    // TODO Auto-generated method stub 


    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.child_view_list, null); 
    } 
    final String abc = (String) getChild(parentPosition, childPosition); 

    TextView status_tv = (TextView) convertView 
      .findViewById(R.id.child_tv); 
    status_tv.setText(abc); 

    //ImageView imgListChild=(ImageView) convertView.findViewById(R.id.child_iv); 


    //imgListChild.set 
    return convertView; 
} 
+0

@coffeeCrisp可以请你发布你的代码..其实我也有同样的问题 –