【问题标题】:Show SQLite data in Custom ListView在自定义 ListView 中显示 SQLite 数据
【发布时间】:2014-09-05 09:48:54
【问题描述】:

我正在尝试将来自 SQLite 的数据显示到自定义 ListView 中。我得到了数据,我可以把它显示到ListView,但是我有一个问题。

每次我将它滚动到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

【问题讨论】:

  • 这一定与你的这段代码有关:items.get(3*position)。你这样做的目的是什么?
  • 使用 SimpleCursorAdapter 而不是 ArrayAdapter
  • 它的位置和我使用多少列。
  • @pskink 你能给我举个例子吗?还是很好的教程?

标签: java android sqlite android-listview


【解决方案1】:

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;

}

【讨论】:

  • 感谢您的回复。但是我在 areaName.setText(items.get(position)); 上遇到错误说`打字错误中的方法setText(CharSequence)不适用于参数(allItem)
  • 我告诉过你必须有 AllItem 类的属性,在 get 方法之后添加它们
【解决方案2】:

将Cursor转换为AllItem时你做错了

使用 CursorAdapter 和 Filtrable 接口过滤结果

【讨论】:

【解决方案3】:

使用Android Genius推荐的Search.java

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;

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多