Android 寻找listview上搜索函数的最佳匹配解决方案

Android 寻找listview上搜索函数的最佳匹配解决方案,android,Android,我想在自定义列表视图中添加一个搜索功能。实际上,我在网上搜索了几个小时,但我无法理解所有那些复杂的教程或演示,所以我决定把我的问题发布在这里。希望有人能帮我解决这个问题。这是我的密码 ListView lv; EditText inputSearch; CustomListView testingAdapter; //at oncreate method lv = (ListView) findViewById(R.id.lvEditSavingList)

我想在自定义列表视图中添加一个搜索功能。实际上,我在网上搜索了几个小时,但我无法理解所有那些复杂的教程或演示,所以我决定把我的问题发布在这里。希望有人能帮我解决这个问题。这是我的密码

    ListView lv;
    EditText inputSearch;
    CustomListView testingAdapter;
    //at oncreate method
    lv = (ListView) findViewById(R.id.lvEditSavingList);
    inputSearch = (EditText) findViewById(R.id.inputSearch);
    loadListViewData();

    private void loadListViewData() {
    // TODO Auto-generated method stub
    UnderControlDb db = new UnderControlDb(getApplicationContext());
    String[] info = db.MySavingShowData();
    int counter = info.length;
    Integer[] imageID = new Integer[counter];
    for(int i=0;i<counter;i++){
        imageID[i] = R.drawable.edit_notes_list;
    }
    testingAdapter = new CustomListView(MySaving.this, info, imageID);
    lv.setAdapter(testingAdapter);
}
ListView-lv;
编辑文本输入搜索;
CustomListView测试适配器;
//立即创建方法
lv=(ListView)findViewById(R.id.lvEditSavingList);
inputSearch=(EditText)findViewById(R.id.inputSearch);
loadListViewData();
私有void loadListViewData(){
//TODO自动生成的方法存根
UnderControlDb=新的UnderControlDb(getApplicationContext());
String[]info=db.MySavingShowData();
int计数器=信息长度;
整数[]imageID=新整数[计数器];

对于(inti=0;i,我编写了一个小示例,向您展示如何从listView中搜索数据。 找到下面的代码,并不要犹豫,问我任何问题,以进一步澄清

public class TestSearch extends Activity {
    ListView lv;
    EditText inputSearch;
    CustomListView testingAdapter;

    public class listContent{
        public String info;
        public int imageInfo;

        public listContent(String info, int imageInfo) {
            this.info = info;
            this.imageInfo = imageInfo;
        }
        public String getInfo() {
            return info;
        }
        public void setInfo(String info) {
            this.info = info;
        }
        public int getImageInfo() {
            return imageInfo;
        }
        public void setImageInfo(int imageInfo) {
            this.imageInfo = imageInfo;
        }

    }

    ArrayList<listContent> itemsContent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_search);
        itemsContent = new ArrayList<listContent>();
        CustomListView testingAdapter;
        lv = (ListView) findViewById(R.id.lvEditSavingList);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
        inputSearch.addTextChangedListener(textWatcher);
        loadListViewData();
    }
    private TextWatcher textWatcher = new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {
            String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
            testingAdapter.filter(text);
        }
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) { 
        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
        }
    };
    private void loadListViewData() {
        // TODO Auto-generated method stub
        itemsContent.add(new listContent("text", R.drawable.ic_launcher));
        itemsContent.add(new listContent("hello", R.drawable.ic_launcher));
        itemsContent.add(new listContent("dear", R.drawable.ic_launcher));
        itemsContent.add(new listContent("test", R.drawable.ic_launcher));
        itemsContent.add(new listContent("lol", R.drawable.ic_launcher));

        testingAdapter = new CustomListView(TestSearch.this, itemsContent);
        lv.setAdapter(testingAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.test_search, menu);
        return true;
    }
    public class CustomListView extends BaseAdapter{
        private final Context mContext;
        private ArrayList<listContent> items;
        ArrayList<listContent> filtereditems;

        public CustomListView(Context context, ArrayList<listContent> items) {
            this.mContext= context;
            this.items = items;
            this.filtereditems = new ArrayList<listContent>();
            this.filtereditems.addAll(items);
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            View rowView= inflater.inflate(R.layout.my_saving_list, null, true);
            TextView txtTitle = (TextView) rowView.findViewById(R.id.tvSavingListView);
            ImageView imageView = (ImageView) rowView.findViewById(R.id.imgS);
            txtTitle.setText(items.get(position).getInfo());
            imageView.setImageResource(items.get(position).getImageInfo());
            return rowView;
        }

        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            items.clear();
            if (charText.length() == 0) {
                items.addAll(filtereditems);
            } 
            else
            {
                for (listContent wp : filtereditems) 
                {
                    if(wp.getInfo().startsWith(charText))
                    {
                        items.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
        @Override
        public int getCount() {
            return items.size();
        }
        @Override
        public Object getItem(int arg0) {
            return items.get(arg0);
        }
        @Override
        public long getItemId(int arg0) {
            return arg0;
        }
    }
    }
公共类TestSearch扩展活动{
ListView lv;
编辑文本输入搜索;
CustomListView测试适配器;
公共类列表内容{
公共字符串信息;
公共信息;
公共列表内容(字符串信息、int imageInfo){
this.info=info;
this.imageInfo=imageInfo;
}
公共字符串getInfo(){
退货信息;
}
公共void setInfo(字符串信息){
this.info=info;
}
public int getImageInfo(){
返回图像信息;
}
公共无效setImageInfo(int imageInfo){
this.imageInfo=imageInfo;
}
}
arraylistitemscontent;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u test\u search);
itemsContent=newarraylist();
CustomListView测试适配器;
lv=(ListView)findViewById(R.id.lvEditSavingList);
inputSearch=(EditText)findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(textWatcher);
loadListViewData();
}
私有TextWatcher TextWatcher=新的TextWatcher(){
@凌驾
公共无效后文本已更改(可编辑){
String text=inputSearch.getText().toString().toLowerCase(Locale.getDefault());
testingAdapter.filter(文本);
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、,
int arg3){
}
@凌驾
public void onTextChanged(字符序列arg0、int arg1、int arg2、,
int arg3){
}
};
私有void loadListViewData(){
//TODO自动生成的方法存根
itemsContent.add(新列表内容(“text”,R.drawable.ic_launcher));
itemsContent.add(新列表内容(“hello”,R.drawable.ic_启动器));
itemsContent.add(新列表内容(“亲爱的”,R.drawable.ic_启动器));
itemsContent.add(新列表内容(“test”,R.drawable.ic_启动器));
itemsContent.add(新列表内容(“lol”,R.drawable.ic_启动器));
testingAdapter=新的CustomListView(TestSearch.this,itemsContent);
低压设置适配器(测试适配器);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.test\u搜索,菜单);
返回true;
}
公共类CustomListView扩展了BaseAdapter{
私有最终上下文mContext;
私有ArrayList项;
阵列列表过滤器;
公共CustomListView(上下文、ArrayList项){
this.mContext=上下文;
这个项目=项目;
this.filtereditems=new ArrayList();
this.filtereditems.addAll(项目);
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutFlater充气机=LayoutFlater.from(mContext);
视图行视图=充气机。充气(R.layout.my_saving_list,null,true);
TextView txtTitle=(TextView)rowView.findViewById(R.id.tvSavingListView);
ImageView=(ImageView)rowView.findViewById(R.id.imgS);
setText(items.get(position.getInfo());
setImageResource(items.get(position.getImageInfo());
返回行视图;
}
公共空过滤器(字符串图表文本){
charText=charText.toLowerCase(Locale.getDefault());
items.clear();
如果(ChartText.length()==0){
items.addAll(filtereditems);
} 
其他的
{
对于(listContent wp:filtereditems)
{
if(wp.getInfo().startsWith(charText))
{
项目。添加(wp);
}
}
}
notifyDataSetChanged();
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int arg0){
返回项目。获取(arg0);
}
@凌驾
公共长getItemId(int arg0){
返回arg0;
}
}
}

谢谢你的努力,但这对我来说还是有点复杂,但我找到了另一种方法来做,我实际上遵循了这种方法
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow>
    <TextView
        android:id="@+id/tvSavingListView"
        android:layout_width="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:textSize="16sp"
        android:layout_height="30dp" />

    <ImageView
        android:id="@+id/imgS"
        android:layout_width="25dp"
        android:layout_height="25dp"/>
</TableRow>
</TableLayout>
public class TestSearch extends Activity {
    ListView lv;
    EditText inputSearch;
    CustomListView testingAdapter;

    public class listContent{
        public String info;
        public int imageInfo;

        public listContent(String info, int imageInfo) {
            this.info = info;
            this.imageInfo = imageInfo;
        }
        public String getInfo() {
            return info;
        }
        public void setInfo(String info) {
            this.info = info;
        }
        public int getImageInfo() {
            return imageInfo;
        }
        public void setImageInfo(int imageInfo) {
            this.imageInfo = imageInfo;
        }

    }

    ArrayList<listContent> itemsContent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_search);
        itemsContent = new ArrayList<listContent>();
        CustomListView testingAdapter;
        lv = (ListView) findViewById(R.id.lvEditSavingList);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
        inputSearch.addTextChangedListener(textWatcher);
        loadListViewData();
    }
    private TextWatcher textWatcher = new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {
            String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
            testingAdapter.filter(text);
        }
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) { 
        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
        }
    };
    private void loadListViewData() {
        // TODO Auto-generated method stub
        itemsContent.add(new listContent("text", R.drawable.ic_launcher));
        itemsContent.add(new listContent("hello", R.drawable.ic_launcher));
        itemsContent.add(new listContent("dear", R.drawable.ic_launcher));
        itemsContent.add(new listContent("test", R.drawable.ic_launcher));
        itemsContent.add(new listContent("lol", R.drawable.ic_launcher));

        testingAdapter = new CustomListView(TestSearch.this, itemsContent);
        lv.setAdapter(testingAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.test_search, menu);
        return true;
    }
    public class CustomListView extends BaseAdapter{
        private final Context mContext;
        private ArrayList<listContent> items;
        ArrayList<listContent> filtereditems;

        public CustomListView(Context context, ArrayList<listContent> items) {
            this.mContext= context;
            this.items = items;
            this.filtereditems = new ArrayList<listContent>();
            this.filtereditems.addAll(items);
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            View rowView= inflater.inflate(R.layout.my_saving_list, null, true);
            TextView txtTitle = (TextView) rowView.findViewById(R.id.tvSavingListView);
            ImageView imageView = (ImageView) rowView.findViewById(R.id.imgS);
            txtTitle.setText(items.get(position).getInfo());
            imageView.setImageResource(items.get(position).getImageInfo());
            return rowView;
        }

        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            items.clear();
            if (charText.length() == 0) {
                items.addAll(filtereditems);
            } 
            else
            {
                for (listContent wp : filtereditems) 
                {
                    if(wp.getInfo().startsWith(charText))
                    {
                        items.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
        @Override
        public int getCount() {
            return items.size();
        }
        @Override
        public Object getItem(int arg0) {
            return items.get(arg0);
        }
        @Override
        public long getItemId(int arg0) {
            return arg0;
        }
    }
    }