如何使用 ListView 删除 Android Studio 显示中的重复联系人 [重复]

Posted

技术标签:

【中文标题】如何使用 ListView 删除 Android Studio 显示中的重复联系人 [重复]【英文标题】:How to remove Duplicate Contact in Android Studio display with ListView [duplicate] 【发布时间】:2019-06-25 17:22:28 【问题描述】:

我正在编写一个程序来在 hp 中显示我的联系人列表,但我总是得到重复的联系人。我的代码哪里不对?

display my code run

这是我的代码

在这里我很困惑如何制作不需要将重复联系人添加到列表视图的过滤器:

contactModelArrayList = new ArrayList<>();
String[] projection = new String[]
        ContactsContract.CommonDataKinds.Phone.NUMBER,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
;
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        projection,
        ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'",
        null,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" COLLATE LOCALIZED ASC");

while (phones.moveToNext())

    String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

    ContactModel contactModel = new ContactModel();
    contactModel.setName(name);
    contactModel.setNumber(phoneNumber);

    contactModelArrayList.add(contactModel);



phones.close();

contactAllAdapter = new ContactAllAdapter(this,contactModelArrayList);
listView.setAdapter(contactAllAdapter);

这用于文件 ContactAll 适配器

public class ContactAllAdapter extends BaseAdapter 
    private Context context;
    private ArrayList<ContactModel> contactModels;
    private String kode, nomor;

    public ContactAllAdapter(Context context, ArrayList<ContactModel> contactModels) 
        this.context = context;
        this.contactModels = contactModels;
    

    @Override
    public int getViewTypeCount() 
        if(getCount() > 0)
            return getCount();
        else
            return super.getViewTypeCount();
        
    

    @Override
    public int getCount() 
        return contactModels.size();
    

    @Override
    public Object getItem(int position) 
        return contactModels.get(position);
    

    @Override
    public long getItemId(int position) 
        return 0;
    

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
        final ViewHolder holder;

        if (convertView == null) 
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_all_contact, null, true);

            holder.cname = convertView.findViewById(R.id.contact_name);
            holder.cnumber = convertView.findViewById(R.id.contact_number);
            holder.cinvite = convertView.findViewById(R.id.contact_invite);

            convertView.setTag(holder);
        else 
            // the getTag returns the viewHolder object set as a tag to the view
            holder = (ViewHolder)convertView.getTag();
        

        holder.cname.setText(contactModels.get(position).getName());
        holder.cnumber.setText(contactModels.get(position).getNumber());

        holder.cinvite.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                final String appPackageName = context.getPackageName();
                String text = context.getResources().getString(R.string.share_app_text);
                String link = "https://play.google.com/store/apps/details?id=" + appPackageName;//app link is auto generated by using package name

                Intent sendIntent = new Intent(Intent.ACTION_VIEW);
                sendIntent.putExtra("sms_body", text+"\n\n"+link);
                sendIntent.putExtra("address", contactModels.get(position).getNumber());
                sendIntent.setType("vnd.android-dir/mms-sms");
                context.startActivity(sendIntent);
            
        );

        return convertView;
    

    private class ViewHolder 

        protected TextView cname, cnumber;
        protected Button cinvite;
    

还有Contact Model这个文件类

public class ContactModel 

    private String name, number;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getNumber() 
        return number;
    

    public void setNumber(String number) 
        this.number = number;
    

【问题讨论】:

这是我的截图drive.google.com/file/d/1EAxPGXJSCtT8UywYhkg97ygFXTWxIGN2/view 对联系人使用集合,而不是列表。然后将集合转换为列表List l = new ArrayList(set),集合将避免重复。但请注意 - ContactModel 必须实现比较和等于。 你能给我举个例子吗? 【参考方案1】:

在您的活动中(第一段代码):

    Set<ContactModel> contactModelSet = new HashSet<>();

    // the same ...

    ArrayList<ContactModel> contactModelArrayList = new ArrayList<>(contactModelSet);

    contactAllAdapter = new ContactAllAdapter(this,contactModelArrayList);

在 ContactModel 类中:

@Override
public int hashCode() 
    // calculate hash code if needed, something like this
    return this.name.hashCode() + this.number.hashCode();


@Override
public boolean equals(Object obj) 
    if (obj instanceof ContactModel) 
        ContactModel cm = (ContactModel) obj;
        return this.getName().equals(cm.getName()) && this.getNumber().equals(cm.getNumber());
    
    return false;


@Override
public int compareTo(ContactModel o) 
    // implement if you need to order
    // don't know your criteria
    // must return -1, 0, 1 if this is less, equal or greater than o
    return 0;

【讨论】:

还是一样,不行……还是显示重复联系人 你能调试或记录平等的联系人吗? Java set 不接受equals 对象,因此您的ContactModel 中必须有一些东西。只需在添加到集合之前打印出对象。并在 ContactModel 中实现一个不错的 toString 方法来查看姓名和号码 获取联系人数据时不会出现问题吗?因为我的查询就像在我的手机上获取所有联系人数据,现在我的手机有一个谷歌帐户,wa 等,似乎与联系人同步......那么问题不是来自那里吗? 嗯,可能是这样,但是如果您有重复的联系人并将两个相等的对象放在一个集合中,那么该集合将只接受一个。那是为了我们实现equals方法。 数字获取值例如 0857-9119-8270 和 085791198270... 那么,如何将该数字更改为相同的数字?以及任何值,例如 +62 896-7975-9830 和 +6289679759830... 你能帮我解决这个问题吗?这几天我被困住了:')

以上是关于如何使用 ListView 删除 Android Studio 显示中的重复联系人 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何删除 ListView 中的选中行?

如何从android的listview中删除一个项目

如何从 ListView 中删除 Firebase Android 中的特定节点

Android:如何从 listView 和 arrayAdapter 中删除项目

android 如何在listview中点击当前Item中的按钮删除该item

如何动画添加或删除 Android ListView 行