Replace ListView with RecyclerView for the message list.
This commit is contained in:
committed by
Jannis Mattheis
parent
668e050add
commit
fd07cad969
@@ -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<ListMessageAdapter.ViewHolder> {
|
||||
|
||||
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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,13 +30,13 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" >
|
||||
|
||||
<ListView
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/messages_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scrollbars="vertical"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
</ListView>
|
||||
</androidx.recyclerview.widget.RecyclerView>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/no_messages"
|
||||
|
||||
Reference in New Issue
Block a user