studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android listview android-layout scrollview

programacion - ListView dentro de ScrollView no se desplaza en Android



manual de programacion android pdf (24)

requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Called when a child does not want this parent and its ancestors to intercept touch events with onInterceptTouchEvent(MotionEvent). This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.

Try this answer,

listview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view scrollView.requestDisallowInterceptTouchEvent(true); int action = event.getActionMasked(); switch (action) { case MotionEvent.ACTION_UP: scrollView.requestDisallowInterceptTouchEvent(false); break; } return false; } });

Estoy teniendo problemas con un ListView desplazable dentro de ScrollView . Tengo una actividad que tiene algunos EditTexts en la parte superior y luego un host de pestañas con dos pestañas que tienen un ListView cada uno. Cuando se enfocan las vistas de EditText, aparece el teclado virtual y, como tengo un ScrollView, el contenido es desplazable. Pero el problema surge cuando hay más elementos en ListViews (unos en pestañas), no puedo desplazar el ListView, incluso si hay más elementos.

El siguiente es el diseño XML:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="?backgroundImage" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dip" android:layout_alignParentBottom="true" android:layout_margin="10dip" android:id="@+id/buttons"> <Button android:text="Save" android:layout_margin="2dip" android:textSize="20dip" android:id="@+id/btnSaveorUpdate" android:layout_height="wrap_content" android:layout_width="145dip"></Button> <Button android:text="Cancel" android:layout_margin="2dip" android:textSize="20dip" android:id="@+id/btnCancelorDelete" android:layout_height="wrap_content" android:layout_width="145dip"></Button> </LinearLayout> <ScrollView android:layout_above="@id/buttons" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:layout_margin="10dip"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dip"> <TextView android:text="Bill details" android:textColor="?textColorDark" android:layout_alignParentTop="true" android:id="@+id/txtEnterDetails" android:textSize="25dip" android:textStyle="bold" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginBottom="2dip"></TextView> <LinearLayout android:focusable="true" android:focusableInTouchMode="true" android:layout_width="0dip" android:layout_height="0dip" /> <EditText android:layout_width="fill_parent" android:hint="Enter data" android:inputType="numberDecimal" android:id="@+id/txtSample" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:text=""></EditText> <EditText android:layout_width="fill_parent" android:id="@+id/txtDescription" android:hint="Enter description" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:inputType="text" android:text=""></EditText> <EditText android:layout_width="fill_parent" android:id="@+id/txtComment" android:hint="Enter comment (if any)" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:inputType="text" android:text=""></EditText> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtDate" android:layout_width="wrap_content" android:text="" android:textSize="20dip" android:textColor="?textColorDark" android:layout_marginLeft="10dip" android:layout_height="@dimen/editTextHeight" android:layout_gravity="center_vertical" /> <Button android:id="@+id/btnPickDate" android:layout_width="wrap_content" android:layout_height="@dimen/editTextHeight" android:text="Select date" android:layout_margin="2dip" android:textSize="15dip" android:layout_gravity="center_vertical" /> </LinearLayout> <TabHost android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@android:id/tabs"></TabWidget> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent"> <ScrollView android:layout_above="@id/buttons" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:id="@+id/tab1"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent"> <TableRow android:id="@+id/tableRow1" android:layout_marginLeft="2dip" android:layout_marginRight="5dip" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@drawable/ic_menu_invite" android:layout_width="40dip" android:layout_height="40dip" android:layout_gravity="center_vertical"></ImageView> <TextView android:text="Add friend" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_centerVertical="true" android:textColor="?textColorDark" android:textSize="@dimen/editText" android:layout_gravity="center_vertical" /> </LinearLayout> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:layout_marginRight="5dip"> <TextView android:id="@+id/txtData1" android:layout_width="170dip" android:layout_height="wrap_content" android:text="Data" android:textSize="14dip" android:textStyle="bold" android:textColor="#000000"> </TextView> <TextView android:id="@+id/txtData2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sample" android:textSize="13dip" android:textColor="#000000"></TextView> </TableRow> </TableLayout> <ListView android:cacheColorHint="#00000000" android:id="@+id/ListView01" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:id="@+id/tab2" android:orientation="vertical"> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent"> <TableRow android:id="@+id/tableRow2" android:layout_marginLeft="2dip" android:layout_marginRight="5dip" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@drawable/ic_menu_invite" android:layout_width="40dip" android:layout_height="40dip" android:layout_gravity="center_vertical"></ImageView> <TextView android:text="Sample" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_centerVertical="true" android:textColor="?textColorDark" android:textSize="@dimen/editText" android:layout_gravity="center_vertical" /> </LinearLayout> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:layout_marginRight="5dip"> <TextView android:id="@+id/txtUser1" android:layout_width="170dip" android:layout_height="wrap_content" android:text="User" android:textSize="14dip" android:textStyle="bold" android:textColor="#000000"> </TextView> <TextView android:id="@+id/txtUserData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="UserData" android:textSize="13dip" android:textColor="#000000"></TextView> </TableRow> </TableLayout> <ListView android:cacheColorHint="#00000000" android:id="@+id/ListView02" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout> </ScrollView> </RelativeLayout>

Por favor, ¿alguien me puede decir cuál es el problema aquí? Tengo otra publicación en el ListView dentro del problema ScrollView, pero no sirvieron para nada en mi caso.


Como de acuerdo conmigo mientras está usando setOnTouchListener om parent o child, pare el desplazamiento de los padres mientras toca el otro niño, detenga el desplazamiento del niño mientras toca el padre


Demo_ListView_In_ScrollView

===========================

package com.app.custom_seekbar; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class Demo_ListView_In_ScrollView extends Activity { ListView listview; ArrayList<String> data=null; listview_adapter adapter=null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); super.setContentView(R.layout.demo_listview_in_scrollview_activity); init(); set_data(); set_adapter(); } public void init() { listview=(ListView)findViewById(R.id.listView1); data=new ArrayList<String>(); } public void set_data() { data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); } public void set_adapter() { adapter=new listview_adapter(Demo_ListView_In_ScrollView.this,data); listview.setAdapter(adapter); Helper.getListViewSize(listview); // set height of listview according to Arraylist item } }

========================

listview_adapter

==========================

package com.app.custom_seekbar; import java.util.ArrayList; import android.app.Activity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; public class listview_adapter extends ArrayAdapter<String> { private final Activity context; ArrayList<String>data; class ViewHolder { public TextView tv_name; public ScrollView scroll; public LinearLayout l1; } public listview_adapter(Activity context, ArrayList<String> all_data) { super(context, R.layout.item_list_xml, all_data); this.context = context; data=all_data; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View rowView = convertView; ViewHolder viewHolder; if (rowView == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView = inflater.inflate(R.layout.item_list_xml, null); viewHolder = new ViewHolder(); viewHolder.tv_name=(TextView)rowView.findViewById(R.id.textView1); rowView.setTag(viewHolder); } else viewHolder = (ViewHolder) rowView.getTag(); viewHolder.tv_name.setText(data.get(position).toString()); return rowView; } }

===================================

Helper class

====================================

import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.ListView; public class Helper { public static void getListViewSize(ListView myListView) { ListAdapter myListAdapter = myListView.getAdapter(); if (myListAdapter == null) { //do nothing return null return; } //set listAdapter in loop for getting final size int totalHeight = 0; for (int size = 0; size < myListAdapter.getCount(); size++) { View listItem = myListAdapter.getView(size, null, myListView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } //setting listview item in adapter ViewGroup.LayoutParams params = myListView.getLayoutParams(); params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); myListView.setLayoutParams(params); // print height of adapter on log Log.i("height of listItem:", String.valueOf(totalHeight)); } }

========================

demo_listview_in_scrollview_activity.xml

========================

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> </ScrollView> </LinearLayout>

================

item_list_xml.xml

==================

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:text="TextView" android:textSize="14sp" /> </LinearLayout>


Encontré una solución que funciona de manera excelente y puede desplazar el ListView sin problemas:

ListView lv = (ListView)findViewById(R.id.myListView); // your listview inside scrollview lv.setOnTouchListener(new ListView.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(false); break; } // Handle ListView touch events. v.onTouchEvent(event); return true; } });

Lo que hace es deshabilitar los TouchEvent en el ScrollView y hacer que el ListView intercepte. Es simple y funciona todo el tiempo.


Es una mala práctica tener dos vistas de desplazamiento diferentes juntas. ListView tiene su propia funcionalidad de desplazamiento y la altura se ajusta automáticamente de acuerdo con la configuración del adaptador para sus elementos de fila (teniendo en cuenta Keelping, no estamos configurando una altura específica para ListView en nuestro xml de diseño). Sin embargo, en su caso, puede reemplazar ListView con una clase y esto ajustará la altura para su ListView teniendo en cuenta que su ListView está dentro de ScrollView.

Esto te ayudara:

public class ExpandableHeightListview extends ListView { boolean expanded = false; public ExpandableHeightListview(Context context) { super(context); } public ExpandableHeightListview(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandableHeightListview(Context context, AttributeSet attrs,int defStyle) { super(context, attrs, defStyle); } public boolean isExpanded() { return expanded; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! if (isExpanded()) { // Calculate entire height by providing a very large height hint. // But do not use the highest 2 bits of this integer; those are // reserved for the MeasureSpec mode. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public void setExpanded(boolean expanded) { this.expanded = expanded; } }

Ahora amplíe su ListView con esta clase, simplemente cambie su etiqueta ListView de su recurso xml a la suavidad de esta manera,

<yourpackagename.ExpandableHeightListview android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/White" android:scrollbars="none" android:orientation="vertical" android:fadingEdge="none"> </cyourpackagename.ExpandableHeightListview>

Esto resolverá su problema de desplazamiento de ListView, ya que ahora ScrollView administra ScrollView en lugar de ListView.


Este es el método exacto de usar Listview en la vista de desplazamiento. Todo lo que tenemos que manejar eventos táctiles.

lstvNextTracks.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e("Lisview *************", "focused"); SCView.requestDisallowInterceptTouchEvent(true); return false; } }); SCView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int arr[] = new int[] { 1, 2 }; lstvNextTracks.getLocationOnScreen(arr); /* Get bounds of child Listview*/ int lstvTop = arr[0]; int lstvBottom = arr[1] + lstvNextTracks.getHeight(); int lstvLeft = arr[1]; int lstvRight = arr[0] + lstvNextTracks.getWidth(); float x = event.getRawX(); float y = event.getRawY(); if (event.getAction() == MotionEvent.ACTION_DOWN) { /*check if child ListView bounds are touched*/ if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight) { SCView.clearFocus(); /*This statement tells the ScrollView to do not handle this touch event, so the child Listview will handle this touch event and will scroll */ SCView.requestDisallowInterceptTouchEvent(true); /*The child Listview isFocusable attribute must be set to true otherwise it will not work*/ lstvNextTracks.requestFocus(); return true; } else return false; } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight) { SCView.clearFocus(); SCView.requestDisallowInterceptTouchEvent(true); lstvNextTracks.requestFocus(); return true; } else return false; } else if (event.getAction() == MotionEvent.ACTION_UP) { SCView.clearFocus(); SCView.requestDisallowInterceptTouchEvent(true); lstvNextTracks.requestFocus(); return false; } else { return false; } } });


He intentado y probado casi todos los métodos mencionados anteriormente, créanme, después de huir completamente de RecyclerView, reemplacé mi ListView con RecyclerView y funcionó perfectamente. No necesitaba ninguna biblioteca de terceros para ExtendedHeightListView y todo, simplemente RecyclerView.

Entonces, heres my Layout file before recyclerView:

<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:elevation="5dp"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/relativeLayoutre" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" tools:context="com.example.android.udamovappv3.activities.DetailedActivity"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar_detail" android:layout_width="match_parent" android:layout_height="56dp" android:layout_gravity="top" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <TextView android:id="@+id/title_name" android:layout_width="fill_parent" android:layout_height="128dp" android:layout_alignParentStart="true" android:layout_marginTop="59dp" android:background="#079ED9" android:gravity="left|center" android:padding="25dp" android:text="Name" android:textColor="#ffffff" android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="@+id/my_toolbar_detail" app:layout_constraintVertical_bias="0.0" tools:layout_editor_absoluteX="0dp" /> <ImageView android:id="@+id/iv_poster" android:layout_width="131dp" android:layout_height="163dp" android:layout_alignStart="@+id/my_toolbar_detail" android:layout_below="@+id/title_name" android:layout_marginBottom="15dp" android:layout_marginRight="8dp" android:layout_marginTop="15dp" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:srcCompat="@mipmap/ic_launcher" /> <Button android:id="@+id/bt_mark_as_fav" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/iv_poster" android:layout_alignParentEnd="true" android:layout_marginBottom="11dp" android:layout_marginEnd="50dp" android:background="#079ED9" android:text="Mark As /n Favorite" android:textSize="10dp" /> <TextView android:id="@+id/tv_runTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/tv_rating" android:layout_below="@+id/tv_releaseDate" android:layout_marginTop="11dp" android:text="TextView" android:textSize="20sp" /> <TextView android:id="@+id/tv_releaseDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/tv_runTime" android:layout_alignTop="@+id/iv_poster" android:text="TextView" android:textSize="25dp" /> <TextView android:id="@+id/tv_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/bt_mark_as_fav" android:layout_below="@+id/tv_runTime" android:layout_marginTop="11dp" android:text="TextView" /> <TextView android:id="@+id/tv_overview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/iv_poster" android:layout_centerHorizontal="true" android:layout_marginBottom="5dp" android:foregroundGravity="center" android:text="adasdasdfadfsasdfasdfasdfasdfnb agfjuanfalsbdfjbdfklbdnfkjasbnf;kasbdnf;kbdfas;kdjabnf;lbdnfo;aidsnfl'';asdfj''plasdfj''pdaskjf''asfj''p[asdfk" android:textColor="#000000" /> <RelativeLayout android:id="@+id/foodItemActvity_linearLayout_fragments" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/tv_overview"> <TextView android:id="@+id/fragment_dds_review_textView_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Reviews:" android:textAppearance="?android:attr/textAppearanceMedium" /> <com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView android:id="@+id/expandable_listview" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:layout_below="@+id/fragment_dds_review_textView_label" android:padding="8dp"> </com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView> </RelativeLayout> </RelativeLayout> </ScrollView>

ESTO ES DESPUÉS DE REEMPLAZAR MI LISTVIEW CON UNA DE LAS MUCHAS SOLUCIONES MENCIONADAS ARRIBA. Así que el problema fue que la vista de lista no se estaba comportando correctamente debido a 2 errores de scrollview (tal vez no un error) en Android.

Reemplacé la vista de reciclador para formar mi diseño final.

Este es mi adaptador de vista de reciclador:

public class TrailerAdapter extends RecyclerView.Adapter<TrailerAdapter.TrailerAdapterViewHolder> { private ArrayList<String> Youtube_URLS; private Context Context; public TrailerAdapter(Context context, ArrayList<String> Youtube_URLS){ this.Context = context; this.Youtube_URLS = Youtube_URLS; } @Override public TrailerAdapter.TrailerAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.trailer_layout, parent, false); return new TrailerAdapterViewHolder(view); } @Override public void onBindViewHolder(TrailerAdapter.TrailerAdapterViewHolder holder, int position) { Picasso.with(Context).load(R.drawable.ic_play_arrow_black_24dp).into(holder.iv_playbutton); holder.item_id.setText(Youtube_URLS.get(position)); } @Override public int getItemCount() { if(Youtube_URLS.size()==0){ return 0; }else{ return Youtube_URLS.size(); } } public class TrailerAdapterViewHolder extends RecyclerView.ViewHolder { ImageView iv_playbutton; TextView item_id; public TrailerAdapterViewHolder(View itemView) { super(itemView); iv_playbutton = (ImageView)itemView.findViewById(R.id.play_button); item_id = (TextView)itemView.findViewById(R.id.tv_trailer_sequence); } } }

Y este es mi diseño personalizado de RecyclerView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="56dp" android:padding="6dip" > <ImageView android:id="@+id/play_button" android:layout_width="70dp" android:layout_height="wrap_content" android:layout_marginRight="6dip" android:layout_marginStart="12dp" android:src="@drawable/ic_play_arrow_black_24dp" android:layout_centerVertical="true" android:layout_alignParentStart="true" /> <TextView android:id="@+id/tv_trailer_sequence" android:layout_width="wrap_content" android:layout_height="26dip" android:layout_centerVertical="true" android:layout_toEndOf="@+id/play_button" android:ellipsize="marquee" android:gravity="center" android:maxLines="1" android:text="Description" android:textSize="12sp" /> </RelativeLayout>

Y VOILA, obtuve el efecto deseado de ListView (Now RecyclerView) dentro de un scollview. Aquí está la imagen final de la interfaz de usuario

Como nota final, creo que reemplazar RecyclerView fue una mejor opción para mí, ya que mejoró la estabilidad general de la aplicación y también me ayudó a entender RecyclerView mejor. Si tuviera que sugerir una solución, voy a decir que reemplace su ListView con un RecyclerView.


La mejor solución es usar NestedScrollVew con RecyclerView o si desea ir con Listview, puede agregar una vista de encabezado y pie de página. Por ejemplo:

View footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.outofoffice_footer_view, null, false); infoListView.addFooterView(footerView);


La solución anterior dada por @Shailesh Rohit funciona perfectamente bien. Algunos trucos tienen que hacerse.

  1. Si está colocando clase auxiliar dentro de la misma clase (clase principal), entonces haga que la clase Helper sea estática y getListViewSize () no sea estática.

  2. Lo más importante, escriba "Helper.getListViewSize (listView);" declaración después de configurar el adaptador por primera vez como "listView.setAdapter (myAdapter);" así como cuando esté usando "myAdapter.notifyDataSetChanged ();"

  3. El uso se muestra a continuación.

    listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);

    myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);


No debe poner un ListView dentro de un ScrollView porque la clase ListView implementa su propio desplazamiento y simplemente no recibe gestos porque todos son manejados por el ScrollView padre. Recomiendo encarecidamente que simplifique su diseño de alguna manera. Por ejemplo, puede agregar vistas que desee que se desplacen a ListView como encabezados o pies de página.

ACTUALIZAR :

A partir de API Level 21 (Lollipop), los contenedores de desplazamiento anidados son compatibles oficialmente con Android SDK. Hay una gran cantidad de métodos en las clases View y ViewGroup que proporcionan esta funcionalidad. Para realizar un desplazamiento anidado en Lollipop, debe habilitarlo para una vista de desplazamiento secundaria agregando android:nestedScrollingEnabled="true" a su declaración XML o llamando explícitamente a setNestedScrollingEnabled(true) .

Si desea que el desplazamiento anidado funcione en dispositivos anteriores a Lollipop, lo que probablemente haga, debe utilizar las clases de utilidad correspondientes de la biblioteca de Soporte. Primero debe reemplazar ScrollView con NestedScrollView . Este último implementa NestedScrollingParent y NestedScrollingChild por lo que se puede utilizar como contenedor de desplazamiento primario o secundario.

Pero ListView no admite el desplazamiento anidado, por lo tanto, debe NestedScrollingChild subclase e implementar NestedScrollingChild . Afortunadamente, la biblioteca de soporte proporciona la clase NestedScrollingChildHelper , por lo que solo tiene que crear una instancia de esta clase y llamar a sus métodos desde los métodos correspondientes de su clase de vista.


Simplemente tiene que reemplazar su <ScrollView ></ScrollView> con este Custom ScrollView como <com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >

package com.tmd.utils; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ScrollView; public class VerticalScrollview extends ScrollView{ public VerticalScrollview(Context context) { super(context); } public VerticalScrollview(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_MOVE: return false; // redirect MotionEvents to ourself case MotionEvent.ACTION_CANCEL: Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_UP: Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" ); return false; default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() ); return true; } }


También tengo una solución. Yo siempre uso este método Prueba esto

<ScrollView android:id="@+id/createdrill_scrollView" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="15dp" > <net.thepaksoft.fdtrainer.NestedListView android:id="@+id/crewList" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:layout_weight="1" android:background="@drawable/round_shape" android:cacheColorHint="#00000000" > </net.thepaksoft.fdtrainer.NestedListView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="15dp" > <net.thepaksoft.fdtrainer.NestedListView android:id="@+id/benchmarksList" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:layout_weight="1" android:background="@drawable/round_shape" android:cacheColorHint="#00000000" > </net.thepaksoft.fdtrainer.NestedListView> </LinearLayout> </ScrollView>

Clase NestedListView.java:

public class NestedListView extends ListView implements OnTouchListener, OnScrollListener { private int listViewTouchAction; private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99; public NestedListView(Context context, AttributeSet attrs) { super(context, attrs); listViewTouchAction = -1; setOnScrollListener(this); setOnTouchListener(this); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, -1); } } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int newHeight = 0; final int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { ListAdapter listAdapter = getAdapter(); if (listAdapter != null && !listAdapter.isEmpty()) { int listPosition = 0; for (listPosition = 0; listPosition < listAdapter.getCount() && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) { View listItem = listAdapter.getView(listPosition, null, this); //now it will not throw a NPE if listItem is a ViewGroup instance if (listItem instanceof ViewGroup) { listItem.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } listItem.measure(widthMeasureSpec, heightMeasureSpec); newHeight += listItem.getMeasuredHeight(); } newHeight += getDividerHeight() * listPosition; } if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) { if (newHeight > heightSize) { newHeight = heightSize; } } } else { newHeight = getMeasuredHeight(); } setMeasuredDimension(getMeasuredWidth(), newHeight); } @Override public boolean onTouch(View v, MotionEvent event) { if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, 1); } } return false; } }


Tengo un problema similar y lo resolví creando una clase personalizada ampliando con ListView.

ScrollableListView.java

import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; public class ScrollableListView extends ListView { public ScrollableListView (Context context, AttributeSet attrs) { super(context, attrs); } public ScrollableListView (Context context) { super(context); } public ScrollableListView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }

Uso:

<com.my.package.ScrollableListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"/>


Tuve un problema similar y mientras busqué en Google encontré su pregunta. Sí, la respuesta marcada también funcionó para mí, pero hubo algún problema.
De todos modos encontré otra solution . que funciona perfectamente sin hacer ningún malabarismo.


Utilice este método y su vista de lista se puede desplazar dentro de scrollview: -

ListView lstNewsOffer.setAdapter(new ViewOfferAdapter( ViewNewsDetail.this, viewOfferList)); getListViewSize(lstNewsOffer); void getListViewSize(ListView myListView) { ListAdapter myListAdapter = myListView.getAdapter(); if (myListAdapter == null) { // do nothing return null return; } // set listAdapter in loop for getting final size int totalHeight = 0; for (int size = 0; size < myListAdapter.getCount(); size++) { View listItem = myListAdapter.getView(size, null, myListView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } // setting listview item in adapter ViewGroup.LayoutParams params = myListView.getLayoutParams(); params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); myListView.setLayoutParams(params); // print height of adapter on log Log.i("height of listItem:", String.valueOf(totalHeight)); }


Utiliza el siguiente método y ¡disfruta!

private void setListViewScrollable(final ListView list) { list.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { listViewTouchAction = event.getAction(); if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, 1); } return false; } }); list.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, -1); } } }); }

listViewTouchAction es un valor entero global. Si puedes reemplazar la línea

list.scrollBy(0, 1);

con algo más, por favor compártelo con nosotros.

¡Disfrutar!


Dont give scroll view to ListView , coz it has that setting default

<ListView android:cacheColorHint="#00000000" android:id="@+id/ListView01" android:layout_height="wrap_content" android:layout_width="fill_parent" />


For ListView inside ScrollView use NestedScrollView it can handle this functionality very easily:

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dip"/> </LinearLayout> </android.support.v4.widget.NestedScrollView>


I found a solution for that, Instead of using scrollview, You can use addHeaderview and addFooterview of listview

Here is my snippet,

// create separate layout and add it dynamically scrollview=getLayoutInflater().inflate(R.layout.yourlayout,null); lv=(ListView)listview.findViewById(R.id.listView2); lv.addHeaderView(scrollview); lv.setContentView(lv);

Now, with the listview your layout also can be scrolled. Enjoy it!!!


I have had this error.And my solution is following as:

1. Create a custom listview which is non scrollable

public class NonScrollListView extends ListView { public NonScrollListView(Context context) { super(context); } public NonScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public NonScrollListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); }

}

2. Use above custom class for xml file

<com.Example.NonScrollListView android:id="@+id/lv_nonscroll_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </com.Example.NonScrollListView>

Hope best for you.


Try this with ScrollView, not with ListView.

public class xScrollView extends ScrollView { ; ; @Override public boolean onInterceptTouchEvent (MotionEvent ev) { return false; } }


replace ListView by RecycleView inside ScrollView. it runs smoothly without additional source code:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.hung.recycleviewtest.MainActivityFragment" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view" android:layout_width="match_parent" android:layout_height="400dp" android:background="@android:color/darker_gray"/> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view_a" android:layout_marginTop="40dp" android:layout_below="@id/recycle_view" android:layout_width="match_parent" android:layout_height="400dp" android:background="@android:color/darker_gray"/> </RelativeLayout> </ScrollView>


No se puede agregar un ListView en una vista de desplazamiento, ya que la vista de lista también se cuelga y habría un problema de sincronización entre scroll de vista de lista y desplazamiento de vista de desplazamiento. Puede hacer una vista CustomList y agregar este método en ella.

@Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* * Prevent parent controls from stealing our events once we''ve gotten a touch down */ if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { ViewParent p = getParent(); if (p != null) { p.requestDisallowInterceptTouchEvent(true); } } return false; }


list.setOnTouchListener(new OnTouchListener() { // Setting on Touch Listener for handling the touch inside ScrollView @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; } });