2016-09-06 2 views
7

私は2つのRecyclerView.Adapterを持っています。それらは内部クラスとまったく同じRecyclerView.ViewHolderを使用しています。RecyclerView.ViewHolderは常に内部クラスでなければなりませんか?

私はコードの重複を取り除きたいと思っていました。これはViewHolderを無料で別のクラスにしたので、新しいクラスは今やRecyclerView.Adapterで使用できるようになりました。

しかし、私はアダプタオブジェクトにアクセスするのが難しいなど多くの問題に直面していました。 getAdapterPosition()は常に-1を返します。

私は心を変えて、これらのアダプタで拡張されたスーパーRecyclerView.Adapterクラスを作成し、スーパークラスにViewHolderを配置して、それらのアダプタがサブクラスから使用できるようにしました。

しかし、ViewHolderが内部クラスである必要があるかどうかを知りたいと思います。これは私に迷惑をかける。 ViewHolderはちょうど私が私が気分を良くするあなたのより良いアプローチをお待ちしております任意のRecyclerView

に表示されることができる特別なviewTypeあるとして、彼らは完全に異なっている、アダプタクラスを結合するために私をアドバイスしないでください。

よろしくお願いいたします。

+1

Javaには実際の内部クラスもなく、同じ.javaファイルに同じパッケージクラスを書くための文法的な砂糖だけです。 ViewHoldersに非内部クラスとして問題があった場合は、問題のあるコードを投稿してください。 – laalto

答えて

3

ViewHolderは外部クラスになります。 Innerクラスは、RecyclerViewのすべてのチュートリアルの唯一の提案です.ViewHolderがすべてのアダプタパラメータ(プライベートのもの)にアクセスする必要がある場合は、アダプタとViewHolderのアクセスメソッドで再作成できます。

私は、ViewHolderを外部クラスとして使用するスタンドアロンプ​​ロジェクトを作成しました。リポジトリへのリンク - https://github.com/maciejsikora/outsideviewholder

私はあなたの問題の原因は、最初のコードバージョンのViewHolderが内部クラスであって、プロパティへのアクセス権を持ち、外部クラスへの変更後にコードがリファクタリングされていて、 ViewHolderとAdapter間のすべての関係を深くチェックする必要があります。

ViewHolderは内部クラスである必要はなく、ViewHolderを外部クラスとして使用する際に無効なコード実装が原因で問題が発生します。

+0

ViewHolderにOnClickListenerを実装するボタンがあります。リスナーが呼び出されると、私はどのオブジェクトのボタンをクリックする必要があるので、アダプタの位置にアクセスする必要があります。しかし、getAdapterPosition()を呼び出すとme -1が返されるため、IndexOutOfBounds例外がクラッシュしました。おそらく、あなたのプロジェクトでも-1が返されます。 :) –

+0

@EgemenHamutçu私は確信していません。位置にアクセスするには、アダプタでgetterを作成し、アダプタをViewHolderに設定します。 –

0

私はいつもインナーとして使っています。私はあなたの問題を理解しています。私はしばらくそれを処理しました。私はこの投稿には答えがあると思います。この回答の男はアダプターにも問題がありました。

ここでそれを確認してください: https://stackoverflow.com/a/29719632/6634292

ご質問は興味深い質問です;)実際に

4

、ノー

まずInnerクラスが必要な理由を理解する必要がありますか?

私たちは、特定のクラスだけにこの機能を持たせたいInnerクラスが必要です。多くの場合、多くの内部クラスがListenersButton onClickなど多くあります。

私たちはのために内部クラスを使用していますので、プライベートで短くてシンプルになります

あなたはこのことを別のクラスにすることができますが、それは効率的ではありません(別のクラスを作成すると、プロジェクトに余分なクラスが追加されます)。

+0

インナークラスも「エクストラクラス」です。 – laalto

+0

はい。しかし、彼らはきれいなコードを書くのに役立ちます。 –

+0

インナークラスはプロジェクトで「隠されている」ので、実際には非常に悪い習慣です。それはずっと「クリーナー」であり、「ファイルごとに1クラス」の原則を使用することが推奨されています。 – breakline

関連する問題