我创建了一个应用程序,在我的适配器类中我在textview中设置了arraylist ..但是在搜索时我想添加另一个列表,其中包含用户使用textview中的textwatcher搜索的过滤数据。作为我的适配器有完整的联系人列表,我想用在textwatcher的帮助下创建的新列表替换它。 的 MainAactivity
case R.id.action_search:
searchText.setVisibility(View.VISIBLE);
searchText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub
s=searchText.getText().toString();
ma.getFilter().filter(s);
}
});
break;
}
return super.onOptionsItemSelected(item);
}
MyAdapter
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
if (convertView == null)
vi = mInflater.inflate(R.layout.row, null);
tv = (TextView) vi.findViewById(R.id.textView1);
tv1 = (TextView) vi.findViewById(R.id.textView2);
cb = (CheckBox) vi.findViewById(R.id.checkBox1);
tv.setText(name1.get(position));
tv1.setText(phno1.get(position));
cb.setTag(position);
cb.setChecked(mCheckStates.get(position, false));
cb.setOnCheckedChangeListener(this);
// Toast.makeText(getApplication(), String.valueOf(name1.size()).toString(), Toast.LENGTH_LONG).show();
return vi;
}
用getFilter()
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
Filter filter = new Filter() {
public void publishResults(CharSequence s, FilterResults results) {
//Toast.makeText(getApplication(), String.valueOf(name1.size()).toString(), Toast.LENGTH_LONG).show();
arrayListNames = (List<String>) results.values;
notifyDataSetChanged();
}
@Override
public FilterResults performFiltering(CharSequence s) {
search=true;
FilterResults results = new FilterResults();
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
Toast.LENGTH_LONG).show();
for (int i = 0; i < name1.size(); i++) {
String dataNames = name1.get(i).toString();
if (dataNames.toLowerCase().trim().startsWith(s.toString())) {
Toast.makeText(getApplication(),s.toString(), Toast.LENGTH_LONG).show();
FilteredArrayNames.add(name1.get(i));
}
}
results.count = FilteredArrayNames.size();
results.values = FilteredArrayNames;
return results;
}
};
return filter;
}
}
答案 0 :(得分:1)
<强> MainActivity.java 强>
package com.example.mylistviewtest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listview;
private EditText edittext;
private List<ProfileBean> list;
private SearchableAdapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
edittext = (EditText) findViewById(R.id.edittext);
list = new ArrayList<ProfileBean>();
list.add(new ProfileBean("AAA", "AA", "123"));
list.add(new ProfileBean("AAB", "AB", "100"));
list.add(new ProfileBean("AAC", "BC", "101"));
list.add(new ProfileBean("AAD", "DC", "154"));
list.add(new ProfileBean("BBB", "DF", "22"));
list.add(new ProfileBean("BBA", "AD", "22"));
list.add(new ProfileBean("BBD", "FD", "44"));
list.add(new ProfileBean("BAT", "AD", "44"));
list.add(new ProfileBean("BBD", "FF", "75"));
list.add(new ProfileBean("BAD", "AA", "88"));
adapter = new SearchableAdapter(getApplicationContext(), list);
listview.setAdapter(adapter);
edittext.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
ProfileBean bean = (ProfileBean) arg1.getTag();
Toast.makeText(getApplicationContext(), bean.getName(), Toast.LENGTH_LONG).show();
}
});
}
}
<强> ProfileBean 强>
package com.example.mylistviewtest;
public class ProfileBean {
private String name;
private String lname;
private String no;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public ProfileBean(String name, String lname, String no) {
super();
this.name = name;
this.lname = lname;
this.no = no;
}
}
<强> SearchableAdapter.java 强>
package com.example.mylistviewtest;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
// The standard text view adapter only seems to search from the beginning of whole words
// so we've had to write this whole class to make it possible to search
// for parts of the arbitrary string we want
public class SearchableAdapter extends BaseAdapter implements Filterable {
private List<ProfileBean>originalData = null;
private List<ProfileBean>filteredData = null;
private LayoutInflater mInflater;
private ItemFilter mFilter = new ItemFilter();
public SearchableAdapter(Context context, List<ProfileBean> data) {
this.filteredData = data ;
this.originalData = data ;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return filteredData.size();
}
public Object getItem(int position) {
return filteredData.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unnecessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the convertView supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.lname = (TextView) convertView.findViewById(R.id.lname);
holder.no = (TextView) convertView.findViewById(R.id.no);
// Bind the data efficiently with the holder.
convertView.setTag(R.layout.list_item,holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag(R.layout.list_item);
}
// If weren't re-ordering this you could rely on what you set last time
ProfileBean bean = filteredData.get(position);
holder.name.setText(bean.getName());
holder.lname.setText(bean.getLname());
holder.no.setText(bean.getNo());
convertView.setTag(bean);
return convertView;
}
static class ViewHolder {
TextView name;
TextView lname;
TextView no;
}
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<ProfileBean> list = originalData;
int count = list.size();
final ArrayList<ProfileBean> nlist = new ArrayList<ProfileBean>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
ProfileBean bean = list.get(i);
filterableString = bean.getName();
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(bean);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<ProfileBean>) results.values;
notifyDataSetChanged();
}
}
}
<强> activity_main.xml中强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</ListView>
</LinearLayout>
<强> list_item.xml 强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:padding="10dp"
android:textColor="@android:color/black"
android:textSize="16sp" >
</TextView>
<TextView
android:id="@+id/lname"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:padding="10dp"
android:textColor="@android:color/black"
android:textSize="16sp" >
</TextView>
<TextView
android:id="@+id/no"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:padding="10dp"
android:textColor="@android:color/black"
android:textSize="16sp" >
</TextView>
</LinearLayout>