Android RecyclerView嵌套的ViewHolder子视图

Android RecyclerView嵌套的ViewHolder子视图,android,android-recyclerview,Android,Android Recyclerview,我在尝试循环向父视图添加更多子视图时遇到了RecyclerView问题。当我滚动时,它显示为空白一秒钟。是数据绑定还是视图渲染 这是我的密码: public class TournamentFixtureAdapter extends LoadMoreRecyclerViewAdapter<FixtureGroup> { private OnFixtureClickListener onFixtureClickListener = null; public Tour

我在尝试循环向父视图添加更多子视图时遇到了RecyclerView问题。当我滚动时,它显示为空白一秒钟。是数据绑定还是视图渲染

这是我的密码:

public class TournamentFixtureAdapter extends LoadMoreRecyclerViewAdapter<FixtureGroup> {
    private OnFixtureClickListener onFixtureClickListener = null;

    public TournamentFixtureAdapter(List<FixtureGroup> data) {
        super(data);
    }

    @Override
    protected RecyclerView.ViewHolder onCreateContentItemViewHolder(ViewGroup parent, int contentViewType) {
        return new TournamentFixtureHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_tournament_fixture, parent, false));
    }

    @Override
    protected void onBindContentItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        super.onBindContentItemViewHolder(holder, position);
        FixtureGroup fixtureGroup = data.get(position);
        ((TournamentFixtureHolder) holder).onFixtureClickListener = onFixtureClickListener;
        ((TournamentFixtureHolder) holder).parentPos = position;
        ((TournamentFixtureHolder) holder).binding.setFixtureGroup(fixtureGroup);
        ((TournamentFixtureHolder) holder).addFixtures(fixtureGroup.getFixtures());
    }

    public void setOnFixtureClickListener(OnFixtureClickListener onFixtureClickListener) {
        this.onFixtureClickListener = onFixtureClickListener;
    }

    static class TournamentFixtureHolder extends FixtureHolder {
        ListItemTournamentFixtureBinding binding = null;

        public TournamentFixtureHolder(View itemView) {
            super(itemView);
            binding = DataBindingUtil.bind(itemView);
        }
    }
}

public class FixtureHolder extends BaseAdapter.BaseHolder {
    LinearLayout           layoutMain             = null;
    OnFixtureClickListener onFixtureClickListener = null;
    int parentPos;

    public FixtureHolder(View itemView) {
        super(itemView);
        layoutMain = (LinearLayout) itemView.findViewById(R.id.layout_main);
        setIsRecyclable(layoutMain.getChildCount() > 0);
    }

    public void addFixtures(final ArrayList<Fixture> fixtures) {

        for (final Fixture fixture : fixtures) {
            LinearLayout parent = (LinearLayout) LayoutInflater.from(itemView.getContext()).inflate(R.layout.view_fixture, null);

            Utils.getDefaultClubLogo((NetworkImageViewPlus) parent.findViewById(R.id.netview_home_img)).setImageUrl(fixture.getHome().getImg(), AppController.getInstance().getImageLoader());
            Utils.getDefaultClubLogo((NetworkImageViewPlus) parent.findViewById(R.id.netview_away_img)).setImageUrl(fixture.getAway().getImg(), AppController.getInstance().getImageLoader());
            ViewFixtureBinding binding = DataBindingUtil.bind(parent);

            layoutMain.addView(parent);
            binding.setFixture(fixture);

            parent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onFixtureClickListener.onFixtureClick(parentPos, findFixturePosById(fixtures, fixture.getId()));
                }
            });
        }
    }

    private int findFixturePosById(ArrayList<Fixture> fixtures, int id) {
        for (int i = 0; i < fixtures.size(); i++) {
            if (fixtures.get(i).getId() == id) {
                return i;
            }
        }
        return 0;
    }
}
公共类锦标赛FixtureAdapter扩展LoadMoreRecycleServiceAdapter{
私有onfixtRecickListener onfixtRecickListener=null;
公共锦标赛FixtureAdapter(列表数据){
超级(数据);
}
@凌驾
受保护的RecyclerView.ViewHolder onCreateContentItemViewHolder(视图组父级,int-contentViewType){
返回新的锦标赛FixtureHolder(LayoutInflater.from(parent.getContext())。充气(R.layout.list_item_锦标赛_fixture,parent,false));
}
@凌驾
受保护的无效onBindContentItemViewHolder(RecyclerView.ViewHolder,int位置){
super.onBindContentItemViewHolder(holder,position);
FixtureGroup FixtureGroup=data.get(位置);
((TournamentFixtureHolder)holder)。onfixtRecickListener=onfixtRecickListener;
((TournamentFixtureHolder)holder.parentPos=位置;
((TournamentFixtureHolder)holder.binding.setFixtureGroup(fixtureGroup);
((TournamentFixtureHolder)holder.addFixtures(fixtureGroup.getFixtures());
}
public void setConfigureClickListener(ConfigureClickListener ConfigureClickListener){
this.onfixtReclicklistener=onfixtReclicklistener;
}
静态类锦标赛FixtureHolder扩展FixtureHolder{
ListItemTournamentFixtureBinding=null;
公开锦标赛FixtureHolder(查看项目视图){
超级(项目视图);
binding=DataBindingUtil.bind(itemView);
}
}
}
公共类FixtureHolder扩展了BaseAdapter.BaseHolder{
LinearLayout layoutMain=null;
onfixtRecickListener onfixtRecickListener=null;
int parentPos;
公共固定器支架(视图项视图){
超级(项目视图);
layoutMain=(LinearLayout)itemView.findViewById(R.id.layout\u main);
setIsRecyclable(layoutMain.getChildCount()>0);
}
公共void addfixture(最终ArrayList fixture){
用于(最终夹具:夹具){
LinearLayout父项=(LinearLayout)LayoutFlater.from(itemView.getContext()).inflate(R.layout.view\u fixture,null);
Utils.getDefaultClubLogo((NetworkImageViewPlus)parent.findViewById(R.id.netview\u home\u img)).setImageUrl(fixture.getHome().getImg(),AppController.getInstance().getImageLoader());
Utils.getDefaultClubLogo((NetworkImageViewPlus)parent.findViewById(R.id.netview\u away\u img)).setImageUrl(fixture.getAway().getImg(),AppController.getInstance().getImageLoader());
ViewFixtureBinding=DataBindingUtil.bind(父级);
layoutMain.addView(父级);
装订.固定装置(夹具);
parent.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onfixtRecickListener.onfixtRecick(parentPos,findTextReposById(fixtures,fixture.getId());
}
});
}
}
私有int-findTextReposById(ArrayList装置,int-id){
对于(int i=0;i
如果问题更多地出现在数据端(适配器),那么它可能会显示在正常布局上,而不仅仅是在滚动期间。例如,如果从速度较慢的服务器加载图像,则初始显示速度会较慢。因为它只在滚动时发生,这更说明布局管理器有问题

对于每个新视图,您必须从适配器获取它,并将其添加到布局中。如果在水平/垂直滚动中允许最大dx,并且缓存了屏幕显示之外的循环视图,则布局管理器从适配器获取新视图并将其布局之前,很可能会出现空白


因此有两个因素-水平和/或垂直dx太大、太快,以及回收(或废弃)视图的数量太少。因此,解决方案是减慢滚动速度,或者增加屏幕外添加的视图数。

我假设您已将LoadMoreRecycleServiceAdapter扩展到RecyclerView.Adapter,为什么不在内部执行这些操作LoadMoreRecyclerViewAdapter@L-我在该适配器中使用两个视图。一个用于最后一个项目,使圆圈指示器用于加载更多数据,另一个用于正常视图。因此,Adapter中有两个视图持有者。我认为增加视图数量可能有效。。你能提供它的示例代码吗?如果你正在编写自己的自定义布局管理器或扩展另一个布局管理器-一旦调用了scroll方法(ScrolledVertically,ScrollHorizontally)-那么你就控制了-你知道dx是什么,因此,它们是否显示为空白取决于在将用户偏移到新位置之前是否布局视图。只需确保在将用户偏移到该区域之前布置好新视图,并且不应有灰色空间。谢谢您的帮助,但我成功地解决了这个问题。也许这是一个小技巧,但它确实解决了问题。我通过返回必须在onCreateContentItemViewHolder上生成的子视图的大小来覆盖getContentItemViewType。再次感谢您@Dennis Sheil