2015-01-17 6 views
2

Я пытаюсь использовать searchView с LazyList. В моем lazyAdapter я обновляю свой arraylist, это работает плавно, но мой список не обновляется с помощью arrayList. Это мой метод фильтрации. Я полагаю, notifyDataSetChanged не работает. Пожалуйста, помогите, как я могу обновить свой список?LazyList's listview не может обновиться с новым arraylist

public void filter(String charText) { 

    charText = charText.toLowerCase(Locale.getDefault()); 
    //list.clear(); 
    list = new ArrayList<HashMap<String, String>>(); 
    if (charText.length() == 0) { 
     list.addAll(arraylist); 
    } 
    else 
    { 
     for (HashMap<String, String> map : arraylist) 
     { 
      if (map.get("radio").toString().toLowerCase(Locale.getDefault()).contains(charText)) 
      { 
       list.add(map); 
      } 
     } 
    } 
    notifyDataSetChanged(); 
} 
+0

переустановить адаптер для списка, такого как lv.setAdapter (адаптер); –

ответ

1

Переменная list имеет другой объект после третьей строки. Вы меняете этот новый ArrayList, но адаптер все еще помнит старый. Вместо

list = new ArrayList<HashMap<String, String>>(); 

записи

list.clear(); 

Вы затем работать с тем же объектом, как и раньше.

+0

Спасибо, что это правильный ответ. – user3820266

1

ListView LazyList «s не может обновить с новым ArrayList

Потому что вы не добавляете новый список в текущем адаптере Listview перед вызовом notifyDataSetChanged():

Добавить list к адаптеру с помощью addAll метод:

listviewAdapter.addAll(list); 
//notify data-source change to adapter 
notifyDataSetChanged(); 

если addAll метод не доступен, то создать метод в классе адаптера и передать список в качестве параметра затем вызвать метод добавления:

public void addAll(ArrayList<HashMap<String, String>> data) { 
    for(String item: data) { 
     add(item); 
     } 
     notifyDataSetChanged(); 
    } 
0
 public class MovieListAdapter extends BaseAdapter { 
     private Context context; 
     ArrayList<HashMap<String, String>> movielist; 
     private ArrayList<HashMap<String, String>> listAdapter; 

     public MovieListAdapter(Context context, ArrayList<HashMap<String, String>> movielist) { 
      this.context = context; 
      this.movielist = movielist; 
      this.listAdapter = new ArrayList<HashMap<String, String>>(); 
      this.listAdapter.addAll(movielist); 

     } 

     @Override 
     public int getCount() { 

      return movielist.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return movielist.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View griView = inflater.inflate(R.layout.movie_listitem, null); 
      TextView textview = (TextView) griView.findViewById(R.id.catname); 

      textview.setText(movielist.get(position).get("name")); 
      textview.setSelected(true); 
      ImageView imageView = (ImageView) griView.findViewById(R.id.catimage); 

      DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
      int width = metrics.widthPixels/3; 
      int height = metrics.widthPixels/3; 

      // System.out.println(movielist.get(position).getMoviepicture()); 

      if (movielist.get(position).get("image").equals("")) { 
       imageView.setImageResource(R.drawable.blankart); 
      } else { 
       Picasso.with(context) 
         .load(movielist.get(position).get("image")) 
         .resize(width, height).placeholder(R.drawable.blankart) 
         .noFade().into(imageView); 
      } 
      return griView; 
     } 

     public void filter(String charText) { 
      charText = charText.toLowerCase(Locale.getDefault()); 
      movielist.clear(); 
      if (charText.length() == 0) { 
       movielist.addAll(listAdapter); 
      } else { 
       for (HashMap<String, String> si : listAdapter) { 
        if (si.get("name").toLowerCase(Locale.getDefault()) 
          .contains(charText)) { 
         movielist.add(si); 
        } 
       } 
      } 
      notifyDataSetChanged(); 
     } 
    } 
    make you adapter like this