Android Studio中SearchView显示Contact实体内存地址问题求助
问题原因
你看到的com.mahdi.roomdatabase.Data.entity.Contact@85c7ce6是Java对象默认的toString()输出——由类全名+对象哈希码组成。出现这个问题的核心原因是:你用ArrayAdapter展示Contact列表时,Adapter会默认调用每个Contact对象的toString()方法填充列表项,但你的Contact实体类没有重写这个方法,所以输出了系统默认的对象标识。
解决方法
有两种常用方案,按需选择即可:
方案1:重写Contact类的toString()方法(最简单)
直接在Contact实体类里重写toString()方法,返回你想在列表中展示的内容,比如姓名、电话等字段的组合:
public class Contact { // 你的实体类字段示例 private int id; private String name; private String phone; // 构造方法、Getter/Setter... @Override public String toString() { // 根据需求拼接字段,比如显示姓名和电话 return name + " | " + phone; } }
修改后,ArrayAdapter会自动使用重写后的toString()结果填充列表项,就能显示正常的文本内容。
方案2:自定义Adapter(适合复杂列表项)
如果你的列表需要展示多字段(比如头像+姓名+电话)或自定义样式,就不能依赖toString()了,需要自定义Adapter:
- 创建自定义列表项布局(比如包含多个TextView的xml文件)
- 继承
ArrayAdapter或BaseAdapter,在getView()方法中手动将Contact的字段绑定到对应View上
示例代码如下:
public class ContactAdapter extends ArrayAdapter<Contact> { private Context mContext; private List<Contact> mContacts; public ContactAdapter(Context context, List<Contact> contacts) { super(context, R.layout.custom_contact_item, contacts); mContext = context; mContacts = contacts; } @Override public View getView(int position, View convertView, ViewGroup parent) { View listItem = convertView; if (listItem == null) { listItem = LayoutInflater.from(mContext).inflate(R.layout.custom_contact_item, parent, false); } Contact currentContact = mContacts.get(position); TextView nameTv = listItem.findViewById(R.id.tv_name); TextView phoneTv = listItem.findViewById(R.id.tv_phone); nameTv.setText(currentContact.getName()); phoneTv.setText(currentContact.getPhone()); return listItem; } }
然后在getDatabasefromDb()方法中替换为自定义Adapter:
private void getDatabasefromDb(String searchText) { searchText = "%" + searchText + "%"; contacts = databaseNew.getDatabaseInfo(SearchActivity.this, searchText); arrayAdapter = new ContactAdapter(SearchActivity.this, contacts); listView.setAdapter(arrayAdapter); }
内容的提问来源于stack exchange,提问作者Mehdi sahraei
相关产品推荐
相关产品推荐

