2013-03-26 2 views
0

У меня есть собственный список в моем приложении. Я использую http-запрос для получения данных в формате JSON. Существует асинктас для загрузки всех данных (кроме изображений) для списка.Android: Невозможно реализовать поиск в lazyloading listview

В onpostexecute() этой asyntask я вызываю еще одну асинтезу для получения изображений для списка.

Теперь я пытаюсь реализовать функцию поиска на ListView с помощью textchangedlistener

Проблемы с изображением получения загружается в фоновом режиме, я часто впадать в исключения нулевого указателя.

Может ли кто-нибудь предложить мне способ избавиться от этого. То, что я делаю в настоящее время, заключается в том, что я пока не показываю текст для поиска до загрузки изображений. Но это заставляет пользователя ждать много, особенно для длинных списков.

Весь код слишком длинный для публикации. Итак, я просто вкратце расскажу об этом. Дайте мне знать, если вам нужно что-нибудь еще. Я тоже это сделаю.

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(); 
       } 
    }; 


} 
+0

добавьте свои ошибки в logcat! – Janmejoy

+0

Если вы специально не инициализируете cnt List и HashMaps внутри него для пустых объектов, объект value 'Object' будет иметь значение null. –

+0

К сожалению, я планировал опубликовать этот вопрос пару дней назад. Я сделал много других изменений в коде, я получаю другие ошибки и не имею для этого logcat. Но ошибка, которую я получил, была исключением null указателя. Index x запрошен с размером y .. Я попытаюсь реплицировать ошибку и опубликовать logcat – ambit

ответ

0

Во-первых, я бы не выполнять тяжелую задачу, как загрузка изображений в onPostExecute потому, что этот метод работает на UI потоке. Вы просто блокируете пользовательский интерфейс с помощью ImageLoaderTask. Я попытался загрузить изображения вместе со всем остальным в первой AsyncTask. Проблема в том, что вы одновременно просматриваете и изменяете список. Попытайтесь сделать загрузку изображения onBackground из ListViewLoaderTask

+0

ImageLoaderTask также является AsynTask. он не запускается в пользовательском интерфейсе. –

+0

@el_bhm Из того, что я видел, он работает в пользовательском интерфейсе. У меня была та же задача, что и 1) загрузить json 2) разобрать изображение. И да, разбор onPostExecute, даже с AsyncTask, замедляет ui. Проблема в том, что вы изменяете адаптер при поиске, обычно – Roman

+0

Метод onpostexecute() вызывает другую асинтезу, которая выполняет задачу загрузки изображений в фоновом режиме. Таким образом, поток пользовательского интерфейса не блокируется. И причина сохранения двух асинтетов заключается в том, что изображения являются вторичными, и мы думаем, что пользователь хотел бы получить другие данные сначала, пока изображения будут показаны позже – ambit