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
.
希望对您有所帮助。
此致
我对 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
.
希望对您有所帮助。
此致