1

私の gridview アクティビティが現在立っている方法は、onCreate メソッドで、電話上のすべてのビデオを検索し、do while ループを使用して ID とファイルパスを SQLite データベースに保存する非同期タスクを開始することです。次に、バックグラウンド スレッドを使用するカーソル アダプターを呼び出して、ファイル パスを使用してサムネイルを作成し、グリッドビューに表示します。ただし、最初にアクティビティを起動すると、グリッドビューに何も表示されないという問題が発生しています。ただし、もう一度開くとすべてが表示されます。したがって、私の問題は、アクティビティが最初に開始されたときにカーソルに何も表示されないため、何も表示できないことです。

私の質問は、新しいデータがバックグラウンド スレッドに入力されているときにカーソル アダプターを更新するにはどうすればよいですか? バックグラウンド スレッドに入力されたばかりのデータを使用するようにカーソル アダプターをトリガーするにはどうすればよいですか? 私のコードは以下に掲載されています(少しずさんで申し訳ありません)。

作成時

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;        
}
4

1 に答える 1

2

バックグラウンド スレッドが完了したら、アダプターでnotifyDataSetChangedを呼び出します。

接続されたオブザーバーに、基になるデータが変更されたこと、およびデータ セットを反映するすべてのビューがそれ自体を更新する必要があることを通知します。

于 2013-06-16T21:17:36.980 に答える