2014-09-05 62 views
0

我试图将SQLite中的数据显示为自定义ListView。我得到的数据,我可以显示它到ListView,但我有一个问题。在自定义ListView中显示SQLite数据

每当我滚动到ListView的最后一个数据时,它总是出错。它说的ArrayIndexOutOfBoundsException。我已经在搜索它,但仍找不到解决方案。

所以我想问的是,如何解决这个错误,或者是否有另一种方法可以用来显示ListView中的数据?

这里是我的DatabaseHandler.java

// Getting All search result 
public List<AllItem> getAllSearchResult(String searchResult) { 
    List<AllItem> allsearchResultList = new ArrayList<AllItem>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_ALLITEM + " WHERE " + KEY_ITEM_NAME_ALLITEM + " LIKE '%"+searchResult+"%' "; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      AllItem allitem = new AllItem(); 
      allitem.setTableID(cursor.getInt(0)); 
      allitem.setID(cursor.getString(1)); 
      allitem.setCategory_name(cursor.getString(2)); 
      allitem.setItem_Name(cursor.getString(3)); 

      allitem.setDescription(cursor.getString(4)); 
      allitem.setAddress(cursor.getString(5)); 
      allitem.setArea (cursor.getString(6)); 
      allitem.setAreaName (cursor.getString(7)); 

      // Adding searchResult to list 
      allsearchResultList.add(allitem); 
     } while (cursor.moveToNext()); 
    } 

    // return searchResult list 
    return allsearchResultList; 
} 

这里是我的Search.java

Intent search = getIntent(); 
    String searchResult = search.getStringExtra("TAG_SEARCH"); 
    DatabaseHandler db = new DatabaseHandler(this); 

    //Cursor mCur = (Cursor) db.getAllSearchResults(searchResult); 

    //CurAdapter Cur = new CurAdapter(Search.this, mCur,0); 
    //final ListView lv = (ListView)findViewById(R.id.listSearch); 
    //lv.setFastScrollEnabled(true); 
    //lv.setAdapter(Cur); 

    /** 
    * CRUD Operations 
    * */ 
    Log.d("Reading: ", "Reading all contacts.."); 
    List <AllItem> allItems = new ArrayList<AllItem>(); 


    allItems = db.getAllSearchResult(searchResult); 


    ArrayList <String> allItems2 = new ArrayList<String>(); 
    for (AllItem cn : allItems) { 
     allItems2.add(cn.getItem_name()); 
     allItems2.add(cn.getAreaNAme()); 
     allItems2.add(cn.getCategory_name()); 
    } 


    CustomAdapterSearch adapter = new CustomAdapterSearch(Search.this, allItems2); 
    listview.setAdapter(adapter); 

这是我的CustomAdapter.java

public class CustomAdapterSearch extends ArrayAdapter<String> { 

private final Activity context; 
private final List<String> items; 

public CustomAdapterSearch (Activity context, List<String> items) { 

    super(context, R.layout.searchlayout, items); 
    this.context = context; 
    this.items = items; 
} 

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

    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView = inflater.inflate(R.layout.searchlayout, null, true); 

    TextView itemName = (TextView) rowView.findViewById(R.id.item_name); 
    TextView areaName = (TextView) rowView.findViewById(R.id.area_name); 
    TextView priceCatergory = (TextView) rowView.findViewById(R.id.price_category); 

    itemName.setText(items.get(3*position)); 
    areaName.setText(items.get(3*position + 1)); 
    priceCatergory.setText(items.get(3*position + 2)); 

    return rowView; 

} 

}

有没有人可以帮助我?由于前:d

+0

这必须是与这块您的代码:items.get(3 *位置)。你有什么打算呢? – Opiatefuchs 2014-09-05 09:52:45

+0

使用SimpleCursorAdapter而不是ArrayAdapter – pskink 2014-09-05 09:56:04

+0

它用于位置和多少列我用它。 – Matthew 2014-09-05 09:56:05

回答

0

Search.java

Intent search = getIntent(); 
    String searchResult = search.getStringExtra("TAG_SEARCH"); 
    DatabaseHandler db = new DatabaseHandler(this); 


    Log.d("Reading: ", "Reading all contacts.."); 
    List <AllItem> allItems = new ArrayList<AllItem>(); 


    allItems = db.getAllSearchResult(searchResult); 

    CustomAdapterSearch adapter = new CustomAdapterSearch(Search.this, allItems); 
    listview.setAdapter(adapter); 



public class CustomAdapterSearch extends ArrayAdapter<AllItem> { 

private final Activity context; 
private final List<AllItem> items; 

public CustomAdapterSearch (Activity context, List<AllItem> items) { 

    super(context, R.layout.searchlayout, items); 
    this.context = context; 
    this.items = items; 
} 

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

    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView = inflater.inflate(R.layout.searchlayout, null, true); 

    TextView itemName = (TextView) rowView.findViewById(R.id.item_name); 
    TextView areaName = (TextView) rowView.findViewById(R.id.area_name); 
    TextView priceCatergory = (TextView) rowView.findViewById(R.id.price_category); 

    itemName.setText(items.get(position)); // there must be property of class AllItem add them after get method 
    areaName.setText(items.get(position)); 
    priceCatergory.setText(items.get(position)); 

    return rowView; 

} 
+0

感谢您的回复。但是我在areaName.setText(items.get(position))上出错了;说在方法中的方法setText(CharSequence)不适用于参数(allItem) – Matthew 2014-09-05 11:01:44

+0

我告诉你必须有AllItem类的属性在获得方法后将它们添加到全部 – 2014-09-05 11:26:10

0

你在做错误的,当转换将光标移至AllItem

使用的CursorAdapter和可滤接口来筛选结果

+0

感谢您的回复。有什么我可以学习的例子吗? – Matthew 2014-09-05 11:02:33

+0

http://www.mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html这个示例看起来有点多余,但没关系。 – 2014-09-05 12:36:03

0

使用Search.java推荐人:Android全国联保

Intent search = getIntent(); 
String searchResult = search.getStringExtra("TAG_SEARCH"); 
DatabaseHandler db = new DatabaseHandler(this); 

/** 
* CRUD Operations 
* */ 
Log.d("Reading: ", "Reading all contacts.."); 
List <AllItem> allItems = new ArrayList<AllItem>(); 

allItems = db.getAllSearchResult(searchResult); 

CustomAdapterSearch adapter = new CustomAdapterSearch(Search.this, allItems); 
listview.setAdapter(adapter); 

现在使用AllItem类传入CustomAdapter.java

public class CustomAdapterSearch extends ArrayAdapter<AllItem> { 

    private final Activity context; 
    private final List<AllItem> items; 

    public CustomAdapterSearch (Activity context, List<AllItem> items) { 

     super(context, R.layout.searchlayout, items); 
     this.context = context; 
     this.items = items; 
    } 

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

     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.searchlayout, null, true); 

     TextView itemName = (TextView) rowView.findViewById(R.id.item_name); 
     TextView areaName = (TextView) rowView.findViewById(R.id.area_name); 
     TextView priceCatergory = (TextView) rowView.findViewById(R.id.price_category); 

     itemName.setText(items.get(position).getItem_name()); 
     areaName.setText(items.get(position).getAreaNAme()); 
     priceCatergory.setText(items.get(position).getCategory_name()); 

     return rowView; 

    } 
} 
相关问题