2017-06-22 22 views
1

我创建了一个布局,其中我使用循环查看视图和嵌套滚动视图内的其他几个视图。我的理解是,如果我把回收器视图嵌入滚动视图内需要时间来呈现列表项。当我检查内部适配器时,它显示它多次呼叫onBindholder。如果我删除嵌套滚动视图它工作正常。代码如下所示:Android嵌套滚动视图与里面的回收视图导致延迟渲染

<?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。需要一些帮助来确定我正在做什么错事。

+0

我真的不约分制护理在这里。我的问题非常有效。请参考本文档“https:// developer.android.com/topic/performance/vitals/render.html”以获得更多关于问题的信息。如果问题无效或不能自我解释,那么在投票回答问题之前,人们应该问清楚一点。在这里提问的人他们寻求帮助。向下投票的问题会阻止他们(在新用户列表中)。 – nilkash

+2

如果RecyclerView位于NestedScrollView内部,则发现相同的问题。可能是NestedScrollView控件渲染它的子项。因此,RecyclerView中的所有项目都被渲染(onBindViewHolder调用多次) – Jutikorn

+0

你有没有解决这个问题..?有同样的问题 – Priya

回答

-1

RecyclerView都有自己NestedScrollView所以我们需要通过使用此代码,以禁用NestedScroll ..

mRecyclerView.setNestedScrollingEnabled(false); 
+0

我已经这样做了。但就我而言,这是第一次造成延迟问题。 – nilkash

+0

你确实需要'ItemClickListener'来实现点击列表器吗?我的意思是它可以通过没有界面来完成。 –

+0

ItemClickListener是否会导致渲染延迟? – nilkash