0

アプリにカスタム リストビューがあります。http リクエストを使用して、データを JSON 形式で取得します。リストビューのデータ全体 (画像を除く) をロードする asynctask があります。

この非同期タスクの onpostexecute() で、別の非同期タスクを呼び出してリストビューの画像を取得します。

今、textchangedlistener を使用してリストビューに検索機能を実装しようとしています。

問題は、画像がバックグラウンドで読み込まれることです。私はしばしば null ポインター例外に遭遇します。

誰でもこれを取り除く方法を提案できますか。私が現在行っていることは、画像が読み込まれるまで検索ボックスの編集テキストを表示しないことです。しかし、これにより、特に長いリストの場合、ユーザーはかなり待たされます。

コード全体が長すぎて投稿できません。というわけで、ここに簡単な概要を貼り付けます。他に何か必要な場合はお知らせください。私もそうします。

public class abcd extends Activity {
    ListView todlistview;
    List<HashMap<String, Object>> cnt = null;
    ArrayList<HashMap<String, Object>> searchResults; /

    .
    .




     /** AsyncTask to parse json data and load ListView */
    private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{


        @Override
        protected SimpleAdapter doInBackground(String... strJson) {
        .
        .
        .

            adapter = new SimpleAdapter(getBaseContext(), cnt, com.example.promoapp.R.layout.textviewfield, from, to);

            return adapter;
        }

        @Override
        protected void onPostExecute(SimpleAdapter adapter) {

            searchResults=new ArrayList<HashMap<String, Object>> (cnt);

            // Setting adapter for the listview
            todlistview.setAdapter(adapter);

            for(int i=0;i<adapter.getCount();i++){
                HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i);
                .
        .


        ImageLoaderTask imageLoaderTask = new ImageLoaderTask();
                // Starting ImageLoaderTask to download and populate image in the listview
                imageLoaderTask.execute(hm); 
            }
        }
    }

    /** AsyncTask to download and load an image in ListView */
    private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{

        Dialog dil;
        @Override
        protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) {

            InputStream iStream=null;
                  .


                // Create a hashmap object to store image path and its position in the listview
                // Storing the path to the temporary image file
                // Storing the position of the image in the listview
                // Returning the HashMap object containing the image path and position

        }

        @Override
        protected void onPostExecute(HashMap<String, Object> result) {

        }



    }


    private TextWatcher filterTextWatcher = new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

        String searchString=Search.getText().toString();
                int textLength=searchString.length();               

                searchResults.clear();

                for(int i=0;i<cnt.size();i++)
                {
                    String placeName=cnt.get(i).get("country").toString();

                    if(textLength<=placeName.length()){
                        //compare the String in EditText with Names in the ArrayList
                        if(searchString.equalsIgnoreCase(placeName.substring(0,textLength))){
                            //Toast.makeText(getApplicationContext(),placeName,1).show();
                            searchResults.add(cnt.get(i));
                        }
                    }
                }

                String[] from = { "country","flag","details"};
                 int[] to = { com.example.promoapp.R.id.tv_country,com.example.promoapp.R.id.iv_flag,com.example.promoapp.R.id.tv_country_details};
                 adapter = new SimpleAdapter(getBaseContext(), searchResults, com.example.promoapp.R.layout.textviewfield, from, to);
                 todlistview.setAdapter(adapter);
                adapter.notifyDataSetChanged(); 
              }
     };


}
4

1 に答える 1

0

まず、このメソッドは UI スレッドで動作するため、 onPostExecuteでの画像の読み込みなどの重いタスクは実行しません。ImageLoaderTask で UI をブロックするだけです。最初の AsyncTask で、他のすべてのものと一緒に画像を読み込もうとします。問題は、リストの検索と変更を同時に行っていることです。ListViewLoaderTask のonBackgroundで画像の読み込みを実行してみてください

于 2013-03-26T15:10:25.947 に答える