处理程序没有刷新android中的网格视图

时间:2012-08-01 05:55:12

标签: android gridview handler android-cursoradapter

在我的Android应用中,我有一个网格显示图像作为项目。当我点击按钮时,项目应该改变他们的位置。我通过游标适配器填充此网格。以前它工作正常但是花了一些时间来改变图像的位置并再次刷新网格。因此,我实现了一个进度对话框,以便用户可以理解正在发生的事情。

到目前为止,这是我的代码。

我的处理程序

public void handleMessage(Message msg) {
switch (msg.what) {
    case PROGRESS_DIALOG_HANDLER_ID:
        progressDialog.dismiss(); //ProgressDialog
        DBAdapter adapter = new DBAdapter(SplittedImageActivity.this);
        adapter.open();
        Cursor cursor = adapter.getAllImages();
        adapter.close();
        startManagingCursor(cursor);
        cursorAdapter.changeCursor(cursor); //My cursor adapter
        gridView.setAdapter(cursorAdapter);
        cursor.close();

我的onclick方法

progressDialog = ProgressDialog.show(SplittedImageActivity.this, "", "Please wait...");
new Thread(){
        public void run() {
        Random random = new Random();
        DBAdapter adapter = new DBAdapter(getApplicationContext());
        adapter.open();
        int childs = gridView.getChildCount(), oldPosition, newPotision;
        newPotision = childs-1;
        for(int i=0 ; i<childs ; i++){
            oldPosition = random.nextInt(m_cGridView.getChildCount());
            adapter.updatePosition(oldPosition, newPotision); //updates the position of the images in database
            newPotision = oldPosition;
        }
        adapter.close();
        handler.sendEmptyMessage(PROGRESS_DIALOG_HANDLER_ID);
    };
}.start();

问题:

进度对话框显示效果,位置也在数据库中更改。但是gridview并不令人耳目一新。我的意思是在完成所有工作后,进度对话框消失,屏幕变为空白。

请帮助我在哪里做错了?

1 个答案:

答案 0 :(得分:0)

我认为问题在于你是在处理程序上分配一个新的适配器,而不是在主线程上调用NotifyDataSetChanged(),这可能就是为什么不更新网格。

另外,为什么不使用AsyncTasks?

public class LoadAsyncTask extends AsyncTask<Void, Void, Boolean> {
    Context context;

    public LoadAsyncTask(Context context) {
        this.context = context;         
    }

    protected void onPreExecute() {
    }

    protected Boolean doInBackground(Void... v) {
        DBAdapter adapter = new DBAdapter(context);
        adapter.open();
        int childs = gridView.getChildCount(), oldPosition, newPotision;
        newPotision = childs-1;
        for(int i=0 ; i<childs ; i++){
                    oldPosition = random.nextInt(m_cGridView.getChildCount());
                    adapter.updatePosition(oldPosition, newPotision); //updates the position of the images in database
                    newPotision = oldPosition;
        }
        adapter.close();

        DBAdapter adapter = new DBAdapter(context);
        adapter.open();
        Cursor cursor = adapter.getAllImages();
        adapter.close();
        startManagingCursor(cursor);
        cursorAdapter.changeCursor(cursor); //My cursor adapter
        gridView.setAdapter(cursorAdapter);
        cursor.close();                
        return true;
    }

    protected void onPostExecute(Boolean success) {
        if (success) {
            //This will be executed on the main activity thread
            cursorAdapter.notifyDataSetChanged();
        } else {
            showError();
        }
    }

}