gpt4 book ai didi

android - 如何通知更新数据库的游标适配器

转载 作者:行者123 更新时间:2023-11-29 21:40:57 26 4
gpt4 key购买 nike

我的 gridview Activity 当前的方式是在我的 onCreate 方法上,我启动了一个异步任务,该任务搜索我手机上的所有视频,然后使用 do while 循环将 id 和文件路径存储在 SQLite 数据库中。然后我调用一个游标适配器,它使用后台线程使用文件路径创建缩略图并将它们显示在 gridview 中。但是,我遇到了一个问题,即当我第一次启动 Activity 时,gridview 中没有显示任何内容。但是,当我再次打开它时,一切都会显示出来。所以我的问题是,当 Activity 第一次启动时,光标中没有任何内容,因此无法显示任何内容。

我的问题是,在后台线程中输入新数据时,我将如何更新游标适配器?我怎样才能触发游标适配器使用刚刚在后台线程中输入的数据?我的代码贴在下面(抱歉有点草率)。

创建时

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preview);
GridView gridview = (GridView) this.findViewById(R.id.gridview);

cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, null, null, null);
columnindexid = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
columnindexdata = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);

entry = new GridviewData(this);
entry.open();

DataEntry putitin = new DataEntry(entry);
putitin.execute();

//the cursor used in the cursor adapter
Cursor curs = entry.adapterCursor();
videoidindex = entry.Indexfinder(curs);
videopathindex = entry.Indexfinder2(curs);

config = new ImageLoaderConfiguration.Builder(this)
.imageDownloader(new BaseImageDownloader(this))
.build();

ImageLoader.getInstance().init(config);
Log.i(TAG, "Before set adapter");
gridview.setAdapter(new VideoAdapter(this, curs, flags));
}

将数据放入数据库的异步任务

private class DataEntry extends AsyncTask<Void, Integer, GridviewData>{
Cursor cursor;
GridviewData dataentry;
DataEntry(GridviewData gridviewdata){
this.dataentry = gridviewdata;
this.cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
mediaColumns, null, null, null);

columnindexid = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
columnindexdata = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
}

@Override
protected GridviewData doInBackground(Void... params) {

cursor.moveToFirst();
do {

String videoid = cursor.getString(columnindexid);
String videopath = cursor.getString(columnindexdata);

int result = dataentry.findVideoID(videoid);
if (result == 1){

//this is where data is put into the database
dataentry.addVideoinfo(videoid, videopath);

}

if (result == 0){
Log.i(TAG, "Cursor wasn't processed, no getcount");
}
if(result == 2){
Log.i(TAG, "The data is already there");
}

} while (cursor.moveToNext());
Log.i(TAG, "After dowhile loop");
cursor.close();

return dataentry;
}
}

光标适配器

class VideoAdapter extends CursorAdapter {
Context context;
public VideoAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
this.context = context;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
String fileid = cursor.getString(videoidindex);
String filepath = cursor.getString(videopathindex);
BitmapDownloader bitdl = new BitmapDownloader(fileid, filepath, holder.imageview);
bitdl.execute();
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View eachgrid = inflater.inflate(R.layout.eachgrid, parent, false);
ViewHolder holder = new ViewHolder();
holder.imageview = (ImageView) eachgrid
.findViewById(R.id.Imageview1);
eachgrid.setTag(holder);
return eachgrid;
}

最佳答案

调用notifyDataSetChanged在你的后台线程完成后在你的适配器上。

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

关于android - 如何通知更新数据库的游标适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com