Android RecyclerView getChildAt(位置)返回null 我在我的应用程序中实现了Recyclerview,我需要在其项目上单击“更新另一个列表视图”,这就是我在“活动”中实现onClick事件的原因。它很好用 但我还需要在高亮度下查看选定的视图,其他视图保持正常 为此,我使用RecyclerView getChild方法使所有视图正常,然后选择视图高亮显示 我意识到它只适用于RecyclerView的可见视图。 但我需要使Recyclerview的所有视图都正常,如果我使用位置较大的getChildAt,则total visible count返回空指针异常。 我得到的日志

Android RecyclerView getChildAt(位置)返回null 我在我的应用程序中实现了Recyclerview,我需要在其项目上单击“更新另一个列表视图”,这就是我在“活动”中实现onClick事件的原因。它很好用 但我还需要在高亮度下查看选定的视图,其他视图保持正常 为此,我使用RecyclerView getChild方法使所有视图正常,然后选择视图高亮显示 我意识到它只适用于RecyclerView的可见视图。 但我需要使Recyclerview的所有视图都正常,如果我使用位置较大的getChildAt,则total visible count返回空指针异常。 我得到的日志,android,android-recyclerview,Android,Android Recyclerview,E/项目位置:29 E/项目Rv:15 电子/子适配器:30 MainActivity.java 公共类MainActivity扩展活动{ 回收利用审查; ArrayList模型; 转接器; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); reView=(RecyclerView)findViewById(

E/项目位置:29

E/项目Rv:15

电子/子适配器:30

MainActivity.java
公共类MainActivity扩展活动{
回收利用审查;
ArrayList模型;
转接器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
reView=(RecyclerView)findViewById(R.id.reView);
reView.setLayoutManager(新的GridLayoutManager(MainActivity.this,3));
rvModels=newarraylist();
适配器=新的revAdapter(MainActivity.this,rvModels);
复查。设置适配器(适配器);
prepareData();
reView.addOnItemTouchListener(新建RecyclerItemClickListener(MainActivity.this,reView,新建RecyclerItemClickListener.OnItemClickListener()){
@凌驾
公共虚线单击(视图,int位置){
Log.e(“项目位置”,“位置+”);
Log.e(“Item Rv”,“”+reView.getChildCount());
Log.e(“子适配器”,“reView.getAdapter().getItemCount());
for(int i=0;i
revAdapter.java
public类revAdapter扩展了RecyclerView.Adapter{
语境;
ArrayList模型;
充气机;
公共revAdapter(上下文上下文、ArrayList和rvModels){
this.context=上下文;
this.rvModels=rvModels;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
ImageView-ivIcon;
TextView-txtText;
公共视图持有者(视图项视图){
超级(项目视图);
ivIcon=(ImageView)itemView.findViewById(R.id.ivIcon);
txtText=(TextView)itemView.findViewById(R.id.txtText);
}
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图项视图=充气机。充气(R.layout.rv_原始,父项,假);
返回新的ViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
RvModel RvModel=rvModels.get(位置);
holder.txtText.setText(rvModel.getTitle());
}
@凌驾
public int getItemCount(){
返回rvModels.size();
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
}
rv_raw.xml


问题在于,与列表视图一样,recyclerView的子视图(项目)数量取决于屏幕大小,而不是您的项目数量。它防止应用程序出现异常。例如,如果您有1M个项目,那么根据您的逻辑,recycler视图必须创建1M个子视图,这是不好的。您可以阅读有关列表视图的更多信息(recycler视图以同样的方式工作)

因此,在
onClick
事件中,您不需要查找视图并对其进行更改。您需要更改一些所谓的“设置”,并编写
notifyDataSetChanged
notifyItemChanged
以获得更多优化

我也检查了你的密码,求你了。请,请,删除此重写函数:

@Override
public int getItemViewType(int position) {
    return position;
}
您对所有项目使用相同的支架,因此在“回收器”视图中只有一种类型的视图。以这样的方式重写此方法:告诉回收器视图,每个项目使用不同的布局,这会降低性能

因此,根据你的问题,你会有一些:

reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Log.e("Item Pos", "" + position);
        Log.e("Item Rv", "" + reView.getChildCount());
        Log.e("Child Adapter", "" + reView.getAdapter().getItemCount());

        if (!adapter.isChecked(position)) {
            adapter.setChecked(position);
        }
    }

    @Override
    public void onLongItemClick(View view, int position) {

    }
}));
在适配器中:

private int checkedPosition = -1;

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    RvModel rvModel = rvModels.get(position);
    holder.txtText.setText(rvModel.getTitle());

    if (position == checkedPosition) {
        txtText.setBackgroundColor(Color.BLUE);
        txtText.setTextColor(Color.WHITE);
    } else {
        txtText.setBackgroundColor(Color.WHITE);
        txtText.setTextColor(Color.BLUE);
    }
}

public boolean isChecked(int position) {
    return checkedPosition == position;
}

public void setChecked(int position) {
    int prevChecked = checkedPosition;
    checkedPosition = position;

    if (prevChecked != -1) {
        notifyItemChanged(prevChecked);
    }
    notifyItemChanged(checkedPosition)
}

谢谢你的解释。我也不想使用getItemViewType方法,但每当我不使用它时,Recycler视图的视图就会在滚动时更新,而不是在本例中。它发生在我使用Recycler view grid layout的另一个应用程序中。
@Override
public int getItemViewType(int position) {
    return position;
}
reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Log.e("Item Pos", "" + position);
        Log.e("Item Rv", "" + reView.getChildCount());
        Log.e("Child Adapter", "" + reView.getAdapter().getItemCount());

        if (!adapter.isChecked(position)) {
            adapter.setChecked(position);
        }
    }

    @Override
    public void onLongItemClick(View view, int position) {

    }
}));
private int checkedPosition = -1;

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    RvModel rvModel = rvModels.get(position);
    holder.txtText.setText(rvModel.getTitle());

    if (position == checkedPosition) {
        txtText.setBackgroundColor(Color.BLUE);
        txtText.setTextColor(Color.WHITE);
    } else {
        txtText.setBackgroundColor(Color.WHITE);
        txtText.setTextColor(Color.BLUE);
    }
}

public boolean isChecked(int position) {
    return checkedPosition == position;
}

public void setChecked(int position) {
    int prevChecked = checkedPosition;
    checkedPosition = position;

    if (prevChecked != -1) {
        notifyItemChanged(prevChecked);
    }
    notifyItemChanged(checkedPosition)
}