2013-07-17 4 views
0

У меня есть один EditText и один ListView. Элемент в ListView содержит два элемента TextView. Мне нужно фильтровать ListView, если пользователь вводит что-то в EditText. Мой адаптер:текст фильтра в списке viewroid

public class AdapterUserIsp extends ArrayAdapter{ 

public static ArrayList<ItemUserIsp> data = new ArrayList<ItemUserIsp>(); 
Context context; 
int ch = 0; 

public static TextView header4; 
@SuppressWarnings("unchecked") 
public AdapterUserIsp(Context context, int textViewResourceId, ArrayList<ItemUserIsp> arr) { 
    super(context, textViewResourceId, arr); 
    if (arr != null) { 
     data = arr; 
    } 
    this.context = context; 

    // TODO Auto-generated constructor stub 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return data.size(); 
} 

@Override 
public Object getItem(int num) { 
    // TODO Auto-generated method stub 
    return data.get(num); 
} 

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

@SuppressLint("NewApi") 
@Override 
public View getView(int i, View someView, ViewGroup arg2) { 

    LayoutInflater inflater = LayoutInflater.from(context); 
    if (someView == null) { 
     someView = inflater.inflate(R.layout.item_user_isp, arg2, false); 
    } 

    TextView header1 = (TextView) someView.findViewById(R.id.tvUserNameIsp); 
    TextView header2 = (TextView) someView.findViewById(R.id.tvUserPositionIsp); 
    header1.setText(data.get(i).header1); 
    header2.setText(data.get(i).header2); 

    return someView; 
} 

} 

Моя активность:

final ListView lv = (ListView)findViewById(R.id.users); 
    final AdapterUserIsp adapter = new AdapterUserIsp(this,R.id.users,data); 
final EditText search= (EditText)findViewById(R.id.search); 
    search_isp.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
      adapter.getFilter().filter(s); 
      lv.invalidateViews(); 
     } 

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

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

Но это не работает. Зачем? Благодаря!

ответ

0

Вставить следующую строку после lv.invalidateViews(); on onTextChanged.

adapter.notifyDataSetChanged(); 

, а также вы должны реализовать свой класс адаптера из Filterable, если вы хотите переопределить метод фильтра.

если адаптер.notifyDataSetChanged(); не работает, не используйте final для адаптера, получите адаптер внутри onTextChanged и после фильтрации вашего текста.

YourAdapterOrWhateverAdapter adapter = (YourAdapterOrWhateverAdapter) listView.getAdapter(); 
adapter.getFilter().filter(s); 
adapter.notifyDataSetChanged(); 

ПРИМЕЧАНИЕ: Это только догадываться ..

0

Вы должны обновить адаптер.

Если вы просто добавить некоторые новые элементы в списке обр вы должны вызвать:

adapter.notifyDataSetChanged(); 

Если вы хотите, чтобы перерисовывать все элементы, которые вы могли бы установить адаптер снова:

lv.setAdapter(adapter); 

Надежда это поможет вам :)

+0

Когда я вошел что-то, мой ListView не реагирует – uricor

+0

не могли бы вы опубликовать то, что вы ввели? В противном случае я просто могу догадаться, что ты сделал :) – owe

Смежные вопросы