2

リサイクラー ビューでリスト アイテムを一番上 (firstVisible アイテム) に自動スクロールし、その位置でビューを取得して、フラグメントから強調表示できるようにします。

だから、これは私のフラグメントコードの要点です:

    private void activateNewListItem(int position) {

       mLayoutManager().scrollToPositionWithOffset(position, 0);
       RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForLayoutPosition(position);

       View view = viewHolder.getItemView();
       view.setBackgroundColor(getResources().getColor(R.color.esr_light_grey));
}

1234などの場合、有効な ViewHolder を返します。これpositionは 、RecyclerView が dataSet 内のこれらのインデックスに対して ViewHolder を描画したと推測するためです。mRecyclerView.findViewHolderForPosition(position)

ただし、positionたとえば、25を渡すと、 mRecyclerView.findViewHolderForPosition(position) null が返されます。これは、その上で呼び出したにもかかわらず、まだ描画されていないと想定しているmLayoutManager.scrollToPositionWithOffset(position, 0)ためです。

この 2 つのことを達成するにはどうすればよいでしょうか。

  1. dataSet インデックスのリスト項目を firstVisibleItemまでスクロールしpositionます。

  2. その listItem の View または ViewHolder オブジェクトを取得して、背景などを変更できるようにします。

4

3 に答える 3

1

ViewHolder 情報の更新には数秒かかります。スクロールしてmRecyclerView.findViewHolderForLayoutPosition呼び出しを数ミリ秒遅らせるだけです (100 ミリ秒は妥当に聞こえます) 。

于 2016-07-21T09:38:05.310 に答える
0

最初の RecyclerView アイテムにスクロールするフラグメントにこのコードを挿入します。

RecyclerView.ViewHolder holder = mRecyclerView
                .findViewHolderForAdapterPosition(0);
while (holder == null) {
    int firstVisiblePosition = mLayoutManager()
                .findFirstCompletelyVisibleItemPosition();
    RecyclerView.ViewHolder firstVisibleHolder = mRecyclerView
                .findViewHolderForAdapterPosition(firstVisiblePosition);

    View v = firstVisibleHolder.getItemView();
    if (v != null) mRecyclerView.scrollBy(0, (int) v.getY());
    else break;
    holder = mRecyclerView.findViewHolderForAdapterPosition(0);
}

View view = null;
if (holder != null) view = holder.getItemView();
if (view != null) mRecyclerView.scrollBy(0, (int) view.getY());
于 2016-11-18T11:16:59.900 に答える