[如何在带有Grid View的片段中使用自定义适配器摆脱“ java.lang.NullPointerException”? [重复]

问题描述 投票:0回答:1

我做了什么:我创建了一个包含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. 尝试1:

    跟随this教程,并分别创建了一个自定义适配器和Item类,如下所述。然后在我的片段中调用了适配器。发生上面的错误,它指向我的适配器中的此位置。enter image description here

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代码,但仍然收到相同的错误(空点异常)在适配器中。错误指向这个地方。 (与第一次尝试相同)

enter image description here

基本适配器:

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),但仍无法解决问题。

我对此表示感谢。

java android android-fragments gridview checkedtextview
1个回答
1
投票

似乎您正在使用checkedTextView检索android.R.id.text1,而您的视图ID为R.id.checkedTextView的实际ID。

© www.soinside.com 2019 - 2024. All rights reserved.