2016-05-27 12 views
1

これは私のコードで私は写真(最初のカード)と押しボタンを充電する場合、それは写真をアップロードしますが、私はのEditTextに書き込む場合には、それがクラッシュし、私は、このエラーを与える:は時々

Process: com.run.flyproject, PID: 10796 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at com.run.flyproject.Fragments.AddAircraftFragment$1.onClick(AddAircraftFragment.java:78) at android.view.View.performClick(View.java:4756) at android.view.View$PerformClick.run(View.java:19749) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5253) 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:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

+0

ビューの量とアイテムの量が異なっています。 RecyclerViewは、そのサイズを満たすために必要なビュー数だけ作成します。返されるnullは、その項目の位置にViewが存在しないことを意味します。 – DeeV

+0

しかし、私はわずか3ビューを持っています.. – ste9206

+0

"位置が配置されていない場合はnull"。どちらの方法でも、ビューは存在せず、そのビューを準備する必要があります。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html#findViewByPosition(int) – DeeV

答えて

2

明示的な答えではありません(明示的な答えは "あなたのアダプタの数はあなたのアダプタから利用可能なビューと一致しません"など)ちょっと混乱してしまいます。あなたはビューをバインドしようとするたびにImageViewsソースを保存するかどうかをチェックすることができ、...

public class YourAdapter extends RecyclerView.Adapter<YourViewHolder>{ 

    private boolean mSaveImages = false; 
    private SparseArray<Boolean> mImageSavedFlags = new SparseArray<>(); 

    public void toggleSaveStatus(){ 
     mSaveImages = !mSaveImages; 
    } 

    // ... your code 

    @Override 
    public void onBindViewHolder(YourViewHolder holder, final int position) { 
     // Could also manage this in a loop or something 
     // in your constructor/when you set your adapter data 
     // but this will set our SparseArray 
     if(mImageSavedFlags.get(position) == null) 
      mImageSavedFlags.put(position, false); 

     // ... your code 
     if(mSaveImages && !mImageSavedFlags.get(position){ 
      // ... save your image 
      mImageSavedFlags.put(position, true); 
     } 
    } 

    // ... your code 
} 

この方法は、このような何かを、あなたが持っている場合は、避難所ならば、すでに、それを保存することができませんでしたソースを保存してSparseArrayを更新します。

はちょうどあなたが上の設定保存を切り替えるこれが唯一の後、あなたが実際に にスクロール画像を保存することは注目に値する。この

button.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v){ 
     adapter.toggleSaveStatus(); 
    } 
} 

ような何かを自分の状態を切り替えることができます。私はあなたがRecyclerViewのスクロールを強制することができたと思うが、それは別のものになっている。

URLから、または位置や何かに基づいて描画可能なものから画像を読み込むようなことをしているのであれば、保存する前にImageViewを実際に読み込む必要はありません。アプリケーションに明示的にロードされていないイメージを保存する方法(ライブラリを含む)がたくさんあるため、アダプタをプロセスに含める必要はありません。

これはこれを行う唯一の方法ではないと確信しており、これは最高の答えではないと確信していますが、私のコメントはやや混乱しています。

+0

ご協力いただきありがとうございます! – ste9206

0

あなたrecyclerView.getLayoutManager().find...戻りnullとあなたの2番目の質問あなたが位置してビューを取得しない理由を、トンを検証するためにrecyclerView.getLayoutManager().getChildCount()をチェックするなどNullPointerExceptionを得ています帽子あなたはそのインデックスの子供がいます

0

あなたは

recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)と recyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)の両方の使用を使用することができます。 RecyclerViewビューで2種類の位置が使用されていることを確認してください。

アダプターの位置:アダプター内のアイテムの位置。これは、アダプタの観点から見た位置です。 レイアウト位置:最新のレイアウト計算におけるアイテムの位置。これは、LayoutManagerの観点からの位置です。 findViewHolderForLayoutPosition(layoutPosition)にはfindViewHolderForAdapterPosition(adpterPosition)にはgetAdapterPosition()を使用し、getLayoutPosition()を使用してください。

ユーザーが初めてクリックしたかどうかを確認するために、recyclerアダプタおよび他のメンバ変数で以前に選択されたアイテムの位置を保持するメンバ変数を取得します。

サンプルコードとスクリーンショットは、下部に詳細情報が記載されています。

public class MainActivity extends AppCompatActivity {  

private RecyclerView mRecyclerList = null;  
private RecyclerAdapter adapter = null;  

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  

    mRecyclerList = (RecyclerView) findViewById(R.id.recyclerList);  
}  

@Override  
protected void onStart() {  
    RecyclerView.LayoutManager layoutManager = null;  
    String[] daysArray = new String[15];  
    String[] datesArray = new String[15];  

    super.onStart();  
    for (int i = 0; i < daysArray.length; i++){  
     daysArray[i] = "Sunday";  
     datesArray[i] = "12 Feb 2017";  
    }  

    adapter = new RecyclerAdapter(mRecyclerList, daysArray, datesArray);  
    layoutManager = new LinearLayoutManager(MainActivity.this);  
    mRecyclerList.setAdapter(adapter);  
    mRecyclerList.setLayoutManager(layoutManager);  
}  
}  


public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyCardViewHolder>{   

private final String TAG = "RecyclerAdapter";   
private Context mContext = null;   
private TextView mDaysTxt = null, mDateTxt = null;  
private LinearLayout mDateContainerLayout = null;  
private String[] daysArray = null, datesArray = null;  
private RecyclerView mRecyclerList = null;  
private int previousPosition = 0;  
private boolean flagFirstItemSelected = false;  

public RecyclerAdapter(RecyclerView mRecyclerList, String[] daysArray, String[] datesArray){  
    this.mRecyclerList = mRecyclerList;  
    this.daysArray = daysArray;  
    this.datesArray = datesArray;  
}  

@Override  
public MyCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
    LayoutInflater layoutInflater = null;  
    View view = null;  
    MyCardViewHolder cardViewHolder = null;  
    mContext = parent.getContext();  
    layoutInflater = LayoutInflater.from(mContext);  
    view = layoutInflater.inflate(R.layout.date_card_row, parent, false);  
    cardViewHolder = new MyCardViewHolder(view);  
    return cardViewHolder;  
}  

@Override  
public void onBindViewHolder(MyCardViewHolder holder, final int position) {  
    mDaysTxt = holder.mDaysTxt;  
    mDateTxt = holder.mDateTxt;  
    mDateContainerLayout = holder.mDateContainerLayout;  

    mDaysTxt.setText(daysArray[position]);  
    mDateTxt.setText(datesArray[position]);  

    if (!flagFirstItemSelected){  
     mDateContainerLayout.setBackgroundColor(Color.GREEN);  
     flagFirstItemSelected = true;  
    }else {  
     mDateContainerLayout.setBackground(null);  
    }  
}  

@Override  
public int getItemCount() {  
    return daysArray.length;  
}  

class MyCardViewHolder extends RecyclerView.ViewHolder{  
    TextView mDaysTxt = null, mDateTxt = null;  
    LinearLayout mDateContainerLayout = null;  
    LinearLayout linearLayout = null;  
    View view = null;  
    MyCardViewHolder myCardViewHolder = null;  

    public MyCardViewHolder(View itemView) {  
     super(itemView);  
     mDaysTxt = (TextView) itemView.findViewById(R.id.daysTxt);  
     mDateTxt = (TextView) itemView.findViewById(R.id.dateTxt);  
     mDateContainerLayout = (LinearLayout) itemView.findViewById(R.id.dateContainerLayout);  

     mDateContainerLayout.setOnClickListener(new View.OnClickListener() {  
      @Override  
      public void onClick(View v) {  
       LinearLayout linearLayout = null;  
       View view = null;  

       if (getAdapterPosition() == previousPosition){  
        view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;  
        linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);  
        linearLayout.setBackgroundColor(Color.GREEN);  
        previousPosition = getAdapterPosition();  

       }else {  
        view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;  
        linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);  
        linearLayout.setBackground(null);  

        view = mRecyclerList.findViewHolderForAdapterPosition(getAdapterPosition()).itemView;  
        linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);  
        linearLayout.setBackgroundColor(Color.GREEN);  
        previousPosition = getAdapterPosition();  
       }  
      }  
     });  
    }  
}  

} ソース

screen shot 1scrren shot 2