android - 为什么 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)
解决方案
如果我没有错,您正在选择取消选择(尝试实现单选按钮之类的东西)。
- 您可以保存先前选择的视图的参考并在点击下一个项目时更新。
- 试试下面的一些东西......
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);
}
推荐阅读
- python - 如何在pytorch中自己洗牌?
- lua - 使用 :split() [LUA] 更改结果
- python - 在熊猫数据框中添加简单的计数器列,当日期更改时重置
- python - python blockchain api 使用 api 密钥检查余额
- r - 扩大数据和改变列
- reactjs - 在组件中传递 id
- flutter - 在 parse_server_sdk_flutter 中使用 LiveQuery 时显示 ReSubScription 的终端:{}
- php - Laravel 重命名集合键
- windows - 从 bash 脚本自动关闭 Windows 10 计算机
- c - 无法在 Windows 7 中使用 MinGW make 编译 C 程序