简体   繁体   中英

Android - Listview not getting filtered

I not able to find error- I have to filter listview item according to search. But not work. Here is code

EditText TextWatcher code :-

getEdit_myOrderSearch().addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            adapter.getFilter().filter(s);
            Log.d("", "CharSequence : " + s);

        }

        @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

        }
    });

Here is Adapter code:-

public class Adpater extends BaseAdapter implements Filterable {

private Context mContext;
private LayoutInflater inflater;
private List<Order> orignailOrders;
private List<Order> filterOrders;

public Adpater(Context context, List<Order> orders) {
    this.mContext = context;
    this.orignailOrders = orders;
    this.filterOrders = orders;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;

    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.custom_myorder, parent,
                false);

        viewHolder.orderCode = (TextView) convertView
                .findViewById(R.id.txt_custom_order_code);
        viewHolder.orderTopic = (TextView) convertView
                .findViewById(R.id.txt_custom_order_topic);
        viewHolder.orderDate = (TextView) convertView
                .findViewById(R.id.txt_custom_order_date);
        viewHolder.orderStatus = (TextView) convertView
                .findViewById(R.id.txt_custom_order_status);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.orderCode
            .setText(filterOrders.get(position).getOrder_code());
    viewHolder.orderTopic.setText(filterOrders.get(position).getTopic());
    viewHolder.orderDate.setText(formattedDate);
    viewHolder.orderStatus.setText(filterOrders.get(position)
            .getProject_status());

    return convertView;
}

@Override
public Filter getFilter() {
    Filter filter = new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {

            filterOrders = (ArrayList<Order>) results.values;
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            ArrayList<Order> FilteredArrList = new ArrayList<Order>();

            if (orignailOrders == null) {
                orignailOrders = new ArrayList<Order>(filterOrders);
            }

            if (constraint == null || constraint.length() == 0) {


            } else {
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < orignailOrders.size(); i++) {
                    String data = orignailOrders.get(i).getId();
                    if (data.toLowerCase()
                            .startsWith(constraint.toString())) {
                        FilteredArrList.add(new Order(orignailOrders.get(i)
                                .getOrder_code(), orignailOrders.get(i)
                                .getTopic(), orignailOrders.get(i)
                                .getDdate(), orignailOrders.get(i)
                                .getProject_status()));
                    }
                }
                results.count = FilteredArrList.size();
                results.values = FilteredArrList;
            }
            return results;
        }
    };
    return filter;
}}

Unused code removed from adapter.

Help please and Thanks in advance.

Edit your adapter code, you miss two lines there ie

results.count = orignailOrders.size();
results.values = orignailOrders;

Here is full Adapter code just replace it.

public class Adpater extends BaseAdapter implements Filterable {
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.custom_myorder, parent,
                    false);

            viewHolder.orderCode = (TextView) convertView
                    .findViewById(R.id.txt_custom_order_code);
            viewHolder.orderTopic = (TextView) convertView
                    .findViewById(R.id.txt_custom_order_topic);
            viewHolder.orderDate = (TextView) convertView
                    .findViewById(R.id.txt_custom_order_date);
            viewHolder.orderStatus = (TextView) convertView
                    .findViewById(R.id.txt_custom_order_status);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.orderCode
                .setText(filterOrders.get(position).getOrder_code());
        viewHolder.orderTopic.setText(filterOrders.get(position).getTopic());
        viewHolder.orderDate.setText(formattedDate);
        viewHolder.orderStatus.setText(filterOrders.get(position)
                .getProject_status());
        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                    FilterResults results) {
                filterOrders = (ArrayList<Order>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                ArrayList<Order> FilteredArrList = new ArrayList<Order>();

                if (orignailOrders == null) {
                    orignailOrders = new ArrayList<Order>(filterOrders);
                }

                if (constraint == null || constraint.length() == 0) {
        result.count= orignalOrder.size();
        result.values=orignalOrders;// this line is missing
         } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < orignailOrders.size(); i++) {
                        String data = orignailOrders.get(i).getId();
                        if (data.toLowerCase()
                                .startsWith(constraint.toString())) {
                            FilteredArrList.add(new Order(orignailOrders.get(i)
                                    .getOrder_code(), orignailOrders.get(i)
                                    .getTopic(), orignailOrders.get(i)
                                    .getDdate(), orignailOrders.get(i)
                                    .getProject_status()));
                        }
                    }
                    results.count = FilteredArrList.size();
                    results.values = FilteredArrList;
                }
                return results;
            }
        };
        return filter;
    }
}

This will help you.

This is not the right way to make a searchable ListView and I guess you need many more things in order to get it.

First you need to declare a new searchable filter within your activity at the manifest file.

<activity
        android:name=".Main"
        android:configChanges="orientation|screenSize"
        android:label="@string/app_name"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.SEARCH" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" >
        </meta-data>
    </activity>

Then you have to define your searchable item in res/xml/searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">

And finally you have to handle all the incoming searchables intents in the activity which contains your listView

 @Override
protected void onResume() {
    super.onResume();
    mQueryTask = new QueryRemoteUnits();
    mQueryTask.execute();
    handleIntent(getIntent());
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        executeSearch(query);
    } else {
        executeSearch();
    }
}

private void executeSearch() {
    if (mSearchTask != null) {
        mSearchTask.cancel(true);
    }

    if (mSearchView != null && !mSearchView.isIconified()) {
        String query = mSearchView.getQuery().toString();
        mSearchTask = new SearchRemoteUnits(query);
    } else {
        mSearchTask = new SearchRemoteUnits();
    }
    mSearchTask.execute();
}

private void executeSearch(String namePattern) {
    if (mSearchTask != null) {
        mSearchTask.cancel(true);
    }
    mSearchTask = new SearchRemoteUnits(namePattern);
    mSearchTask.execute();
}

In the link bellow, you have a detailed description about how to build a searchable interface.

Creating a Search Interface

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM