Android RecyclerView捕捉到错误位置

Android RecyclerView捕捉到错误位置,android,carousel,android-recyclerview,snapping,Android,Carousel,Android Recyclerview,Snapping,我有一个水平布局管理器和RecylerView。从那时起,我做了一个旋转木马,设定了很高的高度,从中间开始。 然后,为了实现捕捉,我在 通常,抓拍效果很好,但列表(最新、链接最多等)有过滤器,选中后会用新项目重新加载列表 如果列表是正向滚动的(从右向左滑动),那么在重新加载之后,一切都很好。但是,如果它是在负方向滚动,那么在重新加载后,它会捕捉到错误的位置(填充的长度) 我尝试记录计算中使用的所有参数,但它们似乎是相同的,所以我不知道是什么导致了这一点 活动如下所示: private Recyc

我有一个水平布局管理器和RecylerView。从那时起,我做了一个旋转木马,设定了很高的高度,从中间开始。 然后,为了实现捕捉,我在

通常,抓拍效果很好,但列表(最新、链接最多等)有过滤器,选中后会用新项目重新加载列表

如果列表是正向滚动的(从右向左滑动),那么在重新加载之后,一切都很好。但是,如果它是在负方向滚动,那么在重新加载后,它会捕捉到错误的位置(填充的长度)

我尝试记录计算中使用的所有参数,但它们似乎是相同的,所以我不知道是什么导致了这一点

活动如下所示:

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);
    }

}
private RecyclerView myList;
私有列表空列表;
私有myAdapter myAdapter;
最终LinearLayoutManager layoutManager=新的LinearLayoutManager(此,LinearLayoutManager.HORIZONTAL,false);
整数所有像素;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myAdapter=新的myAdapter(这个,emptyList);
myList.setAdapter(myAdapter);
myList.setLayoutManager(layoutManager);
myList.setHasFixedSize(true);
myList.addOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
CrollStateChanged上的公共无效(RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
已同步(此){
if(newState==RecyclerView.SCROLL\u STATE\u IDLE){
计算位置并滚动(recyclerView);
}
}
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
所有像素+=dx;
}
});
//获取最新项目
新建getItems().execute();
}
//异步任务
公共类getItems扩展异步任务{
受保护的void onPostExecute(列表结果){
myAdapter=新的myAdapter(getApplicationContext(),结果);
myList.swapAdapter(myAdapter,false);
所有像素=0;
myList.scrollToPosition((100000/2));
计算位置和滚动(myList);
}
}
私有无效计算位置和滚动(RecyclerView RecyclerView){
int expectedPosition=Math.round((所有像素+填充-itemWidth)/itemWidth);
滚动列表位置(recyclerView,expectedPosition);
}
私有无效滚动列表位置(RecyclerView RecyclerView,int expectedPosition){
浮动目标位置;
targetScrollPos=(expectedPosition*itemWidth)+itemWidth-填充;
float missingPx=targetScrollPos-所有像素;
Log.e(“VARS”,“expectedPosition:+expectedPosition+”;itemWidth:+itemWidth+”;padding:+padding+
“|所有像素:“+allPixels+”| targetPos:“+targetScrollPos+”缺失px:+缺失px);
如果(缺失px>5 | |缺失px<-5){
recyclerView.smoothScrollBy((int)missingPx,0);
}
}
通常项目应如下所示:

但在向左滚动并重新加载新列表后,如果按如下方式移动:

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);
    }

}