【问题标题】:RecyclerAdapter keeps reloading items every time I scroll - Android Studio每次滚动时,RecyclerAdapter 都会不断重新加载项目 - Android Studio
【发布时间】:2015-11-07 23:03:35
【问题描述】:

这就是我初始化我的回收站的方式

        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

          final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());

        mRecyclerView.setLayoutManager(linearLayoutManager);

这是我的适配器:

    public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerHolder> {

    private List<MyRecyclerItems> recyclerItemsList;
    private Context mContext;
    private ImageLoader mImageLoader;
    private int focusedItem = 0;

    public MyRecyclerAdapter(Context context, List<MyRecyclerItems> listItemsList, ImageLoader imageLoader){
        this.recyclerItemsList = listItemsList;
        this.mContext = context;
        this.mImageLoader = imageLoader;
    }

    @Override
    public MyRecyclerHolder onCreateViewHolder(final ViewGroup viewGroup, final int position){
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_items, null);
        MyRecyclerHolder holder = new MyRecyclerHolder(v);

        holder.recyclerLayout.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
//                TextView redditUrl = (TextView) v.findViewById(R.id.url);
//                String postUrl = redditUrl.getText().toString();
//                Intent intent = new Intent(mContext, WebViewActivity.class);
//                intent.putExtra("url", postUrl);
//                mContext.startActivity(intent);
            }
        });

        return holder;
    }

    @Override
    public void onBindViewHolder(final MyRecyclerHolder holder, int position) {


        MyRecyclerItems listItems = recyclerItemsList.get(position);
        holder.itemView.setSelected(focusedItem == position);

        holder.getLayoutPosition();
        Log.d("adapter", "adapter called");

        holder.photo.setImageUrl(listItems.getImagePath(),mImageLoader);
        holder.email.setText(listItems.getEmail());
        holder.about.setText(listItems.getAbout());

    }

    public void clearAdapter(){
        recyclerItemsList.clear();
        notifyDataSetChanged();
    }

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

这就是我的 logCat 的样子:

    11-07 22:57:30.683 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:32.393 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:32.923 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:33.073 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:33.233 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:33.233 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:33.243 22517-22805/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:33.243 22517-22805/name.company.newapp I/qtaguid: Tagging socket 43 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:33.243 22517-22805/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:33.243 22517-22805/name.company.newapp I/qtaguid: Tagging socket 31 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:33.243 22517-22805/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:33.243 22517-22805/name.company.newapp I/qtaguid: Tagging socket 42 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:33.243 22517-22805/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:33.253 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:33.263 22517-22805/name.company.newapp I/System.out: KnoxVpnUidStorageknoxVpnSupported API value returned is false
11-07 22:57:33.263 22517-22805/name.company.newapp I/qtaguid: Tagging socket 31 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:33.273 22517-22803/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:33.273 22517-22803/name.company.newapp I/System.out: KnoxVpnUidStorageknoxVpnSupported API value returned is false
11-07 22:57:33.273 22517-22803/name.company.newapp I/qtaguid: Tagging socket 42 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:33.373 22517-22803/name.company.newapp I/qtaguid: Untagging socket 42
11-07 22:57:33.623 22517-22805/name.company.newapp I/qtaguid: Untagging socket 31
11-07 22:57:33.883 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:34.403 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:34.583 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:35.143 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:35.653 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:36.093 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:37.173 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:37.463 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:38.253 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:38.413 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:38.433 22517-22804/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:38.433 22517-22804/name.company.newapp I/qtaguid: Tagging socket 42 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:38.433 22517-22804/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:38.433 22517-22804/name.company.newapp I/qtaguid: Tagging socket 31 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:38.883 22517-22804/name.company.newapp I/qtaguid: Untagging socket 31
11-07 22:57:38.963 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:39.993 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:40.483 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:40.483 22517-22802/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:40.483 22517-22802/name.company.newapp I/qtaguid: Tagging socket 31 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:40.503 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:40.503 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:40.503 22517-22803/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:40.503 22517-22805/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:40.513 22517-22803/name.company.newapp I/System.out: KnoxVpnUidStorageknoxVpnSupported API value returned is false
11-07 22:57:40.513 22517-22803/name.company.newapp I/qtaguid: Tagging socket 42 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:40.513 22517-22805/name.company.newapp I/System.out: KnoxVpnUidStorageknoxVpnSupported API value returned is false
11-07 22:57:40.513 22517-22805/name.company.newapp I/qtaguid: Tagging socket 46 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:40.713 22517-22803/name.company.newapp I/qtaguid: Untagging socket 42
11-07 22:57:40.753 22517-22805/name.company.newapp I/qtaguid: Untagging socket 46
11-07 22:57:40.763 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:40.883 22517-22802/name.company.newapp I/qtaguid: Untagging socket 31
11-07 22:57:41.563 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:43.713 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:43.833 22517-22517/name.company.newapp D/adapter: Adapter called
11-07 22:57:43.843 22517-22804/name.company.newapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-07 22:57:43.843 22517-22804/name.company.newapp I/qtaguid: Tagging socket 42 with tag a72673b100000000{2804315057,0} uid -1, pid: 22517, getuid(): 10804
11-07 22:57:43.893 22517-22804/name.company.newapp I/qtaguid: Untagging socket 42
11-07 22:57:44.233 22517-22517/name.company.newapp D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
11-07 22:57:45.653 22517-22517/name.company.newapp V/ActivityThread: updateVisibility : ActivityRecord{22636519 token=android.os.BinderProxy@1f8bf54f {name.company.newapp/name.company.newapp.Recycler.RecyclerView}} show : true

这是正常行为吗?正如您从 logcat 中看到的那样,“适配器调用”出现了很多。图像也会重新加载,它们会空白一秒钟,然后重新加载。

【问题讨论】:

    标签: android android-studio android-recyclerview


    【解决方案1】:

    恐怕这是 RecyclerView 的正常行为。它通过仅将显示的项目保存在内存中来优化内存使用,并在显示时使用 onBindViewHolder 方法中分配的内容更新它们,如果您正在加载预缓存的数据和资源,通常是无缝的。

    这里发生的事情是你有这条线:

    Log.d("adapter", "adapter called");
    

    在您的 onBindViewHolder 操作中,因此每次 RecyclerView 中的项目进入视图时,都会再次调用它。实际上并不是在 RecyclerView 上重新设置适配器,而是将数据重新加载到该特定视图中。

    您看到的图像重新加载是因为您丢弃图像,然后每次 ViewHolder 在屏幕外滚动/更新/显示在屏幕上时重新加载它们。更好的方法是将所有图像加载到 LruCache 中,即 Universal Image Loader does if you switch it on

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多