2012-08-07 34 views
5

Özel bir ArrayAdapter var, bu yüzden ListView adresinde bulunan Başlık/Altyazı görünümünü kullanabiliyorum. Bir dize kabul eden ve bağdaştırıcıyı filtreleyen bir EditText var. Filtre doğru nesneleri filtrelediğini anlamda çalışırAndroid Custom ArrayAdapter, filtre sonrasında yenilemiyor

(Bunun üzerine tıklayarak söyleyebilir ve doğru "ekstra" ile niyet başlar.)

Ancak bile Filtrelerin çalışma da, Bağdaştırıcıdaki öğeler doğru bilgileri görüntülemek için güncelleştirilmez ... Başlık ve altyazı yanlış.

ListView öğesinden 0 - 9 arası öğelere sahip olduğumuzu söylerseniz, bir aramayla 3 öğeye filtre uygularım ve filtrelenen öğelerin 5, 6, 9 ... 3 öğenin görüntülendiğini, ancak ilk 3 olduğunu Orijinal ön aramadaki öğeler ListView (0-2). Eğer madde 2'ye (üçüncü öğe) tıklarsam, 9'un içeriği yeni amaçta yer alır. Bu, arama kriterleri için doğrudur, ancak başlık doğru bilgiyi yansıtmıştır.

Yenilemek için ListView neye anlatmam gerektiğini bilmiyorum. Sanırım herhangi bir yardımın takdir edilmediğini düşünmüyorum. Teşekkürler!

public class myListAdapter extends ArrayAdapter<Pizza>{ 
    private ArrayList<Pizza> items; 
    private PizzaViewHolder myListHolder; 

    private class PizzaViewHolder{ 
     TextView title; 
     TextView subtitle; 
    } 

    public myListAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { 
     super(context, textViewResourceId, items); 
     this.items = items; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent){ 
     View v = convertView; 
     if(v == null){ 
      LayoutInflater vi = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.myList_item, null); 
      myListHolder = new PizzaViewHolder(); 
      myListHolder.title = (TextView)v.findViewById(R.id.title); 
      myListHolder.subtitle = (TextView)v.findViewById(R.id.subtitle); 
      v.setTag(myListHolder); 
     }else myListHolder = (PizzaViewHolder)v.getTag(); 

     Pizza myList = items.get(pos); 

     if (myList != null){ 
      myListHolder.title.setText(myList.getTitle()); 
      myListHolder.subtitle.setText(myList.getSubTitle()); 
     }  
     return v;   
    } 
} 

Bu

o benim özel ArrayAdapter için özel Filtre gerekli görünüyor, kararlıyım kadarıyla arama

private TextWatcher filterTextWatcher = new TextWatcher(){ 

    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 
     if(!s.equals("")){ 
      ((Filterable) this.listView1.getAdapter()).getFilter().filter(s); 
      } 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     // TODO Auto-generated method stub 

    } 

}; 
+0

Standart bir adaptörün kullanılması iyi değil, notifyDataSetChanged kullanılmasına gerek yok, benim özel bağdaştırıcım –

cevap

13

olduğunu. özel ArrayAdapter burada, Filtre geçersiz kılınmış bir uygulama vardır kodudur:

import java.util.ArrayList; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.TextView; 

public class PizzaAdapter extends ArrayAdapter<Pizza>{ 

private ArrayList<Pizza> original; 
private ArrayList<Pizza> fitems; 
private Filter filter; 


public PizzaAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { 
    super(context, textViewResourceId, items); 

    this.original = new ArrayList<Pizza>(items); 
    this.fitems = new ArrayList<Pizza>(items); 
    this.filter = new PizzaFilter(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    View v = convertView; 

    if(v == null){ 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.pizza_list_item, null); 
    } 

    Pizza pizza = fitems.get(position); 

    if(pizza != null){ 
     String subtitleString = new String("[" + pizza.getPizzaType() + "] " + pizza.getPizzaCategory() + ": " + pizza.getPizzaCode()); 

     TextView title = (TextView)v.findViewById(R.id.title); 
     TextView subtitle = (TextView)v.findViewById(R.id.subtitle); 

     if(title != null){ 
      title.setText(pizza.getPizzaName()); 
     } 
     if(subtitle != null){ 
      subtitle.setText(subtitleString); 
     } 
    } 
    return v; 
} 

@Override 
public Filter getFilter(){ 

    if(filter == null){ 
     filter = new PizzaFilter(); 
    } 
    return filter; 
} 

private class PizzaFilter extends Filter{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint){ 
     FilterResults results = new FilterResults(); 
     String prefix = constraint.toString().toLowerCase(); 

     if (prefix == null || prefix.length() == 0){ 
      ArrayList<Pizza> list = new ArrayList<Pizza>(original); 
      results.values = list; 
      results.count = list.size(); 
     }else{ 
      final ArrayList<Pizza> list = new ArrayList<Pizza>(original); 
      final ArrayList<Pizza> nlist = new ArrayList<Pizza>(); 
      int count = list.size(); 

      for (int i = 0; i<count; i++){ 
       final Pizza pizza = list.get(i); 
       final String value = Pizza.getPizzaName().toLowerCase(); 

       if(value.contains(prefix)){ 
        nlist.add(pizza); 
       } 
       results.values = nlist; 
       results.count = nlist.size(); 
      } 
     } 
     return results; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     fitems = (ArrayList<Pizza>)results.values; 
     notifyDataSetChanged(); 
     clear(); 
     int count = fitems.size(); 
     for(int i = 0; i<count; i++){ 
      add(fitems.get(i)); 
      notifyDataSetInvalidated(); 
     } 
    } 
} 
} 

Bu aramayı yaparken Filtre özel implmentation ekran güncelledi çıkıyor. Umarım bu bazı insanlara yardımcı olur.

+3

yenilemeyi internet üzerinden en iyi ve en basit örneklerden biri. + – AlexAndro

+0

Bunu çözmek için kodunuzu nasıl kullanabileceğime dair herhangi bir fikir: http://stackoverflow.com/questions/20524417/listview-is-blank-while-using-getfilter-function – Si8

+0

'String prefix = constraint.toString(). toLowerCase(); 'NullPointerException öğesini atabilir – mallaudin