Fix issues with conversation list position.
This commit is contained in:
parent
e4456bb236
commit
a73427d68d
4 changed files with 25 additions and 23 deletions
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue