У меня есть собственный список в моем приложении. Я использую 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();
}
};
}
добавьте свои ошибки в logcat! – Janmejoy
Если вы специально не инициализируете cnt List и HashMaps внутри него для пустых объектов, объект value 'Object' будет иметь значение null. –
К сожалению, я планировал опубликовать этот вопрос пару дней назад. Я сделал много других изменений в коде, я получаю другие ошибки и не имею для этого logcat. Но ошибка, которую я получил, была исключением null указателя. Index x запрошен с размером y .. Я попытаюсь реплицировать ошибку и опубликовать logcat – ambit