2016-04-12 10 views
4

ちょっと突き当たりましたが、それを解決する方法が不思議で、私には鶏と卵のように見えます。データベース内の情報に基づいて、RecyclerViewに異なるビュータイプを表示しますか?

私はその中の場所に関する情報を持つデータベースを持っています。距離で注文されたすべての場所を私のRecyclerViewに表示したい。

viewTypeが1つのみの場合は、すでにこれを達成しました。しかし、これは私が理解できないことです、私はユーザーとの一定の距離内にある場所のために別のビューを表示する必要があります。したがって、例えば100メートル以内。

その情報はデータベース内にあるため、getItemViewType(int position)がsetAdapter()で呼び出されたときに、CursorLoaderはすべての情報を引き出すことができませんでした。したがって、NULLポインタ例外が発生します。私の質問に

は私CursorLoaderは、[完了私のアダプタで動作し、ヌルCursorを持たないようにするために私は待つために方法はありますか?ローダーが終了した後に.setAdapter()に電話をかけようとすると、No adapter attached; skipping layoutRecyclerViewにアクティビティーの作成時にアダプターを設定する必要があるため、ログに次のようなメッセージが表示されます。

マイgetItemViewType(position)は現在、次のようになります。

if (!cursor.isClosed()) { 
    cursor.moveToPosition(position); 
} 
if (cursor.getInt(2) <= 100) { 
    return TYPE_NEARBY; 
} else { 
    return TYPE_NOT_NEARBY; 
} 

基本的に私はviewTypeを決定し、そのセルのための別のビューをロードするために、私のCursorLoader内のデータを使用する必要があります。 1つのViewTypeでは、距離を確認する必要がないため、すべて同じビューです。

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

+1

'getItemCount'が' 0'を返す場合、 'getItemViewType'は呼び出されません。これは、カーソルがnullの場合に当てはまります。 – Blackbelt

+0

ちょうどブレークポイントでそれを走らせて、あなたが正しいです。私はonBindViewHolderが呼び出されたときにそのIDを更新することによってそれを動作させました。カーソルを位置に移動し、もう一度チェックしてビューホールダーを更新します。私は、ビューアホルダーにホルダーIDを使用していて、更新する必要があるからだと思います。 –

答えて

0

これは、ブラックベルトのコメントのおかげで終わりました。

デバッグモードでプロセスを実行すると、すべて正常に動作します。私はちょうど私がonBindViewHolder(int position)のデータで正しいことをしていることを保証しなければなりませんでした。

主な問題は、viewHolderにint型ビューとは異なる「holderId」intがあり、おそらくちょうどそれらを混乱させたためです。

関連する問題