尝试从field 'android.view中读取。视图android.support.v7.widget.RecyclerView ViewHolder.itemView美元”

时间:2022-08-04 17:32:12

I am trying to select recyclerview item randomly with delay.I need to start random selection method after fragment load without any user interaction,But getting the following error. Afterward I put it on ImageView click to check but again I am getting same exception.Will anybody here tell me where I am making a mistake,or what else could be better way to achieve this.Below is my code

我试着随机选择回收物品。我需要在没有任何用户交互的情况下开始随机选择方法,但是得到以下错误。然后我把它放在ImageView点击检查,但是我也得到了同样的异常。这里有人告诉我,我在哪里犯了错误,或者还有什么更好的方法来实现这个目标。下面是我的代码

    package com.apponative.bjja.fragments;

import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.apponative.bjja.R;
import com.apponative.bjja.adapters.AttackGridAdapter;

import java.util.Random;

public class Fragment_AttackGrid extends Fragment {

    View v;
    RecyclerView grid_attack;
    AttackGridAdapter attackGridAdapter;
    Bundle b;
    int itemCount;
    Handler randomHandler;
    Runnable randomRunnable;
    Random rand;
    int randomNum = 0;
    long emptyTime;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        v = inflater.inflate(R.layout.fragment_attack_grid, container, false);

        setUpViews();

        return v;
    }

    void setUpViews() {

        b = getArguments();
        itemCount = b.getInt(getString(R.string.item_count));
        rand = new Random();
        randomHandler = new Handler();

        grid_attack = (RecyclerView) v.findViewById(R.id.attack_grid);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 4);

        grid_attack.setLayoutManager(layoutManager);
        attackGridAdapter = new AttackGridAdapter(getActivity(), itemCount);
        grid_attack.setAdapter(attackGridAdapter);

        v.findViewById(R.id.belt_black).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selectRandomly();
            }
        });
    }

    void selectRandomly() {

        for (int i = 0; i < itemCount; i++) {
            emptyTime = emptyTime+1000;
            randomRunnable = new Runnable() {
                @Override
                public void run() {
                    grid_attack.findViewHolderForAdapterPosition(randomNum).itemView.setSelected(false);
                    randomNum = rand.nextInt((itemCount - 0) + 1) + 0;
                    grid_attack.findViewHolderForAdapterPosition(randomNum).itemView.setSelected(true);
                }
            };
            randomHandler.postDelayed(randomRunnable, emptyTime);

        }
        emptyTime = emptyTime+2000;
        randomRunnable = new Runnable() {
            @Override
            public void run() {
                grid_attack.findViewHolderForAdapterPosition(randomNum).itemView.performClick();
            }
        };
        randomHandler.postDelayed(randomRunnable, emptyTime);
    }

    @Override
    public void onResume() {
        super.onResume();
        //   selectRandomly();
    }
}

At start I put

在开始我把

selectRandomly()

selectRandomly()

at

onResume()

onResume()

method and I was getting an exception:

方法和我有一个例外:

01-27 18:28:44.969 19041-19041/com.apponative.bjja E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.apponative.bjja, PID: 19041
java.lang.NullPointerException: Attempt to read from field 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' on a null object reference                                                                                      at com.apponative.bjja.fragments.Fragment_AttackGrid$2.run(Fragment_AttackGrid.java:77)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:155)
    at android.app.ActivityThread.main(ActivityThread.java:5696)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

According to fragment lifecycle at Fragment LifeCycle onResume() and onStart() methods are called after view has been created. I tried putting my method there too, But no success.

根据片段生命周期onResume()和onStart()方法的片段生命周期,在创建视图之后调用。我也试着把我的方法放在那里,但没有成功。

1 个解决方案

#1


0  

It is possible that view still not loaded, which is why it is returning null exception.

视图可能仍然没有加载,这就是它返回空异常的原因。

This function might be useful to call when fragment is loaded and visible to the user:

这个函数在对用户进行加载和显示时可能有用:

// create boolean for checking if view is seen
private boolean isViewShown = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getView() != null) {
        isViewShown = true;
        // call your function
    } else {
        isViewShown = false;
    }
} 

#1


0  

It is possible that view still not loaded, which is why it is returning null exception.

视图可能仍然没有加载,这就是它返回空异常的原因。

This function might be useful to call when fragment is loaded and visible to the user:

这个函数在对用户进行加载和显示时可能有用:

// create boolean for checking if view is seen
private boolean isViewShown = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getView() != null) {
        isViewShown = true;
        // call your function
    } else {
        isViewShown = false;
    }
}