我想添加一個搜索文本框到我的列表視圖,以便做一些過濾和我的列表適配器使用自定義對象而不是簡單的字符串。該搜索似乎乍一看,但適配器不更新,如果我刪除過濾字符串。ListView過濾問題Android
下面是我曾嘗試:
這是我的自定義ArrayAdapter
:
public class ArticolAdapter extends OrderManagerAdapter<Articol> implements Scrollable {
private List<Articol> orderList;
private final LayoutInflater inflater;
private final Context context;
public ArticolAdapter(Context context, List<Articol> objects) {
super(context, objects);
this.inflater = LayoutInflater.from(context);
this.orderList = objects;
this.context = context;
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_articol, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.numeTV);
holder.deLivrat = (TextView) convertView.findViewById(R.id.de_livrat);
holder.articolPoza = (ImageView) convertView.findViewById(R.id.pictureCategory);
holder.observatiiTV = (TextView) convertView.findViewById(R.id.observatii);
holder.incarcatTV = (TextView) convertView.findViewById(R.id.incarcat);
holder.background = (RelativeLayout) convertView.findViewById(R.id.expandable_toggle_button);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Articol articol = getItem(position);
holder.name.setText(articol.getNume());
System.out.println(articol.getNume());
holder.deLivrat.setText("De livrat: " + Constants.DF.format(articol.getComandat()));
holder.incarcatTV.setText("Incarcat: " + fmt(articol.getIncarcat()));
holder.observatiiTV.setText("Observatii: " + articol.getObservatii());
holder.background.setPadding(5, 5, 5, 5);
if (articol.getComandat() == articol.getIncarcat()) {
holder.background.setBackground(context.getResources().getDrawable(R.drawable.list_item_completed));
} else {
holder.background.setBackground(context.getResources().getDrawable(R.drawable.list_item_bg));
}
return convertView;
}
public static String fmt(double d) {
if (d == (int) d)
return String.format("%d", (int) d);
else
return String.format("%s", d);
}
@Override
public String getIndicatorForPosition(int childposition, int groupposition) {
return Character.toString(orderList.get(childposition).getNume().charAt(0));
}
@Override
public int getScrollPosition(int childposition, int groupposition) {
return childposition;
}
private class ViewHolder {
private TextView name, deLivrat, observatiiTV, incarcatTV;
private ImageView articolPoza;
private RelativeLayout background;
}
private List<Articol> orig;
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final ArrayList<Articol> results = new ArrayList<Articol>();
if (orig == null) {
orig = orderList;
}
if (constraint != null) {
if (orig != null && orig.size() > 0) {
for (final Articol g : orig) {
if (g.getNume().toLowerCase()
.contains(constraint.toString())) {
results.add(g);
}
}
}
oReturn.values = results;
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
orderList = (ArrayList<Articol>) results.values;
notifyDataSetChanged();
clear();
for (Articol anOrderList : orderList) {
add(anOrderList);
}
notifyDataSetInvalidated();
}
};
}
}
的OrderManagerAdapter
:
public class OrderManagerAdapter<T> extends ArrayAdapter<T> {
private final List<T> objects;
private final Object mLock;
public OrderManagerAdapter(Context context) {
super(context, 0);
objects = new ArrayList<T>();
mLock = new Object();
setNotifyOnChange(false);
}
public OrderManagerAdapter(Context context, List<T> objects) {
super(context, 0);
this.objects = objects;
mLock = new Object();
}
@Override
public void add(T object) {
synchronized (mLock) {
objects.add(object);
}
}
@Override
public void addAll(Collection<? extends T> collection) {
synchronized (mLock) {
objects.addAll(collection);
}
}
@Override
public void insert(T object, int index) {
synchronized (mLock) {
objects.add(index, object);
}
}
@Override
public void remove(T object) {
synchronized (mLock) {
objects.remove(object);
}
}
@Override
public void clear() {
synchronized (mLock) {
objects.clear();
}
}
@Override
public int getCount() {
return objects.size();
}
@Override
public T getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getPosition(T item) {
return objects.indexOf(item);
}
public List<T> getObjects() {
return objects;
}
}
,這是我的片段裏面EditText
代碼:
EditText inputSearch = (EditText) rootView.findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
Log.d(Constants.TAG, "*** Search value changed: " + s.toString());
adapter.getFilter().filter(s);
}
});
搜索似乎是第一次過濾的工作,在某種意義上說,我鍵入一些過濾器字符串,列表得到更新,但是當我清除文本我看不到顯示的原始列表,我得到一個空的列表。
因爲你可能會刪除列表中的所有元素listList顯示代碼適配器 – KOTIOS
更新與適配器代碼 –