SQLite 到 GridView 使用 ArrayAdapter

SQLite to GridView using ArrayAdapter

我对 android 完全陌生。我在 sqlite 数据库中有大约 500 个数据。我正在尝试在 gridView 上访问它,为此我使用自定义 arrayAdapter,但它们加载数据的速度非常慢。我想更快地显示数据。谁能推荐我这样做的最佳方法?

这是我所做的:

在数据库中:

public ArrayList<DataDetails> getDetails() 
    {
        SQLiteDatabase db = this.getWritableDatabase();

        String selectQuery = "SELECT * FROM " + TABLE_DATA_DETAILS_LOCAL;
        Cursor cursor = db.rawQuery(selectQuery, null);

        ArrayList<DataDetails> datalist = new ArrayList<DataDetails>();
        if (cursor.moveToFirst()) 
        {
            DataDetails  valueID = null;
            do 
            {
                valueID = new DataDetails(cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7));
                datalist.add(valueID);
            } 
            while (cursor.moveToNext());
            cursor.close();
            db.close();
        }
        return datalist;
    }

从数据库中获取数据:

for (int i = 0; i < DetailsDataCount; i++)
            {
                String dataId = db.getDetails().get(i).getdataID();
                String dataType = db.getDetails().get(i).getDataType();
                String dataTypeImage = db.getDetails()get(i).getDataTypeImage();
                String dataDate = db.getDetails().get(i).getDataDate();
                String dataWeek = db.getDetails().get(i).getDataWeek();
                String dataAcount = db.getDetails().get(i).getDataAcount();
                String dataAccountImage = db.getDetails().get(i).getDataAccountImage();
                String dataAccounttextData = db.getDetails().get(i).getAccountData();

                listofDataDetails = new dataDetails(dataId, dataType, dataTypeImage, dataDate, dataWeek, dataAcount, dataAccountImage, dataAccounttextData);
                dataList.add(listofDataDetails);
            }

            gridView.setVisibility(View.VISIBLE);
            noDataText.setVisibility(View.GONE);

            adapterfordata = new DataAdapter(getActivity(), R.layout.data_main_row, dataList);
            gridView.setAdapter(adapterfordata);

我的客户适配器如下所示:

public class DataAdapter extends ArrayAdapter<DataDetails>
{
    ArrayList<DataDetails> dataList;
    private ArrayList<DataDetails> originalList;
    private AccountFilter filter;
    private LayoutInflater vi;
    private Context mContext;
    private String datadate;

    public DataAdapter(Context context, int textViewResourceId, ArrayList<DataDetails> nameList) 
    {
        super(context, textViewResourceId, nameList);
        this.dataList = new ArrayList<DataDetails>();
        this.dataList.addAll(nameList);

        this.originalList = new ArrayList<DataDetails>();
        this.originalList.addAll(nameList);

        mContext = context;

        vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    private class ViewHolder
    {
        public TextView dataDate;
        public ImageView dataTypeimage;
        public TextView dataType;
        public TextView dataAccount;

    }


    @Override
    public View getView(int position, View convertView, final ViewGroup parent) 
    {
        ViewHolder holder = null;

        if (convertView == null)
        {
            convertView = vi.inflate(R.layout.data_main_row, null);

            holder = new ViewHolder();

            holder.datatypeimage = (ImageView) convertView.findViewById(R.id.data_type_Image);
            holder.dataType = (TextView) convertView.findViewById(R.id.data_Type);
            holder.dataDate = (TextView) convertView.findViewById(R.id.data_Account);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        DataDetails bd = dataList.get(position);

        String tempImage = bd.getdataTypeImage();

        int resID = mContext.getResources().getIdentifier(tempImage, "drawable", mContext.getPackageName());
        holder.dataTypeimage.setImageResource(resID);

        holder.dataType.setText(bd.getDataType());      

        return convertView;
    }
  }

如果有人能指导我,那就太好了?

谢谢!

也许一种方法是只获取一些项目,比如先获取 20 或 30 个项目,然后围绕 GridView 滚动实现某种行为,因此当用户到达最后一个项目时,您再次调用数据库从网格中的 las 元素查询,并获取 30 个以上(仅作为示例)。

例如:

if (isScrollAtLastPosition){
  showLoading();
  dataList.addAll(getDetails(dataList.size(), 30));
  adapter.notifyDataSetChanged();
  hideLoading();
}

这只是您可以做的事情的一个例子。

因此您不会进行 sql 查询来获取大约 500 个项目,而用户可能会看到 100 个或更少。

这样你就可以避免进行繁重的查询,从 500 行到 500 个 DataDetails 对象的繁重映射,我认为这会稍微改善你的 GridView.

希望对您有所帮助。

此致