0

我所有的联系人 ID 都位于一个名为 ContactsID 的数组列表中,它的名称存储在另一个名为 ContactsName 的数组列表中。我在具有搜索功能的列表视图上显示名称

在过滤器的帮助下,搜索功能也可以正常工作。

我正在尝试使用单击项目的位置从联系人获取电子邮件地址。

像这样的东西:

  String Cid = ContactsID.get(position);

我使用 id 获取电子邮件的查询也可以正常工作(当我不搜索任何内容时)..

我唯一的问题是,如果我搜索“名称”,则列表视图会被名称过滤。结果显示在列表视图上,但位置未根据其名称更新。它总是从位置 0 开始,我在获取 EMAIL 的联系人 ID 时会遇到问题。

所以我尝试了 parent.getItemAtPosition(position) (这会获取单击的项目的名称,但没有获取 ContactsID 数组列表位置)

这是我正在尝试的。

 lisview.setOnItemClickListener(new OnItemClickListener() 
    {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) 
        {
            String Cid= contactsID.get(position);

            /*String SSid = (String) parent.getItemAtPosition(position);

            Log.e("ABC",""+SSid);*/

            ContentResolver cr = getContentResolver();
            Cursor cur1 = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{Cid}, null); 


            while (cur1.moveToNext()) 
            { 
                    String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                Log.e("email",""+email);

            }

            cur1.close();
        }

    });

有人可以帮我解决这个问题吗?

谢谢!

4

1 回答 1

1

问题源于您有两个列表,但ArrayAdapter过滤机制仅适用于附加到ListView. 因此,当您开始过滤列表时,按位置从一个列表到另一个列表的映射会中断,因为只有附加到视图的列表正在被修改。

最简单的解决方案是创建一个基本的 POJO 模型对象来将两个数据元素绑定在一起,并让您的适配器来管理它。例如:

ContactModel.java

public class ContactModel {
    public String id;
    public String name;

    public ContactModel(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // Doing this allows the adapter to display the name without
    // creating a custom getView() implementation
    @Override
    public String toString() {
        return name;
    }
}

...然后您可以将所有数据存放在一个ArrayList<ContactModel>...

ArrayList<ContactModel> ContactsList = new ArrayList<ContactModel>();
//Add your items
ContactsList.add( new ContactModel(someId, someName) );

...并将您的适配器类型修改为ArrayAdapter<ContactModel>. 然后在你的点击监听器中......

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) 
    {
        ContactModel item = ContactsList.get(position);
        String Cid = item.id;

        /** existing code, etc. **/
    }

这样,列表中显示的名称和查询所需的 id 总是捆绑在一起。

于 2013-06-25T03:46:56.187 回答