オブジェクトのArrayAdapterのカスタムリストにフィルタを適用しました。私はフィルター処理を適用しており、初めてのみ作業しています。フィルタリングされたテキストを削除して別のテキストを入力しようとすると、ListViewで更新されたデータが表示されません。ここではそれのための私のコード、ArrayAdapterフィルタリングは、初めて初めて動作します。次の入力で失敗しました
アダプタクラス}
のEditText TextWatcherコード
public class ServiceListAdapter extends ArrayAdapter<ServiceItem> implements Filterable {
private Context mContext;
private List<ServiceItem> serviceItemList;
private List<ServiceItem> nameList;
private LayoutInflater inflater;
private int layoutId;
private ServiceFilter filter;
public ServiceListAdapter(Context context, int resource, List<ServiceItem> serviceItemList) {
super(context, resource, serviceItemList);
this.mContext = context;
this.serviceItemList = serviceItemList;
this.layoutId = resource;
this.inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ServiceHolder sHolder = null;
if (v == null) {
v = inflater.inflate(layoutId, null);
sHolder = new ServiceHolder();
sHolder.serviceName = (TextView) v.findViewById(R.id.serviceName);
sHolder.serviceDetail = (TextView) v.findViewById(R.id.serviceDetail);
sHolder.serviceImg = (ImageView) v.findViewById(R.id.serviceImg);
sHolder.btnGo = (Button) v.findViewById(R.id.btnGo);
v.setTag(sHolder);
} else {
sHolder = (ServiceHolder) convertView.getTag();
}
ServiceItem serviceItem = getItem(position);
sHolder.serviceName.setText(serviceItem.getServiceName());
sHolder.serviceDetail.setText(serviceItem.getServiceDetail());
sHolder.serviceImg.setImageResource(serviceItem.getServiceImg());
sHolder.btnGo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return v;
}
static class ServiceHolder {
TextView serviceName;
TextView serviceDetail;
ImageView serviceImg;
Button btnGo;
}
@Override
public ServiceItem getItem(int position) {
return serviceItemList.get(position);
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ServiceFilter();
}
return filter;
}
private class ServiceFilter extends Filter {
private static final String TAG = "Filter";
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
Log.d(TAG, "Length: " + constraint.toString().length());
if (constraint != "" && constraint.toString().length() > 0) {
ArrayList<ServiceItem> filterItems = new ArrayList<>();
ArrayList<ServiceItem> sItems = new ArrayList<>();
synchronized (this)
{
sItems.addAll(serviceItemList);
}
constraint = constraint.toString().toLowerCase();
Log.d(TAG, "To Compare:: " + constraint);
for (int l = 0; l< sItems.size(); l++) {
Log.d(TAG, "sItems Size:" + sItems.size());
ServiceItem sItem = sItems.get(l);
String name = sItem.toString();
Log.d(TAG, "Name: " + name);
if (name.startsWith(constraint.toString().toLowerCase())){
Log.d(TAG, "Added: " + name);
filterItems.add(sItem);
}
}
Log.d(TAG, "Filter Item Size: " + filterItems.size());
filterResults.count = filterItems.size();
filterResults.values = filterItems;
} else {
synchronized (this) {
Log.d(TAG, "performFiltering: ORIGINAL ");
Log.d(TAG, "Filter Item Size: " + serviceItemList.size());
filterResults.values = serviceItemList;
filterResults.count = serviceItemList.size();
}
}
Log.d(TAG, "Count:" + filterResults.count);
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
/*nameList is List<ServiceItem> declared in root class*/
nameList = (ArrayList<ServiceItem>) results.values;
notifyDataSetChanged();
clear();
for(int i = 0, l = nameList.size(); i < l; i++)
add(nameList.get(i));
notifyDataSetInvalidated();
}
}
です:だから
edtFilterText.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("Filter", "beforeTextChanged: " +s);
serviceListAdapter.getFilter().filter(s.toString().toLowerCase());
}
});
、私はろ過の結果を得た唯一初めて。その後、editTextコンテンツを変更しようとすると、フィルタ項目に結果が表示されず、メインserviceItemsのリストサイズが項目なしでゼロに表示されます。
私はすでに多くの回答を試みてきましたが、私の結果はこのように動作します。あなたのために