我做了什么:我创建了一个包含GridView的片段(SystemFrag)。然后,通过两种方法创建了一个自定义适配器,因为我总是遇到指向适配器中相同位置的相同错误。错误是;
E / AndroidRuntime:致命异常:主要 流程:com.example.myapplication,PID:11219 java.lang.NullPointerException:尝试在虚拟设备上调用虚拟方法'void android.widget.TextView.setText(java.lang.CharSequence)' 空对象引用 在com.example.myapplication.adapter.GridViewDeviceAdapterBase.getView(GridViewDeviceAdapterBase.java:55)
2020-04-20 18:20:45.165 10626-10626/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 10626
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Object.equals(java.lang.Object)' on a null object reference
at com.example.myapplication.adapter.GridViewDeviceAdapterBase.getView(GridViewDeviceAdapterBase.java:45)
at android.widget.AbsListView.obtainView(AbsListView.java:2363)
at android.widget.GridView.onMeasure(GridView.java:1065)
at android.view.View.measure(View.java:19857)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:19857)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:760)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:99)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1892)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:831)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
at android.view.View.measure(View.java:19857)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
at android.view.Choreographer.doCallbacks(Choreographer.java:686)
at android.view.Choreographer.doFrame(Choreographer.java:621)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
尝试1:
跟随this教程,并分别创建了一个自定义适配器和Item类,如下所述。然后在我的片段中调用了适配器。发生上面的错误,它指向我的适配器中的此位置。
GridViewDevices适配器:
public class GridViewDevicesAdapter extends ArrayAdapter<DeviceItemForGrid> {
ArrayList<DeviceItemForGrid> deviceImageList= new ArrayList<>();
public GridViewDevicesAdapter(Context context, int textViewResourceId, ArrayList<DeviceItemForGrid> objects) {
super(context, textViewResourceId, objects);
deviceImageList = objects;
}
@Override
public int getCount() {
return super.getCount();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//View view = convertView;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.grid_view_items,null);
CheckedTextView checkedTextView = (CheckedTextView) convertView.findViewById(android.R.id.text1);
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);
checkedTextView.setText(deviceImageList.get(position).getDeviceName());
imageView.setImageResource(deviceImageList.get(position).getDeviceImage());
return convertView;
}
}
DeviceItemForGrid类:
public class DeviceItemForGrid {
String deviceName;
int deviceImage;
public DeviceItemForGrid(String deviceName, int deviceImage) {
this.deviceName = deviceName;
this.deviceImage = deviceImage;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public int getDeviceImage() {
return deviceImage;
}
public void setDeviceImage(int deviceImage) {
this.deviceImage = deviceImage;
}
}
SystemFrag(填充网格视图):
publicclassSystemFragextendsFragment{
CheckedTextViewcheckedTextView_IMU,checkedTextView_GSR;
GridViewdeviceListGridView;
ArrayList<DeviceItemForGrid>deviceImageList=newArrayList<>();
String[]names={"Device1","Device2"};
int[]images={R.drawable.imu,R.drawable.imu};
@Nullable
@Override
publicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){
Viewview=inflater.inflate(R.layout.system_frag,container,false);
deviceListGridView=view.findViewById(R.id.simpleGridView);
deviceImageList.add(newDeviceItemForGrid("IMUadded",R.drawable.imu));
deviceImageList.add(newDeviceItemForGrid("GSRadded",R.drawable.imu));
GridViewDevicesAdaptermyAdapter=newGridViewDevicesAdapter(view.getContext(),R.layout.grid_view_items,deviceImageList);
deviceListGridView.setAdapter(myAdapter);
returnview;
}
2。尝试2(最近尝试):由于我观察到空点异常,然后进行了一些搜索,因此我将适配器更改为如下所示的BaseAdapter,并如下更改了与其相关的Fragment代码,但仍然收到相同的错误(空点异常)在适配器中。错误指向这个地方。 (与第一次尝试相同)
基本适配器:
public class GridViewDeviceAdapterBase extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context context;
private String[] deviceName;
private int[] deviceImage;
public GridViewDeviceAdapterBase(Context c,String [] deviceNm , int [] deviceIm){
this.context = c;
this.deviceImage = deviceIm;
this.deviceName = deviceNm;
}
@Override
public int getCount() {
return deviceName.length;
}
@Override
public Object getItem(int position) {
return deviceName[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if ( layoutInflater == null){
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
if(convertView == null){
convertView = layoutInflater.inflate(R.layout.grid_view_items,null);
}
CheckedTextView checkedTextView = (CheckedTextView) convertView.findViewById(android.R.id.text1);
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);
checkedTextView.setText(deviceName[position]);
imageView.setImageResource(deviceImage[position]);
return convertView;
}
}
SystemFrag:
public class SystemFrag extends Fragment {
CheckedTextView checkedTextView_IMU,checkedTextView_GSR ;
GridView deviceListGridView;
ArrayList<DeviceItemForGrid> deviceImageList = new ArrayList<>();
String [] names = {"Device1","Device2"};
int[] images = {R.drawable.imu,R.drawable.imu};
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.system_frag,container,false);
deviceListGridView = view.findViewById(R.id.simpleGridView);
/* deviceImageList.add(new DeviceItemForGrid("IMU added",R.drawable.imu));
deviceImageList.add(new DeviceItemForGrid("GSR added",R.drawable.imu));
GridViewDevicesAdapter myAdapter=new GridViewDevicesAdapter(view.getContext(),R.layout.grid_view_items,deviceImageList);
deviceListGridView.setAdapter(myAdapter);
*/
GridViewDeviceAdapterBase adapterBase = new GridViewDeviceAdapterBase(getActivity(),names,images);
deviceListGridView.setAdapter(adapterBase);
主片段布局(其中包含网格视图):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:gravity="center_horizontal"
>
<GridView
android:id="@+id/simpleGridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="2"/>
</RelativeLayout>
[在两次尝试中,我对具有图像视图和选中的文本视图的适配器使用相同的布局。网格视图项目。 xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<com.google.android.material.circularreveal.CircularRevealFrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/roundcorner_addmore">
<ImageView
android:id="@+id/imageView"
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="30dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/imu"
android:layout_gravity="center_horizontal"/>
<CheckedTextView
android:id="@+id/checkedTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:checkMarkTint="@color/colorPrimaryHCM"
android:checked="false"
android:clickable="true"
android:cursorVisible="false"
android:enabled="true"
android:longClickable="true"
android:padding="10dp"
android:text="name"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="@color/black"
/>
</com.google.android.material.circularreveal.CircularRevealFrameLayout>
这是我现在的位置。两次尝试均未成功,在我的代码中找到导致此异常的原因很奇怪。
我什至尝试跟随this并将layoutInflater == null
转换为layoutInflater.equals( null)
,但仍无法解决问题。
我对此表示感谢。
似乎您正在使用checkedTextView
检索android.R.id.text1
,而您的视图ID为R.id.checkedTextView
的实际ID。