简体   繁体   English

Android-Listview没有被过滤

[英]Android - Listview not getting filtered

I not able to find error- I have to filter listview item according to search. 我找不到错误-我必须根据搜索过滤listview项。 But not work. 但是不行。 Here is code 这是代码

EditText TextWatcher code :- EditText TextWatcher代码:-

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. 这不是制作可搜索ListView的正确方法,我想您需要更多的东西才能获得它。

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 然后,您必须在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 最后,您必须处理包含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 创建搜索界面

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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