2017-09-20 13 views
0

私のアクティビティはで、LinearLayoutManagerと表示されています。私は最初の項目(View)をリストに入れたいです。 this post's accepted answerによれば、私はLinearLayoutManager.findViewByPosition()メソッドを呼び出すことができますが、代わりにnullを取得しています。どうして?LinearLayoutManager.findViewByPosition()がnullを返す

RecyclerView list = findViewById(R.id.list); 
LinearLayoutManager llm = new LinearLayoutManager(this); 
list.setLayoutManager(llm); 
MyAdapter adapter = new MyAdapter(); 
list.setAdapter(adapter); 
View firstViewItem = llm.findViewByPosition(0); // <-- null 

adapterには項目が含まれていますが、それは空ではありません。

答えて

1

AdapterによるRecyclerViewの人口は非同期であるためです。 アダプタが完了してRecyclerViewにデータが入力されたときにイベントを起動し、findViewByPositionが何かを返すことがあります。

各アイテムサイズ(幅と高さ)を計算し、現在のデバイス表示に入力可能なアイテムの数を定義する必要があるため、RecyclerViewが表示可能なアイテムをすべて入力するのを検出するのは少し難しいです。

あなたが必要とするのは、初めて埋め込まれたアイテムにアクセスする場合だけです。アダプタのonBindViewHolderメソッドでイベントを発生させることができます。追加されたアイテムごとにイベントを発生させないように、

+0

ご回答ありがとうございます。どのようにそのイベントを聞くことができますか? –

+0

あなたはOtto Event Busのようなものを使うことができます。それは良いイベントライブラリです。あなたはウェブ上のいくつかの例を見つけることができます。可能であればイベントのアプローチを使用することをお勧めします。パフォーマンスを向上させるのに役立ち、明確なコードを書くのに役立ちます。 – firegloves

+0

しかし、RecyclerViewにデータが取り込まれた時期はどうすればわかりますか? –

0

これを試してください。

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     View firstViewItem = llm.findViewByPosition(0); 
    } 
}, 500); 
+0

これは競合状態になります... –

+0

リサイクラビューはアイテムをバインドするのに時間がかかるため動作します。それ以外の場合は、任意のボタンをクリックして取得することができます。 exact after setAdapterは決してビューを返さないためです。 –