Android 回收视图,我可以';无法使用getChildAt(位置)获取项目视图。空对象引用

Android 回收视图,我可以';无法使用getChildAt(位置)获取项目视图。空对象引用,android,android-recyclerview,get-childitem,Android,Android Recyclerview,Get Childitem,我正在导航抽屉中使用recyclerView,我正在使用此库获得单击和选择支持 它工作得很好,我可以在每个位置的OnClick方法中更改文本和图标的颜色,而不会出现问题: itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View vie

我正在导航抽屉中使用recyclerView,我正在使用此库获得单击和选择支持

它工作得很好,我可以在每个位置的OnClick方法中更改文本和图标的颜色,而不会出现问题:

itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
        @Override
        public void onItemClick(RecyclerView parent, View view, int position, long id) {
            TypedValue typedValue = new TypedValue();
            MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
            final int color = typedValue.data;

            //TODO Icon and text colors

            for (int i = 0; i < drawerTitles.length; i++){
                if (i == position){
                    ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
                    TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
                    imageViewDrawerIcon.setColorFilter(color);
                    if(Build.VERSION.SDK_INT > 15){
                        imageViewDrawerIcon.setImageAlpha(255);
                    }else{
                        imageViewDrawerIcon.setAlpha(255);
                    }
                    textViewDrawerTitle.setTextColor(color);
                    RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
                    relativeLayoutDrawerItem.setFocusableInTouchMode(true);
                }else{
                    ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
                    TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
                    imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text));
                    if(Build.VERSION.SDK_INT > 15){
                        imageViewDrawerIcon.setImageAlpha(138);
                    }else{
                        imageViewDrawerIcon.setAlpha(138);
                    }
                    textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text));
                    RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
                    relativeLayoutDrawerItem.setFocusableInTouchMode(false);
                }
            }

            //TODO Fragments (closedrawers before setfragment)
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Do something after some time

                }
            }, 250);
            mDrawerLayout.closeDrawers();
        }
    });
所有代码:

// Setup RecyclerView inside drawer
    recyclerViewDrawer = (RecyclerView) findViewById(R.id.recyclerViewDrawer);
    recyclerViewDrawer.setHasFixedSize(true);
    recyclerViewDrawer.setLayoutManager(new LinearLayoutManager(MainActivity.this));

    ArrayList<DrawerItem> drawerItems = new ArrayList<>();
    final String[] drawerTitles = getResources().getStringArray(R.array.drawer);
    final TypedArray drawerIcons = getResources().obtainTypedArray(R.array.drawerIcons);
    for (int i = 0; i < drawerTitles.length; i++) {
        drawerItems.add(new DrawerItem(drawerTitles[i], drawerIcons.getDrawable(i)));
    }
    drawerIcons.recycle();
    adapterDrawer = new DrawerAdapter(drawerItems);
    recyclerViewDrawer.setAdapter(adapterDrawer);

    // Here is the problem
    ImageView imageViewDrawerIcon2 = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon);

    // RecyclerView item listener.
    ItemClickSupport itemClickSupport = ItemClickSupport.addTo(recyclerViewDrawer);
    itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
        @Override
        public void onItemClick(RecyclerView parent, View view, int position, long id) {
            TypedValue typedValue = new TypedValue();
            MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
            final int color = typedValue.data;

            //TODO Icon and text colors

            for (int i = 0; i < drawerTitles.length; i++){
                if (i == position){
                    ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
                    TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
                    imageViewDrawerIcon.setColorFilter(color);
                    if(Build.VERSION.SDK_INT > 15){
                        imageViewDrawerIcon.setImageAlpha(255);
                    }else{
                        imageViewDrawerIcon.setAlpha(255);
                    }
                    textViewDrawerTitle.setTextColor(color);
                    RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
                    relativeLayoutDrawerItem.setFocusableInTouchMode(true);
                }else{
                    ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
                    TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
                    imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text));
                    if(Build.VERSION.SDK_INT > 15){
                        imageViewDrawerIcon.setImageAlpha(138);
                    }else{
                        imageViewDrawerIcon.setAlpha(138);
                    }
                    textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text));
                    RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
                    relativeLayoutDrawerItem.setFocusableInTouchMode(false);
                }
            }

            //TODO Fragments (closedrawers before setfragment)
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Do something after some time

                }
            }, 250);
            mDrawerLayout.closeDrawers();
        }
    });
//在抽屉内设置RecyclerView
recyclerViewDrawer=(RecyclerView)findViewById(R.id.recyclerViewDrawer);
recyclerViewDrawer.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(MainActivity.this));
ArrayList drawerItems=新的ArrayList();
最后一个字符串[]drawerTitles=getResources().getStringArray(R.array.drawer);
final-TypedArray-drawerIcons=getResources().obtainTypedArray(R.array.drawerIcons);
for(int i=0;i15){
ImageViewDrainercon.setImageAlpha(255);
}否则{
ImageViewDrainercon.setAlpha(255);
}
textViewDrawertite.setTextColor(颜色);
RelativeLayout relativeLayoutDrawerItem=(RelativeLayout)RecycleServiceEWDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(真);
}否则{
ImageView imageViewDrawerIcon=(ImageView)RecycleServiceEWDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
TextView textViewDrawerTitle=(TextView)RecycleServiceEWDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
setColorFilter(getResources().getColor(R.color.md_text));
如果(Build.VERSION.SDK_INT>15){
ImageViewDrainercon.setImageAlpha(138);
}否则{
ImageViewDrainericon.setAlpha(138);
}
textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text));
RelativeLayout relativeLayoutDrawerItem=(RelativeLayout)RecycleServiceEWDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(假);
}
}
//TODO片段(setfragment之前的闭合抽屉)
最终处理程序=新处理程序();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
//一段时间后做点什么
}
}, 250);
mDrawerLayout.closeDrawers();
}
});

我最终解决了这个问题():


顺便说一句,如果有人有更好的解决方案,我想知道它。

我会使用or)来查找该索引处的根视图。然而,确保数据加载的方式取决于您。

在我的情况下,它就像一个魔咒一样工作

View viewItem = recycleView.getLayoutManager().findViewByPosition(position);
    View icon = viewItem.findViewById(R.id.view);
这对我有用

recyclerView.post(new Runnable() {
  @Override
  public void run() {
    View viewItem = recycleView.getLayoutManager().findViewByPosition(position);
    View icon = viewItem.findViewById(R.id.view);
  }
});

findViewByPosition
LayoutManager
的一种方法,适用于所有LayoutManager

因此,您可以使用
recycleView.getLayoutManager()
findViewByPosition(pos)

此外,
recyclerView.findViewHolderForAdapterPosition(pos)
也可以使用


有关更多信息,请查看此

我们仍然会得到一些使用此方法的
getChildViiew(0)
为空的实例。我个人无法复制它。使用
setAdapter
会触发子视图膨胀,因此理想情况下,当子视图膨胀并添加到Android 4.1之前的RecycleServiceWgives警告中时,会调用回调,方法为int-Android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int,布尔)会错误地覆盖android.widget.ListView中的包私有方法“它返回
null
似乎只有在项目现在可见时才有效,没有用。即使在调用
findViewByPosition(position)
之前调用
layoutManager.scrollToPosition(position)
它仍然不能很好地工作,这对于使用
getChildAt()
getChildViewHolder()获取显示的子视图和视图持有者非常有效
值得注意的是,您无法使用此工具操作许多UI元素,因为您使用的是不同的线程。您必须设置线程间通信。可能存在重复的
View viewItem = recycleView.getLayoutManager().findViewByPosition(position);
    View icon = viewItem.findViewById(R.id.view);
recyclerView.post(new Runnable() {
  @Override
  public void run() {
    View viewItem = recycleView.getLayoutManager().findViewByPosition(position);
    View icon = viewItem.findViewById(R.id.view);
  }
});