首页 > 解决方案 > 为什么 getChildAt 在某些情况下在 GridView 的 onItemClick 侦听器中返回 null,即使视图可见

问题描述

我试图用边框包围所选视图,并从之前选择的任何其他视图中删除边框,因此我保存每个所选视图的位置,然后将其传递给 getChildAtPosition 以更改其背景,不幸的是在某些情况下 -这对我来说是随机的 - 它返回 null

我搜索并发现在大多数情况下,问题是视图不可见,所以我尝试使用 (getFirst and get Last Visible item) 方法检查视图是否可见,但仍然不起作用,除了它返回 null即使这两个视图(新选择的和以前选择的)彼此相邻,这是我看过的问题

listView.getSelectedItemPosition() 返回 index-1

有时 listView.getChildAt(int index) 返回 NULL (Android)

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    ImageView selectedImage = view.findViewById(R.id.imageView);


//i initialize it with -1
    if(positionIcon != -1){

        parent.getChildAt(positionIcon).setBackgroundResource(R.drawable.icon_border);

    }
    view.setBackgroundResource(R.drawable.selected_icon_border);
    if(selectedImage.getTag() instanceof Integer) {
        selectedIcon = (int) selectedImage.getTag();
    }else{
        selectedUri = selectedImage.getTag().toString();
    }
    positionIcon = position;
    view.setBackgroundResource(R.drawable.selected_icon_border);

}

更新:这是导致空异常的视图

这是日志 04-11 15:30:46.054 5723-5723/shobaky.studientsecretary E/AndroidRuntime: FATAL EXCEPTION: main Process: shobaky.studientsecretary, PID: 5723 java.lang.NullPointerException: Attempt to invoke virtual method 'void android .view.View.setBackgroundResource(int)' 在 shobaky.studientsecretary.MaterialDialog.onItemClick(MaterialDialog.java:345) 在 android.widget.AdapterView.performItemClick(AdapterView.java:346) 在 android.widget 的空对象引用上。 AbsListView.performItemClick(AbsListView.java:1547) 在 android.os.Handler 的 android.widget.AbsListView$PerformClick.run(AbsListView.java:3827) 在 android.widget.AbsListView$3.run(AbsListView.java:5849)。 android.os.Handler.dispatchMessage(Handler.java:95) 上的 handleCallback(Handler.java:739)。Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7223) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$ MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

标签: android

解决方案


如果我没有错,您正在选择取消选择(尝试实现单选按钮之类的东西)。
- 您可以保存先前选择的视图的参考并在点击下一个项目时更新。
- 试试下面的一些东西......

View previouslySelectedView;

然后

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ImageView selectedImage = view.findViewById(R.id.imageView);
if(previouslySelectedView != null){
    previouslySelectedView.setBackgroundResource(R.drawable.icon_border);
}
view.setBackgroundResource(R.drawable.selected_icon_border);
if(selectedImage.getTag() instanceof Integer) {
    selectedIcon = (int) selectedImage.getTag();
}else{
    selectedUri = selectedImage.getTag().toString();
}
positionIcon = position;
previouslySelectedView=view;
view.setBackgroundResource(R.drawable.selected_icon_border);
}

推荐阅读