Java 扩展基本适配器的联系人名称的搜索选项
我正在尝试为显示联系人图像和联系人姓名的联系人列表实施搜索选项 我已经创建了一个文本框来输入搜索文本 contactnameadapter.java:扩展基本适配器。 其代码如下:Java 扩展基本适配器的联系人名称的搜索选项,java,android,android-listview,baseadapter,Java,Android,Android Listview,Baseadapter,我正在尝试为显示联系人图像和联系人姓名的联系人列表实施搜索选项 我已经创建了一个文本框来输入搜索文本 contactnameadapter.java:扩展基本适配器。 其代码如下: public class ContactNamesAdapter extends BaseAdapter implements Filterable { private Activity activity; private ArrayList<HashMap<String, Stri
public class ContactNamesAdapter extends BaseAdapter implements Filterable
{
private Activity activity;
private ArrayList<HashMap<String, String>> originalData;
private ArrayList<HashMap<String, String>> filteredData;
private static LayoutInflater inflater=null;
public ContactNamesAdapter(Activity a, ArrayList<HashMap<String, String>> d)
{
activity = a;
originalData=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount()
{
return originalData.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.contacts_row, null);
ImageView profile = (ImageView)vi.findViewById(R.id.ContactImage);
Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(originalData.get(position).get("id")));
InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(ContactNamesAdapter.inflater.getContext().getContentResolver(),my_contact_Uri);
if(photo_stream != null)
{
BufferedInputStream buf =new BufferedInputStream(photo_stream);
Bitmap my_btmp = BitmapFactory.decodeStream(buf);
profile.setImageBitmap(my_btmp);
}
else
{
profile.setImageResource(R.drawable.no_pic);
}
TextView name = (TextView)vi.findViewById(R.id.name);
name.setText(originalData.get(position).get("name"));
return vi;
}
@Override
public Filter getFilter()
{
return new Filter()
{
private ArrayList<HashMap<String, String>> filteredResultsData;
@Override
protected FilterResults performFiltering(CharSequence charSequence)
{
FilterResults results = new FilterResults();
//If there's nothing to filter on, return the original data for your list
if(charSequence == null || charSequence.length() == 0)
{
results.values = originalData;
results.count = originalData.size();
}
else
{
ArrayList<HashMap<String,String>> filterResultsData = new ArrayList<HashMap<String,String>>();
for(HashMap<String,String> data : originalData)
{
if(originalData == filterResultsData )
{
filterResultsData.add(data);
}
}
results.values = filterResultsData;
results.count = filteredResultsData.size();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults)
{
filteredData = (ArrayList<HashMap<String,String>>)filterResults.values;
notifyDataSetChanged();
}
};
}
公共类ContactNameAdapter扩展BaseAdapter实现可过滤
{
私人活动;
私人ArrayList originalData;
私有阵列列表过滤器数据;
专用静态充气机=空;
公共联系人名称适配器(活动a,ArrayList d)
{
活动=a;
原始数据=d;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
public int getCount()
{
返回originalData.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置)
{
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图)
{
视图vi=转换视图;
if(convertView==null)
vi=充气机。充气(右布局触点,空);
ImageView配置文件=(ImageView)vi.findViewById(R.id.ContactImage);
Uri my_contact_Uri=Uri.withAppendedPath(Contacts Contacts.CONTENT_Uri,String.valueOf(originalData.get(position.get(“id”));
InputStream photo\u stream=ContactsContract.Contacts.OpenContactsPhotoInputStream(ContactNamesAdapter.inflater.getContext().getContentResolver(),my\u contact\u Uri);
如果(照片流!=null)
{
BufferedInputStream buf=新的BufferedInputStream(照片流);
位图my_btmp=BitmapFactory.decodeStream(buf);
setImageBitmap(my_btmp);
}
其他的
{
配置文件。setImageResource(R.drawable.no_pic);
}
TextView name=(TextView)vi.findViewById(R.id.name);
name.setText(originalData.get(position.get)(“name”);
返回vi;
}
@凌驾
公共过滤器getFilter()
{
返回新筛选器()
{
私有ArrayList筛选器结果数据;
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence)
{
FilterResults results=新的FilterResults();
//如果没有要筛选的内容,请返回列表的原始数据
if(charSequence==null | | charSequence.length()==0)
{
结果.值=原始数据;
results.count=originalData.size();
}
其他的
{
ArrayList filterResultsData=新建ArrayList();
for(哈希映射数据:originalData)
{
如果(原始数据==filterResultsData)
{
filterResultsData.add(数据);
}
}
results.values=filterResultsData;
results.count=filteredResultsData.size();
}
返回结果;
}
@凌驾
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults)
{
filteredData=(ArrayList)filterResults.values;
notifyDataSetChanged();
}
};
}
contactname.java:扩展活动。
一旦创建:
DetailsList = new ArrayList<HashMap<String, String>>();
contactList = (ListView) findViewById(R.id.ContactNamelist);
profileImage = (ImageView) findViewById(R.id.ContactImage);
inputSearch = (EditText) findViewById(R.id.inputSearch);
getContactName();
contactList.setTextFilterEnabled(true);
inputSearch.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
adapter.getFilter().filter(cs.toString());
//adapter.getFilter().filter(cs);
Log.e("getfilter","getfilter");
contactList.setAdapter(adapter);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
}
DetailsList=newarraylist();
contactList=(ListView)findViewById(R.id.ContactNamelist);
profileImage=(ImageView)findViewById(R.id.ContactImage);
inputSearch=(EditText)findViewById(R.id.inputSearch);
getContactName();
contactList.setTextFilterEnabled(true);
inputSearch.addTextChangedListener(新的TextWatcher()
{
@凌驾
public void onTextChanged(字符序列cs、int arg1、int arg2、int arg3){
//当用户更改文本时
adapter.getFilter().filter(cs.toString());
//adapter.getFilter().filter(cs);
Log.e(“getfilter”、“getfilter”);
contactList.setAdapter(适配器);
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、,
int arg3){
}
@凌驾
public void PostTextChanged(可编辑arg0){
}
});
}
在getContactName()下:
public void getContactName()
{
final Uri uri = ContactsContract.Contacts.CONTENT_URI;
final String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID
};
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
final String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cur = getContentResolver().query(uri, projection, selection, null, sortOrder);
if (cur.getCount() > 0)
{
while (cur.moveToNext())
{
String Sid = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", name);
map.put("id", Sid);
DetailsList.add( map);
}
}
cur.close();
adapter = new ContactNamesAdapter(this, DetailsList);
// updating listview
contactList.setAdapter(adapter);
}
public void getContactName()
{
最终Uri=Contacts contract.Contacts.CONTENT\u Uri;
最终字符串[]投影=新字符串[]{
联系人合同联系人。\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,
Contacts contract.Contacts.PHOTO\u ID
};
字符串选择=Contacts contract.Contacts.HAS_PHONE_NUMBER+“='1';
最终字符串排序器=Contacts contract.Contacts.DISPLAY_NAME+“整理本地化ASC”;
Cursor cur=getContentResolver().query(uri、投影、选择、null、排序器);
如果(cur.getCount()>0)
{
while(cur.moveToNext())
{
字符串Sid=cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
字符串名称=cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_name));
HashMap=newHashMap();
地图。放置(“名称”,名称);
地图放置(“id”,Sid);
详细列表。添加(地图);
}
}
cur.close();
adapter=新的ContactNamesAdapter(此,DetailsList);
//更新列表视图
contactList.setAdapter(适配器);
}
问题是我在搜索框中键入文本后没有得到结果。我不知道我哪里出错了
让我知道如何解决这个问题
谢谢 您可能需要查看此链接。 这是一个很好的SearchView或使用下面的我的SearchView 这是我在listview上的搜索方法
search.addTextChangedListener(new TextWatcher() { //search is a edittext object
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
textlength = search.getText().length(); //textlength is a global variable
filtered_text = new ArrayList<RowItem>(); //global array list
for (int i = 0; i < employee.length(); i++)
{
if(rowItems.get(i).getTitle().toString().toUpperCase().contains(search.getText().toString().toUpperCase())) //rowItem is an object of my holder class for Custom Adapter
{
//Adding image and names which match the search criteria
in filtered_text array list
String mDrawableName;
try {
mDrawableName = employee.getJSONObject(i).getString("image");
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
RowItem item = new RowItem(resID, rowItems.get(i).getTitle());
filtered_text.add(item);
} catch (JSONException e) {e.printStackTrace();}
}
}
adapter = new CustomBaseAdapter(YourClass.this, filtered_text);
listView.setAdapter(adapter);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
search.addTextChangedListener(新的TextWatcher(){//search是一个edittext对象
@凌驾
公共void onTextChanged(C