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 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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue