从 activity 返回后 RecyclerView 滚动变慢

RecyclerView Scrolling slows after returning from activity

我正在使用 Firebase Firestore 编写 news/article 应用程序。而且,我使用 RecyclerView 列出具有恒定高度的项目(具有恒定高度的图像视图,文本视图)。这个过程是在 FragmentNews 上完成的,当我单击该项目以查看详细信息时,有另一个 activity 的意图。返回 activity(单击返回)后,recyclerview 滚动 变慢 。我读了旧的答案,但他们帮不了我, 这是我的代码 Recyclerview 适配器代码

package com.fabrika.gunes;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

public class MyRecMultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MySubMultiRecListAdapter.ItemClickListenerSub{

    private Context context;
    public static ArrayList<MakalaModel> list;
    static ItemClickListener mClickListener;
    SharedPreferences preferences;
    String isWifiEnabled = "0", isOnlyWifi = "0";

    public MyRecMultiAdapter(Context context, ArrayList<MakalaModel> list) {
        this.context = context;
        this.list = list;

        preferences = PreferenceManager.getDefaultSharedPreferences(context);
        isWifiEnabled = preferences.getString("wifi_enabled", "0");
        isOnlyWifi = preferences.getString("wifi_only", "0");
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if(viewType==0){
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_makala_vertical, parent, false);
            NormMakalaHolder postHolder = new NormMakalaHolder(view);
            return postHolder;
        }
        else if(viewType==1){
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.makala_rec_row, parent, false);
            RecMakalaHolder authorHolder = new RecMakalaHolder(view);
            return authorHolder;
        }
        return null;

    }

    public static ArrayList<MakalaModel> getList(){
        return list;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        if(getItemViewType(position)==0){
            MakalaModel postModel = list.get(position);
            NormMakalaHolder postHolder = (NormMakalaHolder) holder;
            postHolder.t_category.setText(postModel.getArticle_author());
            String firstWord = postModel.getArticle_title();
            String secondWord = postModel.getArticle_body().substring(0,150)+"...";
            postHolder.t_view.setText(""+postModel.getArticle_view_number());

// Create a new spannable with the two strings
            Spannable spannable = new SpannableString(firstWord+ ". " +secondWord);
// Set the custom typeface to span over a section of the spannable object
            Typeface typeface1 = ResourcesCompat.getFont(context, R.font.nunitosans_extra_bold);
            Typeface typeface2 = ResourcesCompat.getFont(context, R.font.nunitosans_light);
            spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface1), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface2), firstWord.length(), firstWord.length() + secondWord.length()+2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the text of a textView with the spannable object
            postHolder.t_title.setText( spannable );

            String url = list.get(position).getArticle_img_url();
            if(isOnlyWifi.equals("1") && isWifiEnabled.equals("0")){
                url = "";
            }

            try {
                Glide
                        .with(context)
                        .load(new URL(url))
                        .centerCrop()
                        .placeholder(R.drawable.mini_map)
                        .into(postHolder.i_image);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }

        }
        else{
            ArrayList<MakalaModel> listMakala = list.get(position).getListMakalaModel();
            MySubMultiRecListAdapter adapter = new MySubMultiRecListAdapter(context, listMakala);
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
            ((RecMakalaHolder) holder).recyclerView.setAdapter(adapter);
            ((RecMakalaHolder) holder).recyclerView.setLayoutManager(layoutManager);
//            LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
//            linearSnapHelper.attachToRecyclerView(((RecMakalaHolder) holder).recyclerView);
            adapter.setClickListenerSub(this);
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getViewType();
    }

    @Override
    public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {
        
        Intent intent = new Intent(context, ActivityMakala.class);
        intent.putExtra("id", list.get(position).getMakala_id());
        intent.putExtra("type", "Articles");
        intent.putExtra("category", list.get(position).getArticle_category());
        intent.putExtra("date", list.get(position).getArticle_date());
        intent.putExtra("title", list.get(position).getArticle_title());
        intent.putExtra("author", list.get(position).getArticle_author());
        intent.putExtra("body", list.get(position).getArticle_body());
        intent.putExtra("img_url", list.get(position).getArticle_img_url());
        context.startActivity(intent);
    }

    public class RecMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        RecyclerView recyclerView;

        public RecMakalaHolder(@NonNull View itemView) {
            super(itemView);

            recyclerView = itemView.findViewById(R.id.recyclerView);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
        }
    }

    public class NormMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView t_category, t_title, t_view;
        ImageView i_image;

        public NormMakalaHolder(@NonNull View itemView) {
            super(itemView);

            t_category = itemView.findViewById(R.id.t_category);
            t_title = itemView.findViewById(R.id.t_title);
            i_image = itemView.findViewById(R.id.i_image);
            t_view = itemView.findViewById(R.id.t_view);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
        }
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position, ArrayList<MakalaModel> list);
    }

    // allows clicks events to be caught
    public void setClickListenerSub(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

}

而且,这是我的 FragmentNews 代码

package com.fabrika.gunes;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.IntentCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.storage.FirebaseStorage;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FragmentMakala extends Fragment implements MyRecMultiAdapter.ItemClickListener{

    View view;
    Toolbar toolbar;
    public static ArrayList<MakalaModel> makalaObjects;
    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    MainActivity activity;
    MyRecMultiAdapter adapter;
    FloatingActionButton buttonInsertArticle;
    HashMap<String, Boolean> likedArticles;
    FirebaseFirestore db;
    FirebaseStorage storage = FirebaseStorage.getInstance();
    SharedPreferences preferences;
    String[] likedArray;

    long article_number = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_makala, container, false);

        prepareMe();

        getMakala();

        buttonInsertArticle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // for admin
//                insertEmptyArticle();
            }
        });



        return view;
    }

    private void insertEmptyArticle() {

        // Create a new user with a first and last name
        Map<String, Object> article = new HashMap<>();
        article.put("article_author", "Serdaryň pikirleri");
        article.put("article_body", "");
        article.put("article_category", "durmuş");
        article.put("article_date", "01.05.2021");
        article.put("article_dislike_number", 0);
        article.put("article_img_url", "");
        article.put("article_like_number", 0);
        article.put("article_title", "");
        article.put("article_valid", true);
        article.put("article_view_number", 0);

// Add a new document with a generated ID
        db.collection("Articles")
                .document(""+article_number)
                .set(article);

        article_number++;

        Map<String, Object> article_num = new HashMap<>();
        article_num.put("article_number", article_number);


        db.collection("Articles")
                .document("0")
                .set(article_num);
    }

    private void prepareMe() {



//        ((MainActivity)getActivity()).updateStatusBarColor("#ffffff");

        setHasOptionsMenu(true);//Add this sentence to the menu
        toolbar = view.findViewById(R.id.toolbar);
        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
        ((AppCompatActivity) getActivity()).getSupportActionBar().setElevation(0);
        toolbar.setTitle("Iň täze makalalar");
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity, "refresh", Toast.LENGTH_SHORT).show();
                getMakala();
            }
        });
        buttonInsertArticle = view.findViewById(R.id.buttonInsertNewArticle);
        preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());

        activity = (MainActivity) getActivity();
        recyclerView = view.findViewById(R.id.recyclerView);
        makalaObjects = new ArrayList<>();
        isWifiEnabled();

        db = FirebaseFirestore.getInstance();

        layoutManager = new LinearLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false);
        adapter = new MyRecMultiAdapter(view.getContext(), makalaObjects);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(layoutManager);
        adapter.setClickListenerSub(this);

        likedArticles = new HashMap<>();
        String ids = preferences.getString("liked_articles","");
        likedArray = ids.split(" ");

        recyclerView.setHasFixedSize(true);
        recyclerView.setItemViewCacheSize(2);
        recyclerView.setDrawingCacheEnabled(true);
        recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
//        adapter.setHasStableIds(true);

    }

    public void initScrollView(){
        if(makalaObjects.size()>3){

            ArrayList<MakalaModel> scrollList = new ArrayList<>();

            String ids = preferences.getString("liked_articles","");
            likedArray = ids.split(" ");
            for(int i=likedArray.length-1;i>=0;i--){
                for(int j=makalaObjects.size()-1;j>=0;j--){
                    if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
                        scrollList.add(makalaObjects.get(j));
                    }
                }
            }
            MakalaModel m = new MakalaModel();
            m.setListMakalaModel(scrollList);
            m.setViewType(1);
            makalaObjects.set(3,m);
        }
    }

    @Override
    public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {

        Intent intent = new Intent(activity.getApplicationContext(), ActivityMakala.class);
        intent.putExtra("type", "Articles");
        intent.putExtra("position", position);
        intent.putExtra("id", makalaObjects.get(position).getMakala_id());
        intent.putExtra("category", makalaObjects.get(position).getArticle_category());
        intent.putExtra("date", makalaObjects.get(position).getArticle_date());
        intent.putExtra("title", makalaObjects.get(position).getArticle_title());
        intent.putExtra("author", makalaObjects.get(position).getArticle_author());
        intent.putExtra("body", makalaObjects.get(position).getArticle_body());
        intent.putExtra("img_url", makalaObjects.get(position).getArticle_img_url());
//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        startActivity(intent);
    }

    private void getMakala() {

        makalaObjects.clear();
//        adapter = null;
//        activity.llprogress.setVisibility(View.VISIBLE);

        db.collection("Articles").get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @RequiresApi(api = Build.VERSION_CODES.N)
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        if(!queryDocumentSnapshots.isEmpty()){

                            List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();

                            for(DocumentSnapshot d : list){
                                MakalaModel makalaModel = d.toObject(MakalaModel.class);
                                makalaModel.setMakala_id(d.getId());
                                makalaModel.setViewType(0);

                                if(!makalaModel.getMakala_id().equals("0"))
                                    makalaObjects.add(makalaModel);
                                else{
                                    article_number = makalaModel.getArticle_number();
                                }
                            }

//                            Collections.reverse(makalaObjects);

                            makalaObjects.sort((schedule1, schedule2)->{
                                int returnValue = 0;
                                if(Integer.parseInt(schedule1.getMakala_id()) > Integer.parseInt(schedule2.getMakala_id())) return -1;
                                else if(Integer.parseInt(schedule1.getMakala_id()) < Integer.parseInt(schedule2.getMakala_id()))    return 1;
                                return returnValue;
                            });

                            ArrayList<MakalaModel> scrollList = new ArrayList<>();

                            for(int i=likedArray.length-1;i>=0;i--){
                                for(int j=makalaObjects.size()-1;j>=0;j--){
                                    if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
                                        scrollList.add(makalaObjects.get(j));
                                    }
                                }
                            }

                            MakalaModel m = new MakalaModel();
                            m.setListMakalaModel(scrollList);
                            m.setViewType(1);
                            makalaObjects.add(3,m);

                            adapter.notifyDataSetChanged();
//                            adapter = new MyRecMultiAdapter(activity.getApplicationContext(), makalaObjects);
//                            recyclerView.setAdapter(adapter);

                            activity.llprogress.setVisibility(View.GONE);
                        }
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(activity, "error", Toast.LENGTH_SHORT).show();
                activity.llprogress.setVisibility(View.GONE);
            }});
    }

    @Override
    public void onResume() {
        super.onResume();

        isWifiEnabled();
        initScrollView();
        adapter.notifyDataSetChanged();
    }

    public boolean isWifiEnabled(){
        ConnectivityManager cm = (ConnectivityManager) activity.getApplicationContext().getSystemService(
                Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        if (wifiNetwork != null && wifiNetwork.isConnected()) {
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString("wifi_enabled", "1");
            editor.commit();
            return true;
        }
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("wifi_enabled", "0");
        editor.commit();
        return false;
    }
}

我的item_list_makala_vertical.xml代码(recyclerview的列表项)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:paddingVertical="5dp"
    android:paddingHorizontal="15dp">


    <TextView
        android:id="@+id/t_category"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="WHAT TO COOK"
        android:textSize="14sp"
        android:fontFamily="@font/nunitosans_black"
        android:textStyle="bold"
        android:textColor="@color/colorBlack"/>


    <TextView
        android:id="@+id/t_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/colorBlack"
        android:fontFamily="@font/verdana"
        android:textSize="18sp"
        android:layout_marginTop="5dp"
        android:layout_below="@+id/t_category"
        android:text="New Recipes for Your Rotation Add vegan tantanment and roasted rhubarb cobbler to your weekend cooking plans."/>

    <ImageView
        android:id="@+id/i_image"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:src="@drawable/mini_map"
        android:scaleType="centerCrop"
        android:layout_marginTop="7dp"
        android:layout_below="@+id/t_title"/>

    <RelativeLayout
        android:id="@+id/r_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/i_image">

        <TextView
            android:id="@+id/t_date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="27.04.2021"
            android:textSize="12sp"
            android:fontFamily="@font/nunitosans_light"
            android:textStyle="bold"
            android:alpha="0.6"
            android:layout_marginTop="5dp"
            android:textColor="@color/colorBlack"/>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/t_view"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:src="@drawable/ic_view"/>

        <TextView
            android:id="@+id/t_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="24"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:textSize="12sp"
            android:fontFamily="@font/nunitosans_bold"
            android:textStyle="bold"
            android:layout_marginTop="5dp"
            android:textColor="@color/colorBlack"/>

    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@color/colorBlack"
        android:layout_below="@+id/r_bottom"
        android:layout_marginTop="15dp"/>

</RelativeLayout>

感谢您的帮助...

使用 gilde 加载图像时使用以下代码:

            Glide.with(context).load(new URL(url))
                    .thumbnail(0.5f)
                    .centerCrop()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(postHolder.i_image);

更好地分页您的新闻数据。