Fix issues with conversation list position.

master
Alex Hart 2020-08-13 20:09:16 -03:00 committed by Greyson Parrelli
parent e4456bb236
commit a73427d68d
4 changed files with 25 additions and 23 deletions

View File

@ -4,13 +4,11 @@ import android.view.LayoutInflater;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.paging.PagedList;
import androidx.recyclerview.widget.RecyclerView;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.conversationlist.model.Conversation;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.util.adapter.FixedViewsAdapter;
import org.thoughtcrime.securesms.util.adapter.RecyclerViewConcatenateAdapter;
@ -38,9 +36,9 @@ class CompositeConversationListAdapter extends RecyclerViewConcatenateAdapter {
unpinned.setText(rv.getContext().getString(R.string.conversation_list__chats));
this.pinnedHeaderAdapter = new FixedViewsAdapter(pinned);
this.pinnedAdapter = new ConversationListAdapter(glideRequests, onConversationClickListener);
this.pinnedAdapter = new ConversationListAdapter(this, glideRequests, onConversationClickListener);
this.unpinnedHeaderAdapter = new FixedViewsAdapter(unpinned);
this.unpinnedAdapter = new ConversationListAdapter(glideRequests, onConversationClickListener);
this.unpinnedAdapter = new ConversationListAdapter(this, glideRequests, onConversationClickListener);
pinnedHeaderAdapter.hide();
unpinnedHeaderAdapter.hide();

View File

@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.CachedInflater;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.adapter.RecyclerViewConcatenateAdapter;
import java.util.Collection;
import java.util.Collections;
@ -47,9 +48,15 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
private final Set<Long> typingSet = new HashSet<>();
private int archived;
protected ConversationListAdapter(@NonNull GlideRequests glideRequests, @NonNull OnConversationClickListener onConversationClickListener) {
private final RecyclerViewConcatenateAdapter parent;
protected ConversationListAdapter(@NonNull RecyclerViewConcatenateAdapter parent,
@NonNull GlideRequests glideRequests,
@NonNull OnConversationClickListener onConversationClickListener)
{
super(new ConversationDiffCallback());
this.parent = parent;
this.glideRequests = glideRequests;
this.onConversationClickListener = onConversationClickListener;
}
@ -61,9 +68,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
.inflate(R.layout.conversation_list_item_action, parent, false), viewType);
holder.itemView.setOnClickListener(v -> {
int position = holder.getLocalAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
if (holder.getAdapterPosition() != RecyclerView.NO_POSITION) {
onConversationClickListener.onShowArchiveClick();
}
});
@ -74,7 +79,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
.inflate(R.layout.conversation_list_item_view, parent, false), viewType);
holder.itemView.setOnClickListener(v -> {
int position = holder.getLocalAdapterPosition();
int position = this.parent.getLocalPosition(holder.getAdapterPosition()).getLocalPosition();
if (position != RecyclerView.NO_POSITION) {
onConversationClickListener.onConversationClick(getItem(position));
@ -82,7 +87,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
});
holder.itemView.setOnLongClickListener(v -> {
int position = holder.getLocalAdapterPosition();
int position = this.parent.getLocalPosition(holder.getAdapterPosition()).getLocalPosition();
if (position != RecyclerView.NO_POSITION) {
return onConversationClickListener.onConversationLongClick(getItem(position));
@ -121,7 +126,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
holder.setLocalAdapterPosition(position);
if (holder.getLocalViewType() == TYPE_ACTION) {
ConversationViewHolder casted = (ConversationViewHolder) holder;
@ -238,7 +242,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
static class BaseViewHolder extends RecyclerView.ViewHolder {
private final int viewType;
private int adapterPosition = RecyclerView.NO_POSITION;
public BaseViewHolder(@NonNull View itemView, int viewType) {
super(itemView);
@ -248,14 +251,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
public int getLocalViewType() {
return viewType;
}
public int getLocalAdapterPosition() {
return getAdapterPosition() == RecyclerView.NO_POSITION ? RecyclerView.NO_POSITION : adapterPosition;
}
public void setLocalAdapterPosition(int adapterPosition) {
this.adapterPosition = adapterPosition;
}
}
static final class ConversationViewHolder extends BaseViewHolder {

View File

@ -61,7 +61,12 @@ public final class FixedViewsAdapter extends RecyclerView.Adapter<RecyclerView.V
private void setHidden(boolean hidden) {
if (this.hidden != hidden) {
this.hidden = hidden;
notifyDataSetChanged();
if (hidden) {
notifyItemRangeRemoved(0, viewList.size());
} else {
notifyItemRangeInserted(0, viewList.size());
}
}
}
}

View File

@ -143,7 +143,7 @@ public class RecyclerViewConcatenateAdapter extends RecyclerView.Adapter<Recycle
}
}
static class ChildAdapterPositionPair {
public static class ChildAdapterPositionPair {
final ChildAdapter childAdapter;
final int localPosition;
@ -156,6 +156,10 @@ public class RecyclerViewConcatenateAdapter extends RecyclerView.Adapter<Recycle
RecyclerView.Adapter<? extends RecyclerView.ViewHolder> getAdapter() {
return childAdapter.adapter;
}
public int getLocalPosition() {
return localPosition;
}
}
/**
@ -195,7 +199,7 @@ public class RecyclerViewConcatenateAdapter extends RecyclerView.Adapter<Recycle
* position in that adapter that corresponds to the given global position.
*/
@NonNull
ChildAdapterPositionPair getLocalPosition(final int globalPosition) {
public ChildAdapterPositionPair getLocalPosition(final int globalPosition) {
int count = 0;
for (ChildAdapter childAdapter : adapters) {