在回收器视图中加载拣选的联系人



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

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

  2. 无论如何,它在某种程度上起作用,但它没有向回收器视图显示数据。

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

主活动

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);
}
}

问题 2 的错误

: 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 在活动开始时没有数据,所以在获取联系人列表后,你应该调用 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

对于回收视图项目,请单击。这是代码:

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);
});
}

有关回收视图项目的更多详细信息,请单击侦听器检查:doc

最新更新