Вложенный вид прокрутки Android с видом переработчика внутри вызывает задержку рендеринга

Я создал один макет, в котором я использую переработчик с представлением и несколько других представлений внутри вложенного прокрутки. Что я понимаю, так это то, что если я помещу представление ресайклера во вложенный вид прокрутки, для отображения элементов списка потребуется время. Когда я проверяю внутренний адаптер, он показывает, что он вызывает 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. Нужна помощь, чтобы определить, какие неправильные вещи я делаю.


person nilkash    schedule 22.06.2017    source источник
comment
Мне действительно плевать на систему баллов здесь. Мой вопрос действительно актуален. Пожалуйста, обратитесь к этому документу https://developer.android.com/topic/performance/vitals/render.html для получения дополнительных разъяснений по этому вопросу. Я считаю, что если вопрос недействителен или не требует пояснений, то люди должны попросить больше разъяснений по нему, прежде чем проголосовать против вопроса. Люди, которые задают здесь вопросы, ищут помощи. Голосование против вопроса отпугнет их (в списке для новых пользователей).   -  person nilkash    schedule 22.06.2017
comment
Обнаружена та же проблема, если RecyclerView находится внутри NestedScrollView. Возможно, что NestedScrollView управляет рендерингом своих дочерних элементов. Таким образом, все элементы в RecyclerView отображаются (вызов onBindViewHolder несколько раз)   -  person Jutikorn    schedule 22.06.2017
comment
вы исправили эту проблему..? такая же проблема   -  person Priya    schedule 12.09.2017


Ответы (1)


RecyclerView имеет свой собственный NestedScrollView, поэтому нам нужно отключить этот NestedScroll с помощью этого кода.

 mRecyclerView.setNestedScrollingEnabled(false);
person Abhishek Singh    schedule 22.06.2017
comment
Я уже сделал это. Но в моем случае это вызывает проблему с задержкой при первом повторении. - person nilkash; 22.06.2017
comment
вам действительно нужно ItemClickListener для реализации списка кликов? Я имею в виду, что это можно сделать без интерфейса. - person Abhishek Singh; 22.06.2017
comment
Это ItemClickListener вызывает задержку рендеринга? - person nilkash; 22.06.2017