Android lista ver espacio extra al final cuando se desplaza
He experimentado un comportamiento extraño con desplazamiento suave en listview. Tengo 30 artículos en la lista. Cuando me desplazo
listview.smoothScrollToPositionFromTop(29, 0);
Habrá un espacio extra al final de la pantalla. En realidad listview cambia un poco. Imagen adjunta a continuación. Pero si me desplazo manualmente no habrá espacio. ¿Qué se puede hacer para resolver este comportamiento?
- El evento de desplazamiento del navegador no se dispara con suficiente frecuencia en dispositivos iOS y Android
- Vista de texto no desplazable en android
- RelativeLayout - Desplazamiento hacia abajo
- ViewTreeObserver no llama a onScrollChanged después de agregar OnScrollChangedListener
- La posición de desplazamiento salta a los elementos de la lista anterior mientras se desplaza hacia arriba en la vista de lista personalizada
Aquí está mi diseño:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_orange_light"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
- Entrada de desplazamiento salvaje android
- Cómo hacer desplazamiento circular en ViewPager?
- RecyclerView - ¿Cómo suavizar desplazamiento a la parte superior del elemento en una posición determinada?
- Android: Detectando cuando ScrollView Hits Bottom
- El desplazamiento de texto no funciona
- Android No se puede eliminar el color en la parte superior e inferior
- Detener el desplazamiento en una vista de lista
- Desplazamiento horizontal automático de Android TextView
Como ya dijiste, creo que es un problema de Android. Parece ser parte de la animación para más de desplazamiento, parece que se 'atascado' antes de completar la animación. He tenido una experiencia similar con SwipeToRefresh
, donde el indicador de progreso no desaparece completamente después de la actualización.
De todos modos, puede solucionar el problema desactivando la animación
listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
Desafortunadamente, esto pierde la animación incluso si se desplaza manualmente. Si puedes vivir con eso, creo que esto solucionará tu problema.
AbsListView # setOverScrollMode (int)
EDIT: (después de aceptar la respuesta original)
También he encontrado otro trabajo alrededor. Esto preserva la animación de desplazamiento. Desafortunadamente, tiene otro inconveniente. Si el usuario se desplaza automáticamente antes de hacer otra cosa, existe el mismo problema del borde en la parte inferior. Si el usuario se desplaza manualmente a la parte inferior, no hay problema a partir de entonces. Si el usuario se desplaza automáticamente y obtiene el borde, luego se desplaza manualmente, no más problema. Así que, aquí está el método alternativo.
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.invisible_footer, null); listView.setOverscrollFooter(drawable);
En la carpeta dibujable, "invisible_footer.xml"
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="2dp" android:width="10dp" android:viewportWidth="10" android:viewportHeight="2"> <!-- a horizontal line --> <path android:pathData="M 1 1 H 10" android:strokeColor="#00000000" android:strokeWidth="1" /> </vector>
ListView.html # setOverscrollHeader ()
Esto le da opciones:
- Perder la animación de desplazamiento
- Retenga la animación pero el usuario de riesgo ve el borde inferior 1 vez
He implementado Pero, en la primera vez inicial que mantener el relleno en la parte inferior, pero, desde la segunda vez su trabajo bien.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_list" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.socialintegration.ListAct"> <ListView android:id="@+id/listTemp" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </RelativeLayout>
CÓDIGO:
public class ListAct extends AppCompatActivity { ListView l; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); String str[] = new String[50]; for (int i = 0; i < 50; i++) { str[i] = "poistion" + i; } ArrayAdapter adpt = new ArrayAdapter(ListAct.this, android.R.layout.simple_dropdown_item_1line, str); l = (ListView) findViewById(R.id.listTemp); l.setAdapter(adpt); l.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { l.smoothScrollToPositionFromTop(29, 0); } }); } }
<ListView> android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior/>
Ok, prueba: app: layout_behavior = "@ string / appbar_scrolling_view_behavior"
¿Ha intentado establecer la altura de su ListView en wrap_content
lugar de match_parent
?
Incluso en [este tutorial] todos los atributos están definidos como wrap_content
. Así que reemplace sus atributos ListView en el ancho y la altura a:
<ListView android:id="@+id/listview" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Hay otro enlace de post SO que describe un problema similar. Supongo que la solución en ese post debe resolver su problema.
Creo firmemente que pasar a RecyclerView
. Si no quieres moverte. Aquí hay trabajo alrededor. Simplemente agregue este método a su actividad y llámelo.
private void smoothScrollToTop(final int pos) { listView.smoothScrollToPositionFromTop(pos, 0); listView.post(new Runnable() { @Override public void run() { listView.smoothScrollToPosition(pos); } }); }
Esto está bien probado. Y trabajó para mí. Y aquí está la salida.
Qué pasa con el método smoothScrollToPosition (posición). Se desplaza hasta la posición sin dejar espacio extra. Cuando me enfrenté smoothScrollToPositionFromTop (posición, desplazamiento) método en cada elemento haga clic en flickrs el listview como resultado espacio se queda. ¡¡¡Espero eso ayude!!!
Prueba esto a tu xml:
<ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="0dp" android:clipToPadding="false"/>
- Android AutoSync Intervalo de ejecución?
- ¿Cómo puedo detectar teléfonos Android y tabletas Android de forma diferente utilizando la cabecera del agente de usuario?