2017-07-28 5 views
0

私の問題は、RecyclerViewの動作を理解することです。私はRecyclerViewをすべての行で少し複雑な項目にしていますが、主なものはその項目に子があります。ImageViewLinearLayoutです。 ImageViewを押して、LinearLayoutGONEまたはVISIBLEVisibilityを設定し、私のImageViewを回転させたいと思います。 android - RecyclerView items:すべての行のビューのプロパティを保存する方法は?

 holder.mIVExpandBtn.setOnClickListener(new OnClickListener() { 
     boolean isOpen = false; 
     @Override 
     public void onClick(View v) { 

      if (isOpen) { 
       CounterListAdapter.this.notifyItemChanged(position); 
       holder.mLLDetails.setVisibility(GONE); 
       holder.mDivider.setVisibility(VISIBLE); 
       holder.setArrowUp(false); 
       isOpen = false; 
       counterItem.setDetailsOpened(false); 
      } else { 
       holder.mLLDetails.setVisibility(VISIBLE); 
       holder.mDivider.setVisibility(GONE); 
       holder.setArrowUp(true); 
       isOpen = true; 
       counterItem.setDetailsOpened(true); 
      } 
     } 
    }); 
そして、私はここでいくつかの問題を抱えている:私は私の onBindViewHolderでこれを実行しようとしました。

  • 私はその間違ったを知って、OnClickListener内のブール変数を持っているので、それは私が私のLinearLayoutを展開するだけで1時間を変更します。このブール値のグローバル変数を作成した場合、RecyclerView isOpen = trueのいずれかの行を他の項目に展開すると、ImageViewをクリックすると展開されません。このブール値はどこに配置する必要がありますか?
  • 2番目の質問 - 画面の回転でRecyclerViewの行の状態を保存するにはどうすればよいですか?たとえば、私の行の1つ、LinearLayout.setVisibility(VISIBLE)を変更し、画面の向きを変更して閉じました。あなたの最初の問題のために
+0

'ViewHolder 'クラスでそのボタンを初期化するところです –

答えて

0

、あなたのViewHolderの内側に、また、あなたのビューを定義するあなたのブール変数、すなわちを置く必要があり、あなたがこの方法でこのように

if(holder.isOpen) 

ブールを呼び出すonClickことをIR順各ブール値の参照を各行に保持します。

2番目の問題については、解決方法はかなり簡単です。あなたのマニフェストでは、あなたのRecyclerViewを持っている活動で、次のように定義します。

android:configChanges="keyboardHidden|orientation|screenSize" 

これは、画面を回転させる場合の構成変更に再作成されることから、あなたの活動を防ぐため、活動はそれが国の維持とあなたのだろうRecyclerViewはあなたのアダプターと共に再作成されません。

アクティビティが再作成されない場合、,onStopなどが実行されないことに注意してください。これは画面の回転のみですが、アクティビティはまだというメソッドを実行します。これは画面が回転する場合に必要な変更を定義する場所です。私は、行を定義するすべてのものを使用して、アダプタのコンストラクタに渡す配列内に保存されるべきだと思うの状態を保存する方法について

private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    @Override 
     public void onClick(View view) { 
     .... 
     } 

+0

最初の問題は解決しましたが、私は2番目の問題に同意しません。私は、マニフェストでconfigChangesを使用することはGoogle Docsによると良い考えではないことを知っています。 – Den

+0

それを処理する方法がわからないのは良い考えではありません。あなたは基本的にシステムに "やあ、私は自分で構成の変更を処理することができます、私のためにそれをしないでください"と伝えています。あなたはウェブを介して検索することができます、私はあなたのソリューションの99%が私があなたにちょうど与えたものであることを保証します – Ricardo

+0

私はそれをほとんどいつも使っています。私はあなたがそれを使用する場合、私の答えで警告のアドバイスを説明しました。とにかく、私は私の答えを編集してより良い説明ができるようになりました – Ricardo

0

方が良い、Holderクラスでこのような何かをOnClickListenerを置きます行ビューの可視状態を保存する配列アイテムオブジェクトにフィールドを追加することができます。画面の回転に

、2つのオプション:

1 - @Ricardoは

2アクティビティレクリエーションを回避言ったように - onSaveInstanceState/onRestoreInstanceStates行を定義する配列を保存/復元...そのために私れる好ましい方法がありますJSONを使用してBundleで保存/復元できるStringに配置します。

+0

私は以前にVIEWHolderクラスでonClickメソッドを使っていましたが、別の問題がありました。私たちすべてがRecyclerViewがそのアイテムを再利用していることを知っているので、最初のアイテムで「展開」をクリックしてRecyclerViewをスクロールすると、別の展開アイテムを簡単に見つけることができます:) – Den

+0

すべての行をonOpenフラグ一度にすべてを展開/折りたたんでいます。明らかに。 –

+0

あなたはそれについてもっと教えてもらえますか?どういう意味ですか? – Den

関連する問題