Replace ListView with RecyclerView for the message list.

This commit is contained in:
leopoldsedev
2020-02-10 18:41:06 +01:00
committed by Jannis Mattheis
parent 668e050add
commit fd07cad969
3 changed files with 53 additions and 42 deletions

View File

@@ -5,10 +5,10 @@ import android.text.util.Linkify;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@@ -25,7 +25,7 @@ import io.noties.markwon.image.picasso.PicassoImagesPlugin;
import io.noties.markwon.movement.MovementMethodPlugin; import io.noties.markwon.movement.MovementMethodPlugin;
import java.util.List; import java.util.List;
public class ListMessageAdapter extends BaseAdapter { public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.ViewHolder> {
private Context content; private Context content;
private Picasso picasso; private Picasso picasso;
@@ -60,30 +60,17 @@ public class ListMessageAdapter extends BaseAdapter {
this.items = items; this.items = items;
} }
@NonNull
@Override @Override
public int getCount() { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return items.size(); View view = LayoutInflater.from(content).inflate(R.layout.message_item, parent, false);
}
@Override
public MessageWithImage getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return getItem(position).message.getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view;
if (convertView == null) {
view = LayoutInflater.from(content).inflate(R.layout.message_item, parent, false);
} else {
view = convertView;
}
ViewHolder holder = new ViewHolder(view); ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final MessageWithImage message = items.get(position); final MessageWithImage message = items.get(position);
if (Extras.useMarkdown(message.message)) { if (Extras.useMarkdown(message.message)) {
holder.message.setAutoLinkMask(0); holder.message.setAutoLinkMask(0);
@@ -102,8 +89,17 @@ public class ListMessageAdapter extends BaseAdapter {
? Utils.dateToRelative(message.message.getDate()) ? Utils.dateToRelative(message.message.getDate())
: "?"); : "?");
holder.delete.setOnClickListener((ignored) -> delete.delete(message.message)); holder.delete.setOnClickListener((ignored) -> delete.delete(message.message));
}
return view; @Override
public int getItemCount() {
return items.size();
}
@Override
public long getItemId(int position) {
MessageWithImage currentItem = items.get(position);
return currentItem.message.getId();
} }
static class ViewHolder extends RecyclerView.ViewHolder { static class ViewHolder extends RecyclerView.ViewHolder {

View File

@@ -12,9 +12,7 @@ import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ViewFlipper; import android.widget.ViewFlipper;
import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.ActionBarDrawerToggle;
@@ -23,6 +21,9 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat; import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@@ -66,7 +67,7 @@ import okhttp3.OkHttpClient;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
public class MessagesActivity extends AppCompatActivity public class MessagesActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, AbsListView.OnScrollListener { implements NavigationView.OnNavigationItemSelectedListener {
private BroadcastReceiver receiver = private BroadcastReceiver receiver =
new BroadcastReceiver() { new BroadcastReceiver() {
@@ -90,7 +91,7 @@ public class MessagesActivity extends AppCompatActivity
NavigationView navigationView; NavigationView navigationView;
@BindView(R.id.messages_view) @BindView(R.id.messages_view)
ListView messagesView; RecyclerView messagesView;
@BindView(R.id.swipe_refresh) @BindView(R.id.swipe_refresh)
SwipeRefreshLayout swipeRefreshLayout; SwipeRefreshLayout swipeRefreshLayout;
@@ -137,7 +138,14 @@ public class MessagesActivity extends AppCompatActivity
messages = new MessageFacade(client.createService(MessageApi.class), appsHolder); messages = new MessageFacade(client.createService(MessageApi.class), appsHolder);
messagesView.setOnScrollListener(this); LinearLayoutManager layoutManager = new LinearLayoutManager(this);
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(
messagesView.getContext(), layoutManager.getOrientation());
messagesView.addItemDecoration(dividerItemDecoration);
messagesView.setHasFixedSize(true);
messagesView.setLayoutManager(layoutManager);
messagesView.addOnScrollListener(new MessageListOnScrollListener());
messagesView.setAdapter( messagesView.setAdapter(
new ListMessageAdapter(this, settings, picasso, emptyList(), this::delete)); new ListMessageAdapter(this, settings, picasso, emptyList(), this::delete));
@@ -341,13 +349,18 @@ public class MessagesActivity extends AppCompatActivity
picasso.shutdown(); picasso.shutdown();
} }
private class MessageListOnScrollListener extends RecyclerView.OnScrollListener {
@Override @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {} public void onScrollStateChanged(RecyclerView view, int scrollState) {}
@Override @Override
public void onScroll( public void onScrolled(RecyclerView view, int dx, int dy) {
AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) view.getLayoutManager();
if (firstVisibleItem + visibleItemCount > totalItemCount - 15 if (linearLayoutManager != null) {
int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
int totalItemCount = view.getAdapter().getItemCount();
if (lastVisibleItem > totalItemCount - 15
&& totalItemCount != 0 && totalItemCount != 0
&& messages.canLoadMore(appId)) { && messages.canLoadMore(appId)) {
if (!isLoadMore) { if (!isLoadMore) {
@@ -356,6 +369,8 @@ public class MessagesActivity extends AppCompatActivity
} }
} }
} }
}
}
private class UpdateMissedMessages extends AsyncTask<Integer, Void, Boolean> { private class UpdateMissedMessages extends AsyncTask<Integer, Void, Boolean> {
@Override @Override

View File

@@ -30,13 +30,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" > android:layout_height="match_parent" >
<ListView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/messages_view" android:id="@+id/messages_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scrollbars="vertical" android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
</ListView> </androidx.recyclerview.widget.RecyclerView>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/no_messages" android:id="@+id/no_messages"