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(续)