Я пытаюсь добавить пользователей в такую группу, как WhatsApp, но не могу понять, как это сделать, и пока не нашел решения.
Когда мы добавляем пользователей в WhatsApp, добавленные пользователи отображаются горизонтально в верхней части, а пользователь в списке контактов отмечается зеленым кружком.
В моем случае я использовал два RecyclerViews: один для добавленных пользователей, а другой для списка контактов.
Моя первая проблема: добавленные пользователи отображаются по одному на страницу. Как разместить их рядом?
Моя вторая проблема: я не могу понять, как изменить CircleImageView с зеленого на ноль и наоборот. Я думаю, что это связано со связью между двумя адаптерами.
Вот что у меня есть до сих пор:
Вот как я вызываю RecyclerViews в Activity.java, где mUserList
соответствует списку контактов, а mUserListAdded
соответствует добавленным пользователям (горизонтальное представление recycler).
mToolBar = findViewById(R.id.find_user_bar_layout);
setSupportActionBar(mToolBar);
getSupportActionBar().setTitle("Novo Contato");
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
mUpdateGroupBtn = findViewById(R.id.new_user_finalize_button);
mUserList= findViewById(R.id.userList);
mUserList.setNestedScrollingEnabled(false);
mUserList.setHasFixedSize(false);
mUserListLayoutManager = new LinearLayoutManager(getApplicationContext(),LinearLayout.VERTICAL,false);
mUserList.setLayoutManager(mUserListLayoutManager);
mUserListAdapter = new UserListAdapter(userList, this);
mUserList.setAdapter(mUserListAdapter);
mUserListAdded = findViewById(R.id.user_from_contactlist);
mUserListAdded.setNestedScrollingEnabled(false);
mUserListAdded.setHasFixedSize(true);
mUserListAddedLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL,false);
mUserListAdded.setLayoutManager(mUserListAddedLayoutManager);
mUserListAddedAdapter = new UserListAddedAdapter(userListAdded, this);
mUserListAdded.setAdapter(mUserListAddedAdapter);
Вот адаптер для mUserList
:
public class UserListAdapter extends RecyclerView.Adapter<UserListAdapter.UserListViewHolder> implements Filterable {
private UserListToUserListAddedAdapter userListToUserListAddedAdapter;
ArrayList<UserObject> userList, userListFull;
private HashMap<Integer,Boolean> selectedItem = new HashMap<>();
public UserListAdapter(ArrayList<UserObject> userList, UserListToUserListAddedAdapter listener){
this.userList = userList;
this.userListFull = new ArrayList<>(userList);
this.userListToUserListAddedAdapter = listener;
}
@NonNull
@Override
public UserListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user,null,false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
layoutView.setLayoutParams(lp);
UserListViewHolder rcv = new UserListViewHolder(layoutView);
return rcv;
}
@Override
public void onBindViewHolder(@NonNull final UserListViewHolder holder, final int position) {
holder.mName.setText(userList.get(position).getName());
holder.mPhone.setText(userList.get(position).getPhone());
holder.mLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedItem.get(position) == null || selectedItem.get(position) == false) {
selectedItem.put(position, true);
holder.mIcon.setVisibility(View.VISIBLE);
holder.mIcon.setImageResource(R.drawable.online);
if (userListToUserListAddedAdapter != null) {
Log.i("debinf userListAdp", "userListToUserListAddedAdapter != null");
userListToUserListAddedAdapter.getUserAdded(userList.get(position), true);
}
} else {
selectedItem.put(position, false);
holder.mIcon.setVisibility(View.INVISIBLE);
if (userListToUserListAddedAdapter != null) {
Log.i("debinf userListAdp", "userListToUserListAddedAdapter != null");
userListToUserListAddedAdapter.getUserAdded(userList.get(position), false);
}
}
/*String key = FirebaseDatabase.getInstance().getReference().child("group").push().getKey();
FirebaseDatabase.getInstance().getReference().child("user").child(FirebaseAuth.getInstance().getUid()).child("group").child(key).setValue(true);
FirebaseDatabase.getInstance().getReference().child("user").child(userList.get(position).getUid()).child("group").child(key).setValue(true);*/
if (FirebaseAuth.getInstance().getUid().equals(userList.get(position).getUid())) {
Toast.makeText(v.getContext(), "Voce eh o(a) criador(a) do Grupo e ja foi adicionado(a)", Toast.LENGTH_SHORT).show();
} else {
//FirebaseDatabase.getInstance().getReference().child("ContactAdded").child(FirebaseAuth.getInstance().getUid()).child(userList.get(position).getUid()).setValue("");
Map<String, String> NamePhoneMap = new HashMap<>();
NamePhoneMap.put("name",userList.get(position).getName());
NamePhoneMap.put("phone",userList.get(position).getPhone());
Toast.makeText(v.getContext(), "Voce adiciou : " + NamePhoneMap, Toast.LENGTH_SHORT).show();
}
//DatabaseReference contactAdded = FirebaseDatabase.getInstance().getReference().child("ContactAdded").child(FirebaseAuth.getInstance().getUid()).child(userList.get(position).getUid());
//Task<Void> voidTask = contactAdded.updateChildren(NamePhoneMap);
//ItemClicked.add();
//Log.i("debinf userlistadapter", "");
}
});
}
@Override
public int getItemCount() {
return userList.size();
}
public void addBackingListUser(UserObject user) {
userListFull.add(user);
}
@Override
public Filter getFilter() {
return teamFilter;
}
private Filter teamFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<UserObject> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(userListFull);
} else {
String filterParttern = constraint.toString().toLowerCase().trim();
for (UserObject user : userListFull) {
if (user.getName().toLowerCase().contains(filterParttern) || user.getPhone().toLowerCase().contains(filterParttern)) {
filteredList.add(user);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
userList.clear();
userList.addAll((List) results.values);
notifyDataSetChanged();
}
};
public class UserListViewHolder extends RecyclerView.ViewHolder {
public CircleImageView mIcon;
public TextView mName, mPhone;
public RelativeLayout mLayout;
public UserListViewHolder(View view){
super(view);
mIcon = view.findViewById(R.id.user_profile_icon);
mName = view.findViewById(R.id.name);
mPhone = view.findViewById(R.id.phone);
mLayout = view.findViewById(R.id.layoutItemUser);
}
}
public void setProfileIcon(UserObject userObject) {
}
public interface UserListToUserListAddedAdapter {
void getUserAdded(UserObject user, boolean isToAdd);
}
}
Вот адаптер для mUserListAdded
public class UserListAddedAdapter extends RecyclerView.Adapter<UserListAddedAdapter.UserListAddedViewHolder> {
private UserListAddedToUserListAdapter userListAddedToUserListAdapter;
ArrayList<UserObject> userListAdded;
public UserListAddedAdapter(ArrayList<UserObject> userListAdded, UserListAddedToUserListAdapter listener){
this.userListAdded = userListAdded;
this.userListAddedToUserListAdapter = listener;
}
@NonNull
@Override
public UserListAddedAdapter.UserListAddedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user_added,null,false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
layoutView.setLayoutParams(lp);
UserListAddedAdapter.UserListAddedViewHolder rcv = new UserListAddedAdapter.UserListAddedViewHolder(layoutView);
return rcv;
}
@Override
public void onBindViewHolder(@NonNull UserListAddedViewHolder holder, final int position) {
holder.mName.setText(userListAdded.get(position).getPhone());
//holder.mPhone.setText(userListAdded.get(position).getPhone());
holder.mIcon.setImageResource(R.drawable.cancel_black_18dp);
//holder.mLayout.setOnTouchListener();
holder.mLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (userListAddedToUserListAdapter != null) {
Log.i("debinf userListAdp", "userListToUserListAddedAdapter != null");
userListAddedToUserListAdapter.getUserRemoved(userListAdded.get(position));
}
/*String key = FirebaseDatabase.getInstance().getReference().child("group").push().getKey();
FirebaseDatabase.getInstance().getReference().child("user").child(FirebaseAuth.getInstance().getUid()).child("group").child(key).setValue(true);
FirebaseDatabase.getInstance().getReference().child("user").child(userList.get(position).getUid()).child("group").child(key).setValue(true);*/
if (FirebaseAuth.getInstance().getUid().equals(userListAdded.get(position).getUid())) {
//Log.i("debinf", "Owner Group was selected");
Toast.makeText(v.getContext(), "Voce eh o(a) criador(a) do Grupo e nao pode ser removido(a)", Toast.LENGTH_SHORT).show();
} else {
FirebaseDatabase.getInstance().getReference().child("ContactAdded").child(FirebaseAuth.getInstance().getUid()).child(userListAdded.get(position).getUid()).removeValue();
Toast.makeText(v.getContext(), "Voce removeu : " + userListAdded.get(position).getUid(), Toast.LENGTH_SHORT).show();
}
//ItemClicked.add();
//Log.i("debinf userlistadapter", "");
}
});
}
@Override
public int getItemCount() {
return userListAdded.size();
}
public class UserListAddedViewHolder extends RecyclerView.ViewHolder {
public CircleImageView mIcon;
public TextView mName;
public RelativeLayout mLayout;
public UserListAddedViewHolder(View view){
super(view);
mIcon = view.findViewById(R.id.user_profile_icon_added);
mIcon.setVisibility(View.VISIBLE);
mName = view.findViewById(R.id.name_user_added);
mLayout = view.findViewById(R.id.layoutItemUserAdded);
}
}
public interface UserListAddedToUserListAdapter {
void getUserRemoved(UserObject user);
}
}
Вот это xml
<RelativeLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NewUserToGroupActivity">
<include
android:id="@+id/find_user_bar_layout"
layout="@layout/app_bar_layout">
</include>
<android.support.v7.widget.RecyclerView
android:id="@+id/user_from_contactlist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/find_user_bar_layout">
</android.support.v7.widget.RecyclerView>
<LinearLayout
android:id="@+id/users_already_added"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/user_from_contactlist"
android:orientation="vertical">
<View
android:id="@+id/list_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="4dp"
android:background="?android:attr/listDivider" />
<android.support.v7.widget.RecyclerView
android:id="@+id/userList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/list_divider">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
<Button
android:id="@+id/new_user_finalize_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="0dp"
android:text="Finalizar"
android:textAllCaps="false" />
</RelativeLayout>
Я ценю любого, кто мог бы помочь мне решить эти две проблемы: расстояние между горизонтальными элементами (верхняя часть) и изменение CircleImageView с зеленого на добавленное значение, если не удалено.