簡體   English   中英

Android-Listview沒有被過濾

[英]Android - Listview not getting filtered

我找不到錯誤-我必須根據搜索過濾listview項。 但是不行。 這是代碼

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

        }
    });

這是適配器代碼:-

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;
}}

未使用的代碼已從適配器中刪除。

請幫助,並提前致謝。

編輯您的適配器代碼,您錯過了兩行,即

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

這是完整的適配器代碼,只需將其替換即可。

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;
    }
}

這將為您提供幫助。

這不是制作可搜索ListView的正確方法,我想您需要更多的東西才能獲得它。

首先,您需要在清單文件中的活動中聲明一個新的可搜索過濾器。

<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>

然后,您必須在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">

最后,您必須處理包含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();
}

在下面的鏈接中,您具有有關如何構建可搜索界面的詳細說明。

創建搜索界面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM