Android 在自定义listview上实现搜索

Android 在自定义listview上实现搜索,android,search,listview,Android,Search,Listview,我有一个列表视图和编辑文本字段,我想实现搜索,但是我的列表视图是一个自定义的列表视图填充了类项的对象数组。当我按下键时,整个listview消失了,所以我想问题是它不能将char与类项的对象匹配,这就是为什么我按下键时没有结果的原因。 这是我的代码 filterText = (EditText) findViewById(R.id.editTextfilter); filterText.addTextChangedListener(filterTextWatcher); m_ite

我有一个
列表视图
编辑文本
字段,我想实现搜索,但是我的
列表视图
是一个自定义的
列表视图
填充了类项的对象数组。当我按下键时,整个
listview
消失了,所以我想问题是它不能将char与类项的对象匹配,这就是为什么我按下键时没有结果的原因。 这是我的代码

 filterText = (EditText) findViewById(R.id.editTextfilter);
 filterText.addTextChangedListener(filterTextWatcher);

    m_items = new ArrayList<Item>();
    phoneList=(ListView)findViewById(android.R.id.list);
    phoneList.setTextFilterEnabled(true);
     this.m_adapter = new ItemAdapter(this,R.layout.row,m_items);


     phoneList.setAdapter(this.m_adapter);

    private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

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

        m_adapter.getFilter().filter(s.toString());

    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterText.removeTextChangedListener(filterTextWatcher);
}
filterText=(EditText)findViewById(R.id.editTextfilter);
filterText.addTextChangedListener(filterTextWatcher);
m_items=new ArrayList();
phoneList=(ListView)findViewById(android.R.id.list);
电话列表。setTextFilterEnabled(true);
this.m_adapter=新项适配器(this,R.layout.row,m_项);
电话列表.setAdapter(此.m_适配器);
私有TextWatcher filterTextWatcher=新TextWatcher(){
公共无效后文本已更改(可编辑){
}
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
}
public void onTextChanged(字符序列,int start,int before,
整数计数){
m_adapter.getFilter().filter(s.toString());
}
};
@凌驾
受保护的空onDestroy(){
super.ondestory();
filterText.removeTextChangedListener(filterTextWatcher);
}

任何关于如何让它工作的帮助

我也有类似的要求。我使用了自定义过滤器

    ArrayList<PostData> mPostingData = null;//arraylist of class items
    ArrayList<PostData> mTemp = new ArrayList<PostData>();//temporary arraylist of class items
    ArrayList<PostData> mOri = new ArrayList<PostData>();//Original arraylist
    getListView().setTextFilterEnabled(true);

    search= (EditText) findViewById(R.id.searchbox);
     search.addTextChangedListener(new TextWatcher() {

         public void onTextChanged(CharSequence s, int start, int before, int count) {
                         mCustomListView.getFilter().filter(s);
                         mCustomListView.notifyDataSetChanged();

         }

         public void beforeTextChanged(CharSequence s, int start, int count,
             int after) {


           }

           public void afterTextChanged(Editable s) {
           }
          });
覆盖筛选器方法的自定义列表视图。基于POJO类mTitle的搜索

     class PostData {
String mID; 
String mPostedBy;
String mTitle;
String mMessage;
String mImageUrl;
String mVideoUrl;
String mType ;
boolean me=false;
    }
  class CustomListView extends ArrayAdapter {

Context context;
LayoutInflater mInflater;

private Bitmap mIcon1;
private Bitmap mIcon2;
private Bitmap mIcon3;
PostData mp ;

public  CustomListView(Context c)
{
     super(c, 0);
    mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mIcon1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.text_icon);
    mIcon2 = BitmapFactory.decodeResource(c.getResources(), R.drawable.image_icon);
    mIcon3 = BitmapFactory.decodeResource(c.getResources(), R.drawable.video_icon);
}   

public int getCount() {

    if(mPostingData!=null){
        return mPostingData.size();
    }else{
        return 0;
    }
}

 public void setData(ArrayList<PostData> mPpst) {   
    mPostingData = mPpst;//contains class items data.
}

 @Override
 public Filter getFilter() {
     return new Filter() {
         @Override
         protected void publishResults(CharSequence constraint, FilterResults results) {
             if (results != null && results.count >= 0) {
                 setData((ArrayList<PostData>) results.values);//if results of search is null set the searched results data
             } else {
                 setData(mOri);// set original values
             }

             notifyDataSetInvalidated();
         }



        @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults result = new FilterResults();
             if (!TextUtils.isEmpty(constraint)) {
                 constraint = constraint.toString().toLowerCase();
                 ArrayList<PostData> foundItems = new ArrayList<PostData>();
                 if(mTemp!=null)
                 {
                 for(int i=0;i<mTemp.size();i++)
                 {
                    //If mTitle contains the string entered in Editext 
                     if (mTemp.get(i).mTitle.toString().contains(constraint)) {
                         foundItems.add(mTemp.get(i));

                     }
                     else
                     {

                     }
                 }
                 }
                 result.count = foundItems.size();//search results found return count
                 result.values = foundItems;// return values
             } 
             else
             {
                 result.count=-1;// no search results found
             }


             return result;
         }
     };
 }
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder holder;
    ///int type = getItemViewType(arg0);
     Log.i("Aru","get View");
    if(mPostingData == null ){

        return null;
    }
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.listviewimg, null);
                convertView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.WRAP_CONTENT));
                // Creates a ViewHolder and store references to the two children views
                // we want to bind data to.
                holder = new ViewHolder();
                holder.ll=(LinearLayout) convertView.findViewById(R.id.lvid);
                holder.text = (TextView) convertView.findViewById(R.id.texttitle);
                holder.text2 = (TextView) convertView.findViewById(R.id.tvst);
                holder.icon = (ImageView) convertView.findViewById(R.id.llimage);

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

            mp = mPostingData.get(position);

            String title = mp.mType;
            if(mp.mTitle!=null && Name.equals(mp.mPostedBy )){
                title = mp.mTitle+" "+title;
                //holder.text.setBackgroundColor(Color.WHITE);
                holder.ll.setBackgroundResource(R.drawable.listbkgme);
                holder.text.setText(title);
            }
            else if(mp.mTitle!=null && Name!=mp.mPostedBy)
            {
                title = mp.mTitle+" "+title;
           holder.text.setText(title);
            }


            if(mp.mMessage!=null && Name.equals(mp.mPostedBy )){
                holder.ll.setBackgroundResource(R.drawable.listbkgme);
                holder.text2.setText(mp.mMessage);

            }
            else if(mp.mMessage!=null && Name!=(mp.mPostedBy))
            {
                holder.text2.setText(mp.mMessage);
            }


            if(mp.mImageUrl!=null ){

                holder.icon.setImageBitmap(mIcon2);
            }else if(mp.mVideoUrl!=null){
                holder.icon.setImageBitmap(mIcon3);
            }else{
                holder.icon.setImageBitmap(mIcon1);
            }
       return convertView;
}
 class ViewHolder {
    TextView text;
    TextView text2;
    ImageView icon;
    LinearLayout ll;
}
public long getItemId(int position) {

    return position;
}
 }
类CustomListView扩展了ArrayAdapter{
语境;
拉平机;
私有位图mIcon1;
私有位图mIcon2;
私有位图mIcon3;
PostData mp;
公共CustomListView(上下文c)
{
super(c,0);
mInflater=(LayoutInflater)c.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
mIcon1=BitmapFactory.decodeResource(c.getResources(),R.drawable.text_图标);
mIcon2=BitmapFactory.decodeResource(c.getResources(),R.drawable.image_图标);
mIcon3=BitmapFactory.decodeResource(c.getResources(),R.drawable.video_图标);
}   
public int getCount(){
if(mPostingData!=null){
返回mPostingData.size();
}否则{
返回0;
}
}
public void setData(ArrayList mPpst){
mPostingData=mPpst;//包含类项数据。
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
if(results!=null&&results.count>=0){
setData((ArrayList)results.values);//如果搜索结果为空,则设置搜索结果数据
}否则{
setData(mOri);//设置原始值
}
notifyDataSetionValidated();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults结果=新的FilterResults();
如果(!TextUtils.isEmpty(约束)){
constraint=constraint.toString().toLowerCase();
ArrayList foundItems=新建ArrayList();
如果(mTemp!=null)
{

对于自定义listview中的(int i=0;i,必须在适配器中创建一个筛选方法。

创建如下数据类

package ali.search;
    public class Data {

        public Data() {

        }

        int id;
        private String JobTitle;
        private String Department;
        private String Locationn;
        private String JobRole;



        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getJobTitle() {
            return JobTitle;
        }

        public void setJobTitle(String jobTitle) {
            JobTitle = jobTitle;
        }

        public String getDepartment() {
            return Department;
        }

        public void setDepartment(String department) {
            Department = department;
        }

        public String getLocation() {
            return Locationn;
        }

        public void setLocation(String location) {
            Locationn = location;
        }

        public String getJobRole() {
            return JobRole;
        }

        public void setJobRole(String jobRole) {
            JobRole = jobRole;
        }
    }
package ali.search;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;

public class SearchActivity extends Activity {
    String[] jobtitles = { "Android Developer", "Tester","iOS Developer",
             };
    String[] departments = { "android", "testing", "iphone" };
    String[] locations = { "Delhi", "Mumbai", "Noida" };
    String[] jobRoles = { "develop android based apps", "test mobile apps",
            "develop iphone based apps" };

    private ListView listViewSearch;
    private EditText editSearchView;

    private SearchAdapter adapter;
    private ArrayList<Data> sortedItems = new ArrayList<Data>();
    private ArrayList<Data> OrignalItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        super.onCreate(savedInstanceState);     
                setContentView(R.layout.activity_search);

        listViewSearch = (ListView) findViewById(R.id.lvSearch);
        editSearchView = (EditText) findViewById(R.id.edittext);

        OrignalItems = getListOfType();
        sortedItems.addAll(OrignalItems);
        adapter = new SearchAdapter(SearchActivity.this, sortedItems);
        listViewSearch.setAdapter(adapter);
        editSearchView.addTextChangedListener(searchTxtChangeListener);

    }

    private ArrayList<Data> getListOfType() {

        ArrayList<Data> dataList = new ArrayList<Data>();
        for (int i = 0; i < 3; i++) {
            Data data = new Data();
            data.setJobTitle(jobtitles[i]);
            data.setDepartment(departments[i]);
            data.setLocation(locations[i]);
            data.setJobRole(jobRoles[i]);
            data.setId(i);
            dataList.add(data);
            dataList.add(data);// dulicate entry 
        }

        return dataList;

    }

    private TextWatcher searchTxtChangeListener = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }

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

            int textlength = editSearchView.getText().length();
            sortedItems.clear();

            for (int i = 0; i < OrignalItems.size(); i++) {
                if (textlength <= OrignalItems.get(i).getJobTitle().length()) {
                    if (editSearchView
                            .getText()
                            .toString()
                            .equalsIgnoreCase(
                                    (String) OrignalItems.get(i).getJobTitle().subSequence(0,
                                            textlength))) {
                        sortedItems.add(OrignalItems.get(i));

                    }
                }
            }

            adapter.notifyDataSetChanged();


        }
    };
}
把活动课做成这样

package ali.search;
    public class Data {

        public Data() {

        }

        int id;
        private String JobTitle;
        private String Department;
        private String Locationn;
        private String JobRole;



        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getJobTitle() {
            return JobTitle;
        }

        public void setJobTitle(String jobTitle) {
            JobTitle = jobTitle;
        }

        public String getDepartment() {
            return Department;
        }

        public void setDepartment(String department) {
            Department = department;
        }

        public String getLocation() {
            return Locationn;
        }

        public void setLocation(String location) {
            Locationn = location;
        }

        public String getJobRole() {
            return JobRole;
        }

        public void setJobRole(String jobRole) {
            JobRole = jobRole;
        }
    }
package ali.search;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;

public class SearchActivity extends Activity {
    String[] jobtitles = { "Android Developer", "Tester","iOS Developer",
             };
    String[] departments = { "android", "testing", "iphone" };
    String[] locations = { "Delhi", "Mumbai", "Noida" };
    String[] jobRoles = { "develop android based apps", "test mobile apps",
            "develop iphone based apps" };

    private ListView listViewSearch;
    private EditText editSearchView;

    private SearchAdapter adapter;
    private ArrayList<Data> sortedItems = new ArrayList<Data>();
    private ArrayList<Data> OrignalItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        super.onCreate(savedInstanceState);     
                setContentView(R.layout.activity_search);

        listViewSearch = (ListView) findViewById(R.id.lvSearch);
        editSearchView = (EditText) findViewById(R.id.edittext);

        OrignalItems = getListOfType();
        sortedItems.addAll(OrignalItems);
        adapter = new SearchAdapter(SearchActivity.this, sortedItems);
        listViewSearch.setAdapter(adapter);
        editSearchView.addTextChangedListener(searchTxtChangeListener);

    }

    private ArrayList<Data> getListOfType() {

        ArrayList<Data> dataList = new ArrayList<Data>();
        for (int i = 0; i < 3; i++) {
            Data data = new Data();
            data.setJobTitle(jobtitles[i]);
            data.setDepartment(departments[i]);
            data.setLocation(locations[i]);
            data.setJobRole(jobRoles[i]);
            data.setId(i);
            dataList.add(data);
            dataList.add(data);// dulicate entry 
        }

        return dataList;

    }

    private TextWatcher searchTxtChangeListener = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }

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

            int textlength = editSearchView.getText().length();
            sortedItems.clear();

            for (int i = 0; i < OrignalItems.size(); i++) {
                if (textlength <= OrignalItems.get(i).getJobTitle().length()) {
                    if (editSearchView
                            .getText()
                            .toString()
                            .equalsIgnoreCase(
                                    (String) OrignalItems.get(i).getJobTitle().subSequence(0,
                                            textlength))) {
                        sortedItems.add(OrignalItems.get(i));

                    }
                }
            }

            adapter.notifyDataSetChanged();


        }
    };
}
包ali.search;
导入java.util.ArrayList;
导入android.os.Bundle;
导入android.app.Activity;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.EditText;
导入android.widget.ImageView;
导入android.widget.ListView;
公共类SearchActivity扩展了活动{
String[]jobtitles={“Android开发者”、“测试者”、“iOS开发者”,
};
String[]departments={“安卓”、“测试”、“iphone”};
字符串[]位置={“德里”、“孟买”、“诺伊达”};
String[]jobRoles={“开发基于android的应用程序”,“测试移动应用程序”,
“开发基于iphone的应用程序”};
私有ListView listViewSearch;
私有编辑文本编辑搜索视图;
专用搜索适配器;
private ArrayList sortedItems=新ArrayList();
私人ArrayList原始岩;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u search);
listViewSearch=(ListView)findViewById(R.id.lvSearch);
editSearchView=(EditText)findViewById(R.id.EditText);
OrignalItems=getListOfType();
分类数据项addAll(原始数据项);
适配器=新的SearchAdapter(SearchActivity.this,sortedItems);
setAdapter(适配器);
editSearchView.addTextChangedListener(searchTxtChangeListener);
}
私有ArrayList getListOfType(){
ArrayList dataList=新的ArrayList();
对于(int i=0;i<3;i++){
数据=新数据();
数据。setJobTitle(jobtitles[i]);
数据收集部门(部门[i]);
数据设置位置(位置[i]);
data.setJobRole(jobRoles[i]);
数据集ID(i);
dataList.add(数据);
dataList.add(数据);//重复输入
}
返回数据列表;
}
私有TextWatcher searchTxtChangeListener=新TextWatcher(){
@凌驾
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
}
@凌驾
公共无效后文本已更改(可编辑){
}
@凌驾
public void onTextChanged(字符序列,int start,int before,
整数计数){
int textlength=editSearchView.getText().length();
sortedItems.clear();
对于(int i=0;i