【发布时间】:2020-12-23 22:29:25
【问题描述】:
我已经实现了RecyclerView 来显示联系人列表(大约 200 个)。用户可以选择多个项目。选择使勾号可见,以向用户指示所选联系人。但是,当用户选择一个项目时,勾号会出现在几个未选择的项目上。发生的频率是一样的。
你能告诉我我做错了什么吗?谢谢!
这是我的实现:
我有一个名为 NewAppointmentActivity 的活动,其中包含一个名为 NewAppointmentPhoneContactsFragment 的片段。这个片段是一个 RecyclerView :
文件 fragment_new_appointment_phone_contacts.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list"
android:name="com.example.geoappointment.fragments.NewAppointmentPhoneContactsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
app:layoutManager="LinearLayoutManager"
tools:context=".fragments.NewAppointmentPhoneContactsFragment"
tools:listitem="@layout/fragment_contact_item" />
文件 NewAppointmentPhoneContactsFragment.java
public class NewAppointmentPhoneContactsFragment extends Fragment {
private static final String TAG = "NewAppointmentPhoneCont";
private NewAppointmentActivityViewModel viewModel;
public NewAppointmentPhoneContactsFragment() {}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(NewAppointmentActivityViewModel.class);
new LoadContactsFromPhoneAsyncTask(
requireActivity().getContentResolver(),
requireActivity().getApplicationContext(),
new AsyncTaskCallback<ArrayList<Contact>>() {
@Override
public void onPostExecuteCallback(ArrayList<Contact> param) {
if (viewModel != null) {
viewModel.setPhoneContacts(param);
}
}
}).execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_new_appointment_phone_contacts, container, false);
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
viewModel.getPhoneContacts().observe(getViewLifecycleOwner(), contacts -> {
recyclerView.setAdapter(new MyContactListRecyclerViewAdapter(contacts));
});
}
return view;
}
}
AsynTask 完成后,它会通知模型将适配器设置为 RecyclerView(它工作正常)。
文件 MyContactListRecyclerViewAdapter.java
public class MyContactListRecyclerViewAdapter extends RecyclerView.Adapter<MyContactListRecyclerViewAdapter.ViewHolder> {
private static final String TAG = "MyContactListRecyclerVi";
private final ArrayList<Contact> mValues;
private final ArrayList<Contact> mSelectedValues;
public MyContactListRecyclerViewAdapter(ArrayList<Contact> items) {
mValues = items;
mSelectedValues = new ArrayList<>();
}
@NotNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.fragment_contact_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mItem = mValues.get(position);
holder.mNameTextView.setText(holder.mItem.getName());
holder.mPhoneNumberView.setText(holder.mItem.getPhoneNumber());
if (mSelectedValues.contains(holder.mItem)) {
holder.tickImageView.setVisibility(View.VISIBLE);
}
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClick(holder, position);
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
public void onItemClick(final ViewHolder holder, int position) {
// Récupération du contact sélectionné
final Contact contact = mValues.get(position);
Log.d(TAG, contact.toString());
// Si le contact n'est pas nul
if (contact != null) {
// Si le contact n'est pas déjà sélectionné
if (!mSelectedValues.contains(contact)) {
// Ajout du contact dans la liste des contacts sélectionnés
mSelectedValues.add(contact);
// Démasque la tick de sélection
holder.tickImageView.setVisibility(View.VISIBLE);
} else {
// Retire le contact de la liste des contacts sélectionnés
mSelectedValues.remove(contact);
// Masque la tick de sélection
holder.tickImageView.setVisibility(View.INVISIBLE);
}
}
Log.d(TAG, mSelectedValues.toString());
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final TextView mNameTextView;
public final TextView mPhoneNumberView;
public final ImageView tickImageView;
public Contact mItem;
public ViewHolder(View view) {
super(view);
mView = view;
mNameTextView = (TextView) view.findViewById(R.id.contactItemNameTextView);
mPhoneNumberView = (TextView) view.findViewById(R.id.contactItemPhoneNumber);
tickImageView = (ImageView) view.findViewById(R.id.contactItemTickImageView);
if (mItem != null) {
if (mSelectedValues.contains(mItem)) {
tickImageView.setVisibility(View.VISIBLE);
}
}
}
}
}
【问题讨论】:
标签: android android-layout android-fragments android-recyclerview