2017-01-27 8 views
0

私は、遅延でランダムにrecyclerviewアイテムを選択しようとしています。フラグメントロード後にランダム選択メソッドを開始する必要があります。任意のユーザーの対話、しかし、次のエラーを取得します。その後私がチェックするためにクリックしImageViewの上に置くが、再び私は間違いを犯していますか、他に何this.Belowを達成する方法は、自分のコード

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(); 
    } 
} 
でより良いかもしれないのはここ誰もが私に教えexception.Will同じ取得しています

は、開始時に私はonResume(

でselectRandomly()

を置きます)

方法と私は例外を取得しました:Fragment LifeCycle onResume(のフラグメントのライフサイクルによると

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) 

)とビューが作成された後ONSTART()メソッドが呼び出されます。私はそこにも私の方法を入れてみましたが、成功はありません。

答えて

0

ビューがまだロードされていない可能性があります。そのため、ヌル例外が返されます。

この機能は、フラグメントは、ユーザーにロードされたと表示されているときにコールすると便利かもしれません:

// 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; 
    } 
} 
+0

私は私の知る限りsetUserVisibleHint(ブールisVisibleToUser)方法については読んだことがある、それは、FragmentTransactionを使用して、私のfragementを呼び出していますビューページの場合は情緒的です。 –

関連する問題