【问题标题】:Android: ListView making a search FilterAndroid:ListView制作搜索过滤器
【发布时间】:2011-07-25 21:51:57
【问题描述】:

有没有办法在使用 BaseAdapter 而不是 ArrayAdapter 创建的自定义列表视图上创建搜索过滤器,因为我只遇到过在自定义列表视图中使用 ArrayAdapters 的方法。以下是我遇到的Making a filter using Array Adapter

【问题讨论】:

  • 我应该在我的 BaseAdapter 中实现 Filterable 接口吗?
  • 你在用什么,光标还是数组还是别的什么?
  • 有什么样的收藏?
  • @dziobas 列表集合

标签: android listview filter adapter base


【解决方案1】:

如果您使用 List 集合,则扩展 ArrayAdapter - 它是 BaseAdapter 的子类。

覆盖 getView 方法(在您的情况下,只需复制旧的 getView 代码并稍作修改)。

覆盖集合中对象的 toString 并设置:

listView.setTextFilterEnabled(true);

【讨论】:

  • 我现在正在做这个class FriendsListAdapter extends BaseAdapter implements Filterable 请告诉我你覆盖 BaseAdapter 是什么意思?
  • 正如我所写,重写 ArrayAdapter 会简单得多:class FriendsListAdapter extends ArrayAdapter<Friend>
  • 或在布局中为ListView添加android:textFilterEnabled="true"
【解决方案2】:

这是使用基本适配器创建的列表视图的示例。 我进行了很多搜索,但没有得到任何令人满意的解决方案。因此我想把它放出来,以便将来可以帮助其他人。

这里是history_container.xml

的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" 
        android:id="@+id/filter_text" />
    <FrameLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/historyContainerLayout" />
</LinearLayout>

这里是history_list_view.xml

的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:gravity="left|center"
    android:layout_width="wrap_content" android:paddingBottom="5px"
    android:paddingTop="5px" android:paddingLeft="5px">
    <TextView android:text="@+id/historytext" android:id="@+id/historytext"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_marginLeft="10px" android:textColor="#0099CC"/>
</LinearLayout>

这里是history_schedule.xml

的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ScrollView android:id="@+id/scrollItemInfo"
        android:layout_width="fill_parent" android:layout_height="1000dip">
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent" android:layout_height="fill_parent">
                <ListView android:id="@+id/historylist" android:layout_height="1000dip"
                        android:layout_width="fill_parent"/>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

抱歉,我无法以正确的格式输入代码。似乎有些东西已经改变,因为没有标签了,这很好。但是为了用户方便,使用标签也是一个好主意。 也许是我的错,我无法以正确的格式发布。似乎我们无法发布 xml 文件内容..所以,想想布局是如何设计的。

活动代码是:-

package com.testfilter;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.TextView;


public class TestFilterListView extends Activity {
    FrameLayout historyContainer;
    ViewStub viewStub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.history_container);
        historyContainer = (FrameLayout) findViewById(R.id.historyContainerLayout);
        EditText filterEditText = (EditText) findViewById(R.id.filter_text);
        filterEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                historyContainer.removeAllViews();
                final List<String> tempHistoryList = new ArrayList<String>();
                tempHistoryList.addAll(historyList);
                for(String data : historyList) {
                    if(data.indexOf((s.toString())) == -1) {
                        tempHistoryList.remove(data);
                    }
                }
                viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule);
                viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
                {
                    public void onInflate(ViewStub stub, View inflated)
                    {

                        setUIElements(inflated, tempHistoryList);
                    }
                });
                historyContainer.addView(viewStub);
                viewStub.inflate();

            }

            @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

            }
        });

        setViewStub();
    }


    /********************************************************************************************************/
    private void setViewStub()
    {
        historyList.add("first");
        historyList.add("second");
        historyList.add("third");
        historyList.add("fourth");
        historyList.add("fifth");
        historyList.add("sixth");
        historyList.add("seventh");


        viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule);
        viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
        {
            public void onInflate(ViewStub stub, View inflated)
            {

                setUIElements(inflated, historyList);
            }
        });
        historyContainer.addView(viewStub);
        viewStub.inflate();
    }

    /********************************************************************************************************/
    final List<String> historyList = new ArrayList<String>();
    String displayName = "";
    ListView historyListView;
    private void setUIElements(View v, List<String> historyLists)
    {

        if (v != null)
        {
            historyScheduleData.clear();
            //historyList.clear();

            historyScheduleData.addAll(historyLists);
            historyListView = (ListView) findViewById(R.id.historylist);
            historyListView.setAdapter(new BeatListAdapter(this));

            registerForContextMenu(historyListView);


        }
    }

    /********************************************************************************************************/
    private static class BeatListAdapter extends BaseAdapter {
        private LayoutInflater mInflater;

        public BeatListAdapter(Context context) {
            mInflater = LayoutInflater.from(context);

        }

        public int getCount() {
            return historyScheduleData.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.history_list_view, null);
                holder = new ViewHolder();
                holder.historyData = (TextView) convertView
                        .findViewById(R.id.historytext);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.historyData.setText(historyScheduleData.get(position));

            return convertView;
        }

        static class ViewHolder {

            TextView historyData;
        }
    }

    private static final List<String> historyScheduleData = new ArrayList<String>();


}

【讨论】:

【解决方案3】:

ArrayAdapter 是 BaseAdapter 的子类。

ArrayAdapter 的源代码是here。来看看吧。。

这应该可以解决您的问题。

【讨论】:

    【解决方案4】:

    这是一个例子。编辑和使用你需要的东西。

    public class CustomListAdapter extends BaseAdapter {
    private ArrayList<String> countryStringList;
    private ArrayList<Integer> countryImageList;
    private LayoutInflater mInFlater;
    // private Bitmap mIcon1;
    // private Bitmap mIcon2;
    private int layoutID;
    private Context context;
    // private LayoutInflater mInflater;
    public CustomListAdapter(Context context, int textViewResourceId,
            ArrayList<String> stringObjects, ArrayList<Integer> imgObjects) {
        super();
        this.context = context;
        countryStringList = stringObjects;
        countryImageList = imgObjects;
        layoutID = textViewResourceId;
        mInFlater = LayoutInflater.from(context);
    }
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        // return countryStringList.size();
        return countryStringList.size();
    }
    
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;
        if (convertView == null) {
    
            convertView = mInFlater.inflate(layoutID, null);
            holder = new ViewHolder();
            holder.textCountryName = (TextView) convertView
                    .findViewById(R.id.txtSelectedCountryName);
            holder.icon = (ImageView) convertView
                    .findViewById(R.id.imgSelectedCountryImage);
            holder.textCountryPosition = (TextView) convertView
                    .findViewById(R.id.txtSelectedCountryPosition);
            // holder.checkBoxListView=(CheckBox)convertView.findViewById(R.id.CheckBoxListView);
            holder.relativeLayoutList = (RelativeLayout) convertView
                    .findViewById(R.id.relativeLayoutListItem);
            holder.checkBoxListView = (CheckBox) convertView
                    .findViewById(R.id.checkBoxSelectedCountry);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
            // holder=(ViewHolder)convertView.findViewById(R.id.TextViewIcon1)
        }
        holder.checkBoxListView.setTag(position);
        holder.textCountryName.setText(countryStringList.get(position));
        holder.textCountryPosition.setText(position + 1 + "/"
                + countryStringList.size());
        holder.icon.setImageResource((countryImageList.get(position)));
        if (ListViewController.checkStatusList.get(position).equalsIgnoreCase("present")) {
            holder.checkBoxListView.setVisibility(View.VISIBLE);
        } else {
            holder.checkBoxListView.setVisibility(View.GONE);
        }
        /*
         * holder.checkBoxListView.setOnCheckedChangeListener(new
         * OnCheckedChangeListener(){
         * 
         * @Override public void onCheckedChanged(CompoundButton buttonView,
         * boolean isChecked) { // TODO Auto-generated method stub
         * 
         * ListActivityImplementation listActivityImplementation = new
         * ListActivityImplementation(); //show("Checkbox");
         * ListActivityImplementation.countryStringList.remove(position);
         * ListActivityImplementation.countryImageList.remove(position);
         * ListActivityImplementation.lv.invalidateViews();
         * 
         * //ListActivityImplementation.show("Checkbox"); }
         * 
         * }) ;
         */
        holder.textCountryName.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                holder.textCountryPosition.setText(position + 1 + "/"
                        + countryStringList.size() + "clicked");
            }
    
        });
        holder.checkBoxListView
                .setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() {
    
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        MathHelper.showToast(context, buttonView.getTag()
                                + " clicked");
                    }
                });
        return convertView;
    }
    }
    class ViewHolder {
    TextView textCountryName;
    ImageView icon;
    TextView textCountryPosition;
    RelativeLayout relativeLayoutList;
    CheckBox checkBoxListView;
    

    }

    【讨论】:

    • 谢谢你,但我想知道如何将 Filterbale 接口与基本适配器一起使用,以便我可以过滤搜索我的列表视图
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2017-11-08
    • 2011-08-14
    • 2019-03-04
    • 2018-09-24
    相关资源
    最近更新 更多