在CustomArrayAdapter过滤器在Android中 [英] Filter on CustomArrayAdapter in Android
问题描述
我在Android的新的,我也跟着关于ListView中加入搜索功能一些教程,但对我来说它不工作。谁能告诉我什么是错在我的code。
I'm new in Android, I followed some tutorials about adding search function on ListView, but in my case it's not working. Can anybody tell me what is wrong in my code.
下面是我的code:
Activity.java
public class SendMoney extends Activity {
private ListView lvContacts;
private EditText etSearch;
private ContactListAdapter mAdapter;
private String[] stockArr, stockArr1, stockArr2;
private Intent i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_money);
initObjects();
ArrayList<String> phoneContactList = new ArrayList<String>();
ArrayList<String> ContactImage = new ArrayList<String>();
ArrayList<String> PhoneNumber = new ArrayList<String>();
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String img = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// This inner cursor is for contacts that have multiple numbers.
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
String pnumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
ContactImage.add(img);
phoneContactList.add(name);
PhoneNumber.add(pnumber);
Log.i("Contact List", pnumber);
}
pCur.close();
}
}
Collections.sort(phoneContactList);
int cnt = phoneContactList.size(); // Count of contacts
// Convert ArrayList<String> to String[] START
// Contacts Name
stockArr = new String[phoneContactList.size()];
stockArr = phoneContactList.toArray(stockArr);
// Contacts Photo
stockArr1 = new String[ContactImage.size()];
stockArr1 = ContactImage.toArray(stockArr1);
// Contacts Number
stockArr2 = new String[PhoneNumber.size()];
stockArr2 = PhoneNumber.toArray(stockArr2);
// Convert ArrayList<String> to String[] END
mAdapter = new ContactListAdapter(getApplicationContext(), R.layout.banks_listview_layout, stockArr, stockArr1);
lvContacts.setAdapter(mAdapter);
}
cur.close();
lvContacts.setTextFilterEnabled(true);
lvContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
i = new Intent(SendMoney.this, SendMoneyForm.class);
i.putExtra("contact_name", stockArr[position]);
i.putExtra("contact_image", stockArr1[position]);
i.putExtra("contact_number", stockArr2[position]);
startActivity(i);
}
});
//***************** SEARCH START ***********************
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
mAdapter.getFilter().filter(cs.toString());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
//***************** SEARCH END ***********************
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.send_money, menu);
return true;
}
private void initObjects(){
lvContacts = (ListView)findViewById(R.id.lvContacts);
etSearch = (EditText)findViewById(R.id.etSearch);
}
我的自定义数组适配器
public class ContactListAdapter extends ArrayAdapter<String> {
private LayoutInflater mInflater;
private String[] mStrings;
private String[] mIcons;
private int mViewResourceId;
public ContactListAdapter(Context ctx, int resource,
String[] option, String[] icons) {
super(ctx, resource, option);
mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mStrings = option;
mIcons = icons;
mViewResourceId = resource;
}
@Override
public int getCount() {
return mStrings.length;
}
@Override
public String getItem(int position) {
return mStrings[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(mViewResourceId, null);
ImageView iv = (ImageView)convertView.findViewById(R.id.ivBankIcon);
if(mIcons[position]==null) {
iv.setImageResource(R.drawable.default_picture);
} else {
iv.setImageURI(Uri.parse(mIcons[position]));
Log.d("LALA", mIcons[position]);
}
TextView tv = (TextView)convertView.findViewById(R.id.tvBankName);
tv.setText(mStrings[position]);
return convertView;
}
}
在此先感谢!
推荐答案
您必须覆盖用getFilter
method`并创建逻辑过滤数据。
You will have to override getFilter
method` and create your logic for filtering the data.
公共过滤用getFilter()
返回,可用于过滤模式限制数据的过滤器。
Returns a filter that can be used to constrain data with a filtering pattern.
此方法通常是由适配器类实现的。
This method is usually implemented by Adapter classes.
EditText search= (EditText) findViewById(R.id.search);
search.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
在您的适配器
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count >= 0) {
//if results of search is not null set the searched results data
} else {
// set original values
}
notifyDataSetInvalidated();
}
然后
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
if(condition)
{
ArrayList<MyDataType> foundItems = new ArrayList<MyDataType>();
// add items to foundItems if condition matches
result.count = foundItems.size();//search results found return count
result.values = foundItems;// return values
}
else
{
result.count=-1;// no search results found
}
return result;
}
};
}
例如:
<一个href=\"http://stackoverflow.com/questions/10816243/search-in-listview-with-edittext/15367403#15367403\">Search在的EditText
Search in ListView with EditText
这篇关于在CustomArrayAdapter过滤器在Android中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!