java - 在 recyclerview 中加载选取的联系人

标签 java android android-recyclerview contacts

为了确保数据发送正确,我使用了toast。起初我认为它运作良好,但它有一些问题。

  1. 选择任何联系人都会输出相同的数据。

  2. 无论如何,它有点工作,但它不向回收器 View 显示数据。

我该怎么办?...我真的需要你的帮助。

主要 Activity

public class RegisterContacts extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    RecyclerView.LayoutManager layoutManager;

    final ArrayList<Contact> datas = new ArrayList<>();
    Button contacts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_contacts);

        recyclerView = (RecyclerView) findViewById(R.id.listView_contacts);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        adapter = new RecyclerAdapter(datas, this);
        recyclerView.setAdapter(adapter);

        contacts = (Button) findViewById(R.id.btn_contacts);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkPermission();
        } else {
            contacts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setData(ContactsContract.Contacts.CONTENT_URI);
                    startActivityForResult(intent, 1);
                }
            });
        }
    }

    private final int REQ_CODE = 100;

    @TargetApi(Build.VERSION_CODES.M)
    private void checkPermission() {
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED
                || checkSelfPermission(Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED
                ) {
            String permArr[] = {Manifest.permission.READ_EXTERNAL_STORAGE
                    , Manifest.permission.READ_CONTACTS};

            requestPermissions(permArr, REQ_CODE);
        } else {
            contacts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                    startActivityForResult(intent, 1);
                }
            });
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQ_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                contacts.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                        startActivityForResult(intent, 1);
                    }
                });
            } else {
                Toast.makeText(this, "~", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Contact contact = new Contact();

        switch (requestCode) {
            case (1) :
                if (resultCode == Activity.RESULT_OK) {
                    Cursor c =  getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                    if (c.moveToFirst()) {
                        String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);

                        while(phones.moveToNext()){
                            String tel = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                            //showSelectedNumber(name, tel);

                            contact.setName(name);
                            contact.addTel(tel);

                            datas.add(contact);
                        }
                        phones.close();

                    }
                    c.close();
                }
                break;
        }
    }

    //public void showSelectedNumber(String name, String tel) {
        Toast.makeText(this, name + ": " + tel, Toast.LENGTH_LONG).show();
    }

}

适配器

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> {

    ArrayList<Contact> datas;
    Context context;

    public RecyclerAdapter(ArrayList<Contact> datas, Context context) {
        this.datas = datas;
        this.context = context;
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.contact_item, parent, false);
        Holder holder = new Holder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(Holder holder, int position) {
        final Contact contact = datas.get(position);

        holder.contacts_Name.setText(contact.getName());
        holder.contacts_Tel.setText(contact.getTelOne());
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    public class Holder extends RecyclerView.ViewHolder {

        CardView contacts_cardView;
        TextView contacts_Name,contacts_Tel;
        ImageButton btnCancel;

        public Holder(View itemView) {
            super(itemView);

            contacts_cardView = (CardView) itemView.findViewById(R.id.contacts_cardView);
            contacts_Name = (TextView) itemView.findViewById(R.id.contacts_Name);
            contacts_Tel = (TextView) itemView.findViewById(R.id.contacts_Tel);
            btnCancel = itemView.findViewById(R.id.btnCancel);

            btnCancel.setOnClickListener(new View.OnClickListener() {

            });
        }
    }
}

联系方式

public class Contact {
    private String name;
    private ArrayList<String> tel;

    public Contact(){
        name = new String();
        tel = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

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

    public ArrayList<String> getTel() {
        return tel;
    }

    public String getTelOne(){
        if(tel.size() > 0)
            return tel.get(0);
        else
            return null;
    }

    public void setTel(ArrayList<String> tel) {
        this.tel = tel;
    }

    public void addTel(String tel){
        this.tel.add(tel);
    }

    public void removeTel(String tel){
        this.tel.remove(tel);
    }
}

problem 2's error

: handleWindowVisibility: no activity for token android.os.BinderProxy

> this is common logcat which occured when I run app.
2019-08-14 12:35:27.710 8634-8634/com.example.asus.justtrustme W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@f712f7e
2019-08-14 12:35:28.299 8634-8634/com.example.asus.justtrustme E/RecyclerView: No adapter attached; skipping layout
2019-08-14 12:35:28.347 8634-8634/com.example.asus.justtrustme I/Choreographer: Skipped 32 frames!  The application may be doing too much work on its main thread.

2019-08-14 12:37:02.125 1613-1690/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 13846040 , only wrote 13692240
2019-08-14 12:37:02.359 8548-8580/? W/PlayCommon: [489] PlayEventLogger.getAuthToken: No account for auth token provided

W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@f712f7e
E/RecyclerView: No adapter attached; skipping layout
I/Choreographer: Skipped 32 frames!  The application may be doing too much work on its main thread.

最佳答案

ArrayList 在 Activity 启动时没有数据,因此在获取联系人列表后,您应该调用 recycleView 适配器并将列表数据传递到适配器内。 像这样更改您的代码:

public class RegisterContacts extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    RecyclerView.LayoutManager layoutManager;

    final ArrayList<Contact> datas = new ArrayList<>();
    Button contacts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_contacts);

        recyclerView = (RecyclerView) findViewById(R.id.listView_contacts);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

      //  adapter = new RecyclerAdapter(datas, this);<--Remove this line from here
      //  recyclerView.setAdapter(adapter);<--Remove this line from here

        contacts = (Button) findViewById(R.id.btn_contacts);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkPermission();
        } else {
            contacts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setData(ContactsContract.Contacts.CONTENT_URI);
                    startActivityForResult(intent, 1);
                }
            });
        }
    }

    private final int REQ_CODE = 100;

    @TargetApi(Build.VERSION_CODES.M)
    private void checkPermission() {
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED
                || checkSelfPermission(Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED
                ) {
            String permArr[] = {Manifest.permission.READ_EXTERNAL_STORAGE
                    , Manifest.permission.READ_CONTACTS};

            requestPermissions(permArr, REQ_CODE);
        } else {
            contacts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                    startActivityForResult(intent, 1);
                }
            });
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQ_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                contacts.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                        startActivityForResult(intent, 1);
                    }
                });
            } else {
                Toast.makeText(this, "~", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Contact contact = new Contact();

        switch (requestCode) {
            case (1) :
                if (resultCode == Activity.RESULT_OK) {
                    Cursor c =  getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                    if (c.moveToFirst()) {
                        String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);

                        while(phones.moveToNext()){
                            String tel = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                            //showSelectedNumber(name, tel);

                            contact.setName(name);
                            contact.addTel(tel);

                            datas.add(contact);
                        }
                        phones.close();

                    }
                    c.close();
                    adapter = new RecyclerAdapter(datas, this);
                    recyclerView.setAdapter(adapter);

                }
                break;
        }
    }

    //public void showSelectedNumber(String name, String tel) {
        Toast.makeText(this, name + ": " + tel, Toast.LENGTH_LONG).show();
    }

}

更多详细信息可以引用此文档:doc

对于回收 View 项目单击。这里是代码:

public Holder(View itemView) {
     super(itemView);
   contacts_cardView = (CardView) itemView.findViewById(R.id.contacts_cardView);
   contacts_Name = (TextView)itemView.findViewById(R.id.contacts_Name);
   contacts_Tel = (TextView) itemView.findViewById(R.id.contacts_Tel);
   btnCancel = itemView.findViewById(R.id.btnCancel);

   btnCancel.setOnClickListener(new View.OnClickListener() {

   });

  itemView.setOnClickListener(new View.OnClickListener() {
      int pos=getAdapterPosition();
     Toast.makeText(context,"Pick contact :"+datas.get(pos).getName(), Toast.LENGTH_SHORT);
  });
}

有关recycleview项的更多详细信息,请单击监听器检查:doc

关于java - 在 recyclerview 中加载选取的联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487362/

相关文章:

java - JMS onMessage() 和并发

java - 通过 Java 使用 gmail 发送电子邮件

java - Java 中的 Web 浏览器控制?

android - 如何限制列表项在ListView中显示

android - 我可以使用 ViewPager2 设置非线性(旧式)动画吗?

java - 为什么使用 ArrayList 循环创建 ImageView 会导致内存错误?

android - 如何在Android中比较音频?

java - 我在 Recycler View 上得到一个 Null Reference

android - 滚动后回收器 View 项目颜色变化重复

java - Android 而不是回收器 View 中的卡片 View ,该应用程序向我显示一个空白页面