【问题标题】:Android nested scrollview with recycler view inside it causes delayed rendering带有回收器视图的Android嵌套滚动视图会导致渲染延迟
【发布时间】:2017-06-22 06:23:21
【问题描述】:

我创建了一种布局,在该布局中,我使用带有视图的回收器和嵌套滚动视图中的少数其他视图。我的理解是,如果我将回收器视图放在嵌套滚动视图中,则渲染列表项需要时间。当我检查内部适配器时,它显示它多次调用onBindholder。如果我删除嵌套滚动视图,它工作正常。代码如下:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <include
        --- ToolBar View ---/>
    <include
         --- Search View ---/>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_scroll_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >
            --- Some views --- 

                <android.support.v7.widget.RecyclerView 
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:layout_marginLeft="@dimen/margin_5"
                    android:layout_marginRight="@dimen/margin_5"
                    android:splitMotionEvents="false"/>
            </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</LinearLayout>

我的适配器看起来像:

    package sample.example.adapters;

public class CustomAdapter extends RecyclerView.Adapter  {

    private LayoutInflater mInflater;
    private List<Data> list;
    private  ItemClickListener itemClickListener;


    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

    public PopularConditionAdapter(Context context , List<Data> list) {
        this.mInflater = LayoutInflater.from(context);
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.row_layout, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        Data condition = list.get(position);
        if(condition != null && condition.getConditionTitle() != null) {
            viewHolder.conditionName.setText(condition.getConditionTitle());
            viewHolder.conditionNameInitial.setText(Tools.getUserInitial(condition.getConditionTitle()));
        }

    }

    @Override
    public int getItemCount() {
        if(popularConditionList !=null)
        {
            return popularConditionList.size();
        }else{
            return 0;
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
         public  View popularParentView;
        public TextView conditionNameInitial;
        public  TextView conditionName;

        public ViewHolder(View itemView) {
            super(itemView);
            conditionNameInitial = (TextView) itemView.findViewById(R.id.some_id);
            conditionName = (TextView) itemView.findViewById(R.id.test_id);
            popularParentView = itemView.findViewById(R.id.round_id);
            popularParentView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (itemClickListener != null) {
                itemClickListener.onItemClick(v, list.get(getPosition()));
            }
        }
    }

    public interface ItemClickListener {
        void onItemClick(View view, Data condition);
    }

    public void reloadList(List<Data> dataList){
        list.clear();
        if(dataList!=null){
            Iterator<Data> iterator = dataList.iterator();
            while (iterator.hasNext()){
                List.add(iterator.next());
            }
        }
    }
}

我也打电话给notifyDataSetChanged。需要一些帮助来确定我做错了什么。

【问题讨论】:

  • 我真的不在乎这里的积分系统。我的问题确实有效。请参阅此文档https://developer.android.com/topic/performance/vitals/render.html 以获得更多关于问题的说明。我相信如果问题无效或不能自我解释,那么人们应该在否决问题之前询问更多的澄清。在这里提问的人会寻求帮助。否决投票问题会阻止他们(在新用户列表中)。
  • 如果 RecyclerView 在 NestedScrollView 中,发现同样的问题。可能是它的孩子的 NestedScrollView 控件渲染。所以RecyclerView中的所有item都被渲染了(onBindViewHolder调用多次)
  • 你解决了这个问题吗..?有同样的问题

标签: android android-recyclerview android-nestedscrollview


【解决方案1】:

RecyclerView 有自己的NestedScrollView,所以我们需要使用这段代码来禁用 NestedScroll..

 mRecyclerView.setNestedScrollingEnabled(false);

【讨论】:

  • 我已经这样做了。但在我的情况下,它在第一次重新渲染时会导致延迟问题。
  • 你真的需要ItemClickListener 来实现点击列表吗?我的意思是它可以在没有接口的情况下完成。
  • 那个ItemClickListener会导致渲染延迟吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
相关资源
最近更新 更多