Возможно ли это? как сказано в названии
проведите пальцем вниз, чтобы обновить макет, но придерживайтесь макета, а не перемещайте его вдоль сустава
Спасибо - я использую SwipeRefreshLayout
Возможно ли это? как сказано в названии
проведите пальцем вниз, чтобы обновить макет, но придерживайтесь макета, а не перемещайте его вдоль сустава
Спасибо - я использую SwipeRefreshLayout
После проб и ошибок я нашел одно решение из
http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/
Для людей, которые могут реализовать SwipeRefreshLayout, для его достижения
ШАГ 1: СКАЧАТЬ поддержка android-поддержки v4 (Open Source) из github
ШАГ 2: КОПИРОВАТЬ следующий класс java для вашего проекта src
note1- (Refactor SwipeRefreshLayout для mySwipeRefreshLayout, чтобы избежать путаницы с оригиналом) note2- (Исправьте эти классы и используйте источник друг от друга вместо v4)
ШАГ 3: КОД ОБНОВЛЕНИЯ используйте
ШАГ 4: ОБНОВЛЕНИЕ LAYOUT используйте
ШАГ 5: В mySwipeRefreshLayout.java, найдите и измените на следующий код
private void updateContentOffsetTop ( int targetTop) {
final int currentTop = mTarget.getTop ();
if (targetTop> mDistanceToTriggerSync) {
targetTop = ( int ) mDistanceToTriggerSync;
} else if (targetTop < 0 ) {
targetTop = 0 ;
}
// SetTargetOffsetTopAndBottom (targetTop - currentTop);
setTargetOffsetTopAndBottom ( 0 ); // MOD: Prevent Scroll Down Animation
}
Вы пробуйте этот путь
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean enable = false;
if(listView != null && listView.getChildCount() > 0){
// check if the first item of the list is visible
boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
// check if the top of the first item is visible
boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
// enabling or disabling the refresh layout
enable = firstItemVisible && topOfFirstItemVisible;
}
swipeRefreshLayout.setEnabled(enable);
}});
Этот код не работает, если listView имеет paddingTop
Благодаря Jongz Puangput для обходного пути, но я хочу предложить другое решение, которое я нахожу более простым.
Чтобы предотвратить выпадение дочернего элемента SwipeRefreshLayout, вы можете предоставить свой собственный дочерний вид с помощью метода overrideen offsetTopAndBottom
следующим образом:
public class FixedRelativeLayout extends RelativeLayout {
...
@Override
public void offsetTopAndBottom(int offset) {
// Ignoring movement from SwipeRefreshLayout
super.offsetTopAndBottom(0);
}
}
Это работает для меня, надеюсь, что это поможет любому.
У меня тоже была такая же проблема. попробуйте следующее:
guidesList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int topRowVerticalPosition = (guidesList == null ||
guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop();
swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
}
});
Вы можете найти просмотр ресайклеров в настоящее время вверху и зная, что вы можете отключить или включить SwipeRefreshLayout, позвольте мне привести пример
скажем, вы используете диспетчер линейной компоновки или сетку, после чего вы можете узнать положение ресайклера оттуда
LinearLayoutManager mLayoutManager;
if (mColumnCount <= 1) {
mLayoutManager = new LinearLayoutManager(getBaseContext());
} else {
mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount);
}
recyclerAdapter = new RecyclerViewAdapter(allData);
mRecycler.setAdapter(recyclerAdapter);
mRecycler.setLayoutManager(layoutManager);
if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
swipeRefreshLayout.setEnabled(true);
}
else{
swipeRefreshLayout.setEnabled(false);
}
чтобы ваш прокрутка переработала, и если вы достигнете вершины, swipeRefreshLayout обработает событие обновления...