2

2 種類のビューを保持するRecyclerViewwith があります。Adapter最初のビューは、次のビューよりも幅と高さがわずかに大きくなっています。

を含むアクティビティを開始するときRecyclerViewに、特定の位置までスクロールしたいAdapter。に接続されている をscrollToPositionWithOffset(position, offset)呼び出すことでこれを行います。LinearLayoutManagerRecyclerView

次のコードは、セットアップを大まかに説明しています (特に変わったことはありません)。RecyclerView呼び出しを含むアクティビティTimeline.scrollTo(position)。Scala コードの投稿についてはご容赦ください。

を保持する活動RecyclerView

class Activity extends [...] {

    lazy val timeline = findView( TR.layout_screen_transaction_timeline )

    override def onCreate( state: Option[Bundle] ) = {
        super.onCreate( state )

        setContentView( R.layout.screen_transaction_timeline )

        [...]

        timeline.setAdapter( adapter )

        if ( state.isEmpty ) {
            focus.foreach { position ⇒
                new Handler().post { () ⇒
                    timeline.scrollTo( position )
                }
            }
        }
    }

LinearLayoutManager を使用した RecyclerView

class Timeline( attributes: AttributeSet = null, style: Int = 0 )( implicit context: Context )
    extends RecyclerView( context, attributes, style ) {
    [...]

    setHasFixedSize( true )
    setLayoutManager( layoutManager )

    def scrollTo( position: Int ) = {
        layoutManager.scrollToPositionWithOffset( position, 0 )
    }

    object layoutManager extends LinearLayoutManager( context, VERTICAL, false )
}

アダプタ

object adapter extends Adapter[Holder] {
    override def getItemCount = tour.shipments.length + 1

    override def onBindViewHolder( holder: Holder, position: Int ) = holder.view match {
        case collection: widget.transaction.timeline.Header ⇒
            collection.set( tour.collection, tour, tour.state == Tour.State.New )
        case waypoint: widget.transaction.timeline.Waypoint ⇒
            waypoint.set( position, tour.shipments( position - 1 ), focus.contains( position ) )
    }

    override def onCreateViewHolder( parent: ViewGroup, kind: Int ) = Holder {
        val view = kind match {
            case 0 ⇒ new widget.transaction.timeline.Header()
            case 1 ⇒ new widget.transaction.timeline.Waypoint()
        }

        view.setLayoutParams( new RecyclerView.LayoutParams( MATCH_PARENT, WRAP_CONTENT ) )
        view
    }

    override def getItemViewType( position: Int ) = position match {
        case 0 ⇒ 0
        case _ ⇒ 1
    }
}

最後の位置までスクロールしたい場合を除いて、すべて正常に動作します。その場合、 はLinearLayoutManager正しい位置にスクロールすることもあれば、少しずれてスクロールすることもあります。

ActionBar更新: を保持しているアクティビティでを削除すると、RecyclerViewこの問題が解決することがわかりました。しかし、私はActionBar...

ここに画像の説明を入力

4

0 に答える 0