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