2

だから私は、独自のカスタム arrayadapter を使用するこの ListView を持っています。データベースなどからデータを取得するなど、うまく機能しますが、設定後は更新されません。結果のために何かを行うこのアクティビティがあり、戻ってきたらこれを呼び出します:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }                           
            theClients.notifyDataSetChanged(); //this is not working here                           
            showClientDetails(mCurrentSelectedItemIndex); //update other fragment.
        }
    }

問題は、notifyDataSetChanged()実際には何もしないということです。さらに調査しましたが、UI スレッドで呼び出す必要があると思いますか? しかし、私は FragmentActivity にいますが、これを行う方法がわかりませんか? 実行可能なスレッドを作成して、そこから呼び出す必要があるかもしれません。スレッドをあまり使用していないので、よくわかりませんが、これを行う方法に関する良い (簡潔で完全な) 例はありますか? それともこれも私の問題ですか?

(注: 私は ORM Lite に切り替えました。この前に、この特定の場所にカーソルでSimpleCursorAdaptera を呼び出した後に更新できる a があり、次に.requerynotifyDataSetChanged()

編集:

さて、いくつかのコメントの後、AsyncTask ルートを調査しました...:

private class addViewsToList extends AsyncTask<Void, Void, Boolean>{
         protected void onPostExecute(Boolean result) {
                theClients.notifyDataSetChanged();
            }
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return true;
        }         
    }

そして私の中でonActivityCreated

new addViewsToList().execute();

そして私のonActivityResult(...)

super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }       
                            //do I have to reset the adapter?   
            setListAdapter(theClients);             
                        showClientDetails(mCurrentSelectedItemIndex);
        }

まだリストの更新はありません...

だから私は自分が何をしているのかわからないことを示しました:)

4

1 に答える 1

1

確かに、Runnable にする必要があります。

どのように?新しいデータを更新するアダプターを再フィードし(リストビューで何かを変更したいと思います)、ランナブルを呼び出しますnotifyDataSetChanged()runOnUIThread()UIで更新をトリガーしているため、実際に必要です。または、またはメソッドAsyncTaskのいずれかでリストビューを更新する場所を使用します。onPostExecute()onProgessUpdate()

于 2011-07-27T02:15:14.063 に答える