Fix issues with conversation list position.

This commit is contained in:
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 android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.paging.PagedList; import androidx.paging.PagedList;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.conversationlist.model.Conversation; import org.thoughtcrime.securesms.conversationlist.model.Conversation;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.util.adapter.FixedViewsAdapter; import org.thoughtcrime.securesms.util.adapter.FixedViewsAdapter;
import org.thoughtcrime.securesms.util.adapter.RecyclerViewConcatenateAdapter; 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)); unpinned.setText(rv.getContext().getString(R.string.conversation_list__chats));
this.pinnedHeaderAdapter = new FixedViewsAdapter(pinned); this.pinnedHeaderAdapter = new FixedViewsAdapter(pinned);
this.pinnedAdapter = new ConversationListAdapter(glideRequests, onConversationClickListener); this.pinnedAdapter = new ConversationListAdapter(this, glideRequests, onConversationClickListener);
this.unpinnedHeaderAdapter = new FixedViewsAdapter(unpinned); this.unpinnedHeaderAdapter = new FixedViewsAdapter(unpinned);
this.unpinnedAdapter = new ConversationListAdapter(glideRequests, onConversationClickListener); this.unpinnedAdapter = new ConversationListAdapter(this, glideRequests, onConversationClickListener);
pinnedHeaderAdapter.hide(); pinnedHeaderAdapter.hide();
unpinnedHeaderAdapter.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.recipients.Recipient;
import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.CachedInflater;
import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.adapter.RecyclerViewConcatenateAdapter;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -47,9 +48,15 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
private final Set<Long> typingSet = new HashSet<>(); private final Set<Long> typingSet = new HashSet<>();
private int archived; 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()); super(new ConversationDiffCallback());
this.parent = parent;
this.glideRequests = glideRequests; this.glideRequests = glideRequests;
this.onConversationClickListener = onConversationClickListener; this.onConversationClickListener = onConversationClickListener;
} }
@ -61,9 +68,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
.inflate(R.layout.conversation_list_item_action, parent, false), viewType); .inflate(R.layout.conversation_list_item_action, parent, false), viewType);
holder.itemView.setOnClickListener(v -> { holder.itemView.setOnClickListener(v -> {
int position = holder.getLocalAdapterPosition(); if (holder.getAdapterPosition() != RecyclerView.NO_POSITION) {
if (position != RecyclerView.NO_POSITION) {
onConversationClickListener.onShowArchiveClick(); onConversationClickListener.onShowArchiveClick();
} }
}); });
@ -74,7 +79,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
.inflate(R.layout.conversation_list_item_view, parent, false), viewType); .inflate(R.layout.conversation_list_item_view, parent, false), viewType);
holder.itemView.setOnClickListener(v -> { holder.itemView.setOnClickListener(v -> {
int position = holder.getLocalAdapterPosition(); int position = this.parent.getLocalPosition(holder.getAdapterPosition()).getLocalPosition();
if (position != RecyclerView.NO_POSITION) { if (position != RecyclerView.NO_POSITION) {
onConversationClickListener.onConversationClick(getItem(position)); onConversationClickListener.onConversationClick(getItem(position));
@ -82,7 +87,7 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
}); });
holder.itemView.setOnLongClickListener(v -> { holder.itemView.setOnLongClickListener(v -> {
int position = holder.getLocalAdapterPosition(); int position = this.parent.getLocalPosition(holder.getAdapterPosition()).getLocalPosition();
if (position != RecyclerView.NO_POSITION) { if (position != RecyclerView.NO_POSITION) {
return onConversationClickListener.onConversationLongClick(getItem(position)); return onConversationClickListener.onConversationLongClick(getItem(position));
@ -121,7 +126,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
@Override @Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) { public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
holder.setLocalAdapterPosition(position);
if (holder.getLocalViewType() == TYPE_ACTION) { if (holder.getLocalViewType() == TYPE_ACTION) {
ConversationViewHolder casted = (ConversationViewHolder) holder; ConversationViewHolder casted = (ConversationViewHolder) holder;
@ -238,7 +242,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
static class BaseViewHolder extends RecyclerView.ViewHolder { static class BaseViewHolder extends RecyclerView.ViewHolder {
private final int viewType; private final int viewType;
private int adapterPosition = RecyclerView.NO_POSITION;
public BaseViewHolder(@NonNull View itemView, int viewType) { public BaseViewHolder(@NonNull View itemView, int viewType) {
super(itemView); super(itemView);
@ -248,14 +251,6 @@ class ConversationListAdapter extends PagedListAdapter<Conversation, Conversatio
public int getLocalViewType() { public int getLocalViewType() {
return viewType; 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 { 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) { private void setHidden(boolean hidden) {
if (this.hidden != hidden) { if (this.hidden != hidden) {
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 ChildAdapter childAdapter;
final int localPosition; final int localPosition;
@ -156,6 +156,10 @@ public class RecyclerViewConcatenateAdapter extends RecyclerView.Adapter<Recycle
RecyclerView.Adapter<? extends RecyclerView.ViewHolder> getAdapter() { RecyclerView.Adapter<? extends RecyclerView.ViewHolder> getAdapter() {
return childAdapter.adapter; 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. * position in that adapter that corresponds to the given global position.
*/ */
@NonNull @NonNull
ChildAdapterPositionPair getLocalPosition(final int globalPosition) { public ChildAdapterPositionPair getLocalPosition(final int globalPosition) {
int count = 0; int count = 0;
for (ChildAdapter childAdapter : adapters) { for (ChildAdapter childAdapter : adapters) {