1

水平レイアウト マネージャーと RecylerView があります。そこから、非常に高い itemCount を設定し、真ん中から開始して、カルーセルを作成しました。次に、スナップを実現するために、http: //www.plattysoft.com/2015/06/16/snapping-items-on-a-horizo​​ntal-list/ のガイドに従いました。

通常、スナップはうまく機能しますが、リストのフィルター (最新、最もリンクされたものなど) があり、選択するとリストが新しいアイテムでリロードされます。

リストが正の方向 (右から左へのスワイプ) にスクロールされた場合は、リロード後にすべてがうまくいきます。しかし、負の方向にスクロールした場合、リロード後に間違った位置 (パディングの長さ) にスナップします。

計算に使用されるすべてのパラメーターをログに記録しようとしましたが、それらは同じように見えるため、何が原因なのかわかりません。

アクティビティは次のようになります。

private RecyclerView myList;
private List<myItem> emptyList;
private myAdapter myAdapter;
final LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
Integer allPixels;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myAdapter = new myAdapter(this, emptyList);
    myList.setAdapter(myAdapter);
    myList.setLayoutManager(layoutManager);
    myList.setHasFixedSize(true);
    myList.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        synchronized (this) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                calculatePositionAndScroll(recyclerView);            
            }
        }

    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        allPixels += dx;
    }
});

// get latest items
new getItems().execute();
}

// async task
public class getItems extends AsyncTask<ContentValues, Void, List<myItem>> {

    protected void onPostExecute(List<myItem> result) {

        myAdapter = new myAdapter(getApplicationContext(), result);
        myList.swapAdapter(myAdapter, false);

        allPixels = 0;
        myList.scrollToPosition((100000 / 2));

        calculatePositionAndScroll(myList);

    }
}

private void calculatePositionAndScroll(RecyclerView recyclerView) {    
    int expectedPosition = Math.round((allPixels + padding - itemWidth) / itemWidth);

    scrollListToPosition(recyclerView, expectedPosition);

}

private void scrollListToPosition(RecyclerView recyclerView, int expectedPosition) {
    float targetScrollPos;

    targetScrollPos = (expectedPosition * itemWidth) + itemWidth - padding;

    float missingPx = targetScrollPos - allPixels;
    Log.e("VARS", "expectedPosition: "+expectedPosition+" | itemWidth: "+itemWidth+" | padding: "+padding+
            " | allPixels: "+allPixels+" | targetPos: "+targetScrollPos+" missingPx: "+missingPx);
    if (missingPx > 5 || missingPx < -5) {
        recyclerView.smoothScrollBy((int) missingPx, 0);
    }

}

通常、アイテムは次のようになります。

しかし、左にスクロールして新しいリストをリロードした後、次のように移動すると:

4

0 に答える 0