From fd07cad969fbc856b3d4673fa94a3d9ab42371fb Mon Sep 17 00:00:00 2001 From: leopoldsedev Date: Mon, 10 Feb 2020 18:41:06 +0100 Subject: [PATCH] Replace ListView with RecyclerView for the message list. --- .../gotify/messages/ListMessageAdapter.java | 44 ++++++++--------- .../gotify/messages/MessagesActivity.java | 47 ++++++++++++------- app/src/main/res/layout/activity_messages.xml | 4 +- 3 files changed, 53 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/github/gotify/messages/ListMessageAdapter.java b/app/src/main/java/com/github/gotify/messages/ListMessageAdapter.java index 1d80af7..8e61042 100644 --- a/app/src/main/java/com/github/gotify/messages/ListMessageAdapter.java +++ b/app/src/main/java/com/github/gotify/messages/ListMessageAdapter.java @@ -5,10 +5,10 @@ import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; @@ -25,7 +25,7 @@ import io.noties.markwon.image.picasso.PicassoImagesPlugin; import io.noties.markwon.movement.MovementMethodPlugin; import java.util.List; -public class ListMessageAdapter extends BaseAdapter { +public class ListMessageAdapter extends RecyclerView.Adapter { private Context content; private Picasso picasso; @@ -60,30 +60,17 @@ public class ListMessageAdapter extends BaseAdapter { this.items = items; } + @NonNull @Override - public int getCount() { - return items.size(); - } + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + 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); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { final MessageWithImage message = items.get(position); if (Extras.useMarkdown(message.message)) { holder.message.setAutoLinkMask(0); @@ -102,8 +89,17 @@ public class ListMessageAdapter extends BaseAdapter { ? Utils.dateToRelative(message.message.getDate()) : "?"); 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 { diff --git a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java index 6f9b243..b9bc724 100644 --- a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java +++ b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java @@ -12,9 +12,7 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.widget.AbsListView; import android.widget.ImageButton; -import android.widget.ListView; import android.widget.TextView; import android.widget.ViewFlipper; import androidx.appcompat.app.ActionBarDrawerToggle; @@ -23,6 +21,9 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; 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 butterknife.BindView; import butterknife.ButterKnife; @@ -66,7 +67,7 @@ import okhttp3.OkHttpClient; import static java.util.Collections.emptyList; public class MessagesActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener, AbsListView.OnScrollListener { + implements NavigationView.OnNavigationItemSelectedListener { private BroadcastReceiver receiver = new BroadcastReceiver() { @@ -90,7 +91,7 @@ public class MessagesActivity extends AppCompatActivity NavigationView navigationView; @BindView(R.id.messages_view) - ListView messagesView; + RecyclerView messagesView; @BindView(R.id.swipe_refresh) SwipeRefreshLayout swipeRefreshLayout; @@ -137,7 +138,14 @@ public class MessagesActivity extends AppCompatActivity 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( new ListMessageAdapter(this, settings, picasso, emptyList(), this::delete)); @@ -341,18 +349,25 @@ public class MessagesActivity extends AppCompatActivity picasso.shutdown(); } - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) {} + private class MessageListOnScrollListener extends RecyclerView.OnScrollListener { + @Override + public void onScrollStateChanged(RecyclerView view, int scrollState) {} - @Override - public void onScroll( - AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (firstVisibleItem + visibleItemCount > totalItemCount - 15 - && totalItemCount != 0 - && messages.canLoadMore(appId)) { - if (!isLoadMore) { - isLoadMore = true; - new LoadMore().execute(appId); + @Override + public void onScrolled(RecyclerView view, int dx, int dy) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) view.getLayoutManager(); + if (linearLayoutManager != null) { + int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); + int totalItemCount = view.getAdapter().getItemCount(); + + if (lastVisibleItem > totalItemCount - 15 + && totalItemCount != 0 + && messages.canLoadMore(appId)) { + if (!isLoadMore) { + isLoadMore = true; + new LoadMore().execute(appId); + } + } } } } diff --git a/app/src/main/res/layout/activity_messages.xml b/app/src/main/res/layout/activity_messages.xml index ec22408..8dfd48e 100644 --- a/app/src/main/res/layout/activity_messages.xml +++ b/app/src/main/res/layout/activity_messages.xml @@ -30,13 +30,13 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - - +