Java RecyclerView在滚动时滞后

Java RecyclerView在滚动时滞后,java,android,android-fragments,android-recyclerview,Java,Android,Android Fragments,Android Recyclerview,我遇到了一个问题,当RecyclerView有大量的项目(比如2000个)时,滚动会非常慢 如果有人帮我改进,我会非常感激的。提前谢谢 编辑:使用此FastScroll库时可能会导致延迟。如果有人能够做一些pull请求来改进它,我相信开发人员会非常感激的 以下是片段代码: package jahirfiquitiva.apps.iconshowcase.fragments; import android.os.Bundle; import android.support.v4.app.Frag

我遇到了一个问题,当
RecyclerView
有大量的项目(比如2000个)时,滚动会非常慢

如果有人帮我改进,我会非常感激的。提前谢谢

编辑:使用此FastScroll库时可能会导致延迟。如果有人能够做一些pull请求来改进它,我相信开发人员会非常感激的

以下是片段代码:

package jahirfiquitiva.apps.iconshowcase.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.pluscubed.recyclerfastscroll.RecyclerFastScroller;

import java.util.ArrayList;
import java.util.Locale;

import jahirfiquitiva.apps.iconshowcase.R;
import jahirfiquitiva.apps.iconshowcase.adapters.IconsAdapter;
import jahirfiquitiva.apps.iconshowcase.utilities.Preferences;
import jp.wasabeef.recyclerview.adapters.AlphaInAnimationAdapter;
import jp.wasabeef.recyclerview.adapters.ScaleInAnimationAdapter;

public class IconsFragment extends Fragment {

    private IconsAdapter mAdapter;
    private Preferences mPrefs;
    private ArrayList<String> iconsNames, filteredIconsList;
    private ArrayList<Integer> iconsInts, filteredIconsInts;
    private ViewGroup layout;

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

        mPrefs = new Preferences(getActivity());

        if (layout != null) {
            ViewGroup parent = (ViewGroup) layout.getParent();
            if (parent != null) {
                parent.removeView(layout);
            }
        }
        try {
            layout = (ViewGroup) inflater.inflate(R.layout.icons_grid, container, false);
        } catch (InflateException e) {

        }

        RecyclerFastScroller fastScroller =
                (RecyclerFastScroller) layout.findViewById(R.id.rvFastScroller);
        fastScroller.setVisibility(View.GONE);

        RecyclerView iconsGrid = (RecyclerView) layout.findViewById(R.id.iconsGrid);
        iconsGrid.setHasFixedSize(true);
        iconsGrid.setLayoutManager(new GridLayoutManager(getActivity(),
                getResources().getInteger(R.integer.icon_grid_width)));

        mAdapter = new IconsAdapter(getActivity(), new ArrayList<String>(), new ArrayList<Integer>());

        if (getArguments() != null) {
            iconsNames = getArguments().getStringArrayList("iconsNamesList");
            iconsInts = getArguments().getIntegerArrayList("iconsArray");
            mAdapter.setIcons(iconsNames, iconsInts);
        }

        iconsGrid.setAdapter(mPrefs.getAnimationsEnabled() ? animAdapter(mAdapter) : mAdapter);
        fastScroller.setRecyclerView(iconsGrid);
        fastScroller.setHideDelay(500);
        fastScroller.setVisibility(View.VISIBLE);

        return layout;
    }

    public static IconsFragment newInstance(ArrayList<String> iconsNames, ArrayList<Integer> iconsArray) {
        IconsFragment fragment = new IconsFragment();
        Bundle args = new Bundle();
        args.putStringArrayList("iconsNamesList", iconsNames);
        args.putIntegerArrayList("iconsArray", iconsArray);
        fragment.setArguments(args);
        return fragment;
    }

    public void performSearch(String query) {
        filter(query, mAdapter);
    }

    private synchronized void filter(CharSequence s, IconsAdapter adapter) {
        if (s == null || s.toString().trim().isEmpty()) {
            if (filteredIconsList != null) {
                filteredIconsList = null;
            }
            if (filteredIconsInts != null) {
                filteredIconsList = null;
            }
            adapter.clearIconsList();
            adapter.setIcons(iconsNames, iconsInts);
            adapter.notifyDataSetChanged();
        } else {
            if (filteredIconsList != null) {
                filteredIconsList.clear();
            }
            if (filteredIconsInts != null) {
                filteredIconsList = null;
            }
            filteredIconsList = new ArrayList<String>();
            filteredIconsInts = new ArrayList<Integer>();
            for (int i = 0; i < iconsNames.size(); i++) {
                String name = iconsNames.get(i);
                if (name.toLowerCase(Locale.getDefault())
                        .startsWith(s.toString().toLowerCase(Locale.getDefault()))) {
                    filteredIconsList.add(iconsNames.get(i));
                    filteredIconsInts.add(iconsInts.get(i));
                }
            }
            adapter.clearIconsList();
            adapter.setIcons(filteredIconsList, filteredIconsInts);
            adapter.notifyDataSetChanged();
        }
    }

    private ScaleInAnimationAdapter animAdapter(IconsAdapter iconsAdapter) {
        AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(iconsAdapter);
        ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(alphaAdapter);
        scaleAdapter.setFirstOnly(true);
        return scaleAdapter;
    }

}
包jahirfiquitiva.apps.iconshowcase.fragments;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v7.widget.GridLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.view.InflateException;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入com.pluscubed.recyclerfastscroll.RecyclerFastScroller;
导入java.util.ArrayList;
导入java.util.Locale;
导入jahirfiquitiva.apps.iconshowcase.R;
导入jahirfiquitiva.apps.iconshowcase.adapters.iconAdapter;
导入jahirfiquitiva.apps.iconshowcase.utilities.Preferences;
导入jp.wasabeef.recyclerview.adapters.alphanianimationadapter;
导入jp.wasabeef.recyclerview.adapters.ScaleInAnimationAdapter;
公共类IconsFragment扩展了片段{
私人IConAdapter mAdapter;
私人偏好参考文献;
私有ArrayList图标名、筛选器图标列表;
专用阵列列表图标、筛选器图标;
私有视图组布局;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
mPrefs=新的首选项(getActivity());
if(布局!=null){
ViewGroup parent=(ViewGroup)layout.getParent();
如果(父项!=null){
父.removeView(布局);
}
}
试一试{
布局=(视图组)充气器。充气(R.layout.icons\u网格,容器,false);
}锁扣(充气异常e){
}
RecyclerFastScroller快速滚动器=
(RecyclerFastScroller)layout.findViewById(R.id.rvFastScroller);
fastScroller.setVisibility(View.GONE);
RecyclerView iconsGrid=(RecyclerView)layout.findViewById(R.id.iconsGrid);
iconsGrid.setHasFixedSize(true);
iconsGrid.setLayoutManager(新的GridLayoutManager(getActivity()),
getResources().getInteger(R.integer.icon_grid_width));
mAdapter=new-IConAdapter(getActivity(),new-ArrayList(),new-ArrayList());
如果(getArguments()!=null){
IConNames=getArguments().getStringArrayList(“IConNamesList”);
iconsInts=getArguments().getIntegerArrayList(“IConArray”);
设置图标(图标名称、图标图标图标);
}
iconsGrid.setAdapter(mPrefs.getAnimationEnabled()?animAdapter(mAdapter):mAdapter);
setRecyclerView(iconsGrid);
fastScroller.setHideDelay(500);
设置可见性(View.VISIBLE);
返回布局;
}
公共静态IconsFragment新实例(ArrayList IConNames、ArrayList IConArray){
IconsFragment fragment=新的IconsFragment();
Bundle args=新Bundle();
args.putStringArrayList(“IConNamesList”,IConNames);
args.putIntegerArrayList(“IConArray”,IConArray);
fragment.setArguments(args);
返回片段;
}
公共void性能查询(字符串查询){
过滤器(查询,mAdapter);
}
专用同步无效筛选器(字符序列、ICONAdapter适配器){
如果(s==null | | s.toString().trim().isEmpty()){
if(filteredIconsList!=null){
filteredIconsList=null;
}
if(filteredIconsInts!=null){
filteredIconsList=null;
}
adapter.clearIconsList();
adapter.setIcons(图标名、图标名);
adapter.notifyDataSetChanged();
}否则{
if(filteredIconsList!=null){
filteredIconsList.clear();
}
if(filteredIconsInts!=null){
filteredIconsList=null;
}
FilterEdiconList=新建ArrayList();
filteredIconsInts=newarraylist();
对于(int i=0;i
和RecyclerView适配器:

package jahirfiquitiva.apps.iconshowcase.adapters;

import android.content.Context;
import android.content.res.Resources;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.afollestad.materialdialogs.MaterialDialog;

import java.util.ArrayList;
import java.util.Locale;

import jahirfiquitiva.apps.iconshowcase.R;
import jahirfiquitiva.apps.iconshowcase.utilities.Util;

public class IconsAdapter extends RecyclerView.Adapter<IconsAdapter.IconsHolder> implements View.OnClickListener {

    private final Context context;
    private ArrayList<String> iconsList = new ArrayList<>();
    private ArrayList<Integer> iconsArray = new ArrayList<>();

    public IconsAdapter(Context context, ArrayList<String> iconsList, ArrayList<Integer> iconsArray) {
        this.context = context;
        this.iconsList = iconsList;
        this.iconsArray = iconsArray;
    }

    public void setIcons(ArrayList<String> iconsList, ArrayList<Integer> iconsArray) {
        this.iconsList.addAll(iconsList);
        this.iconsArray.addAll(iconsArray);
        this.notifyItemRangeInserted(0, iconsList.size() - 1);
    }

    public void clearIconsList() {
        this.iconsList.clear();
        this.iconsArray.clear();
    }

    @Override
    public IconsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        return new IconsHolder(inflater.inflate(R.layout.item_icon, parent, false));
    }

    @Override
    public void onBindViewHolder(IconsHolder holder, int position) {
        if (iconsArray.size() > 0) {
            holder.icon.setImageResource(iconsArray.get(position));
        }
        holder.view.setTag(position);
        holder.view.setOnClickListener(this);
        setAnimation(holder.icon, position);
    }

    private int lastPosition = -1;

    private void setAnimation(View viewToAnimate, int position) {
        if (position > lastPosition) {
            viewToAnimate.setHasTransientState(true);
            lastPosition = position;
        }
    }

    @Override
    public int getItemCount() {
        return iconsList == null ? 0 : iconsList.size();
    }

    @Override
    public void onClick(View v) {
        int position = (Integer) v.getTag();
        int resId = iconsArray.get(position);
        String name = iconsList.get(position).toLowerCase(Locale.getDefault());

        MaterialDialog dialog = new MaterialDialog.Builder(context)
                .customView(R.layout.dialog_icon, false)
                .title(Util.makeTextReadable(name))
                .positiveText(R.string.close)
                .show();

        if (dialog.getCustomView() != null) {
            ImageView dialogIcon = (ImageView) dialog.getCustomView().findViewById(R.id.dialogicon);
            dialogIcon.setImageResource(resId);
        }
    }

    class IconsHolder extends RecyclerView.ViewHolder {

        final View view;
        final ImageView icon;

        IconsHolder(View v) {
            super(v);
            view = v;
            icon = (ImageView) v.findViewById(R.id.icon_img);
        }
    }

}
包jahirfiquitiva.apps.iconshowcase.adapters;
导入android.content.Context;
导入android.content.res.Resources;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入com.afollestad.materialdialogs.MaterialDialog;
导入java.util.ArrayList;
导入java.util.Locale;
导入jahirfiquitiva.apps.iconshowcase.R;
导入jahirfiquitiva.apps.iconshowcase.utilities.Util;
公共类IConAdapter扩展了RecyclerView。适配器实现了View.OnClickListener{
私人最终语境;
私有ArrayList IConList=新建ArrayList();
private ArrayList iconsArray=new ArrayList();
公共IConAdapter(续)