ListView in ScrollView non scorre su Android


157

Sto riscontrando problemi con uno scorrimento ListView all'interno di a ScrollView. Ho un'attività che ha alcuni EditTexts nella parte superiore e quindi un host di schede con due schede che hanno un ListView ciascuno. Quando le viste EditText sono focalizzate, viene visualizzata la tastiera virtuale e poiché ho un ScrollView, il contenuto è scorrevole. Ma il problema si presenta quando ci sono più elementi in ListViews (quelli nelle schede), non sono in grado di scorrere ListView, anche se ci sono più elementi.

Di seguito è riportato il layout 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>

Per favore qualcuno può dirmi qual è il problema qui? Ho un altro post su ListView all'interno del problema ScrollView, ma nel mio caso non sono stati utili.



Risposte:


175

Non dovresti metterne uno ListViewa ScrollViewperché la ListViewclasse implementa il suo scrolling e semplicemente non riceve gesti perché sono tutti gestiti dal genitore ScrollView. Ti consiglio vivamente di semplificare il layout in qualche modo. Ad esempio, è possibile aggiungere visualizzazioni che si desidera scorrere ListViewcome intestazioni o piè di pagina.

AGGIORNAMENTO :

A partire da API Level 21 (Lollipop) i contenitori di scorrimento nidificati sono ufficialmente supportati da Android SDK. Ci sono un sacco di metodi Viewe ViewGroupclassi che forniscono questa funzionalità. Per far funzionare lo scorrimento nidificato su Lollipop è necessario abilitarlo per una vista di scorrimento figlio aggiungendolo android:nestedScrollingEnabled="true"alla sua dichiarazione XML o chiamando esplicitamente setNestedScrollingEnabled(true).

Se si desidera far funzionare lo scorrimento nidificato su dispositivi pre-Lollipop, cosa che probabilmente si fa, è necessario utilizzare le classi di utilità corrispondenti dalla libreria di supporto. Per prima cosa devi sostituirti ScrollViewcon NestedScrollView . Quest'ultimo implementa sia NestedScrollingParent che NestedScrollingChild in modo che possa essere utilizzato come contenitore di scorrimento padre o figlio.

Ma ListViewnon supporta lo scorrimento nidificato, quindi è necessario sottoclassarlo e implementarlo NestedScrollingChild. Fortunatamente, la libreria Support fornisce la classe NestedScrollingChildHelper , quindi devi solo creare un'istanza di questa classe e chiamarne i metodi dai metodi corrispondenti della tua classe di visualizzazione.


Grazie Pixie, ma devi aver notato che sto usando un tabhost con due schede contenenti ciascuna una visualizzazione elenco separata. In questo caso come posso aggiungere intestazioni o piè di pagina?
Ashwani K,

Sì, mettere le schede in un ListViewsarebbe strano. Ma il tuo layout è molto complicato. Non riesco nemmeno a capire come vuoi che assomigli. Ad ogni modo è meglio semplificarlo perché un ListViewnidificato in un ScrollViewnidificato in un altro ScrollViewsembra strano e non funzionerà.
Michael,

6
È possibile utilizzare listView all'interno di scrollView.Per favore vedi la risposta qui
Atul Bhardwaj

2
listview personalizzato all'interno ScrollView stackoverflow.com/questions/18813296/... .
Dedaniya HirenKumar,

1
sì, è possibile nidificare viste scorrevoli, ma indica anche che il layout (e il design UE) è un po 'complesso
suitianshi

304

Ho trovato una soluzione che funziona in modo eccellente e può scorrere ListViewsenza problemi:

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

Ciò che fa è disabilitare i messaggi di posta TouchEventelettronica ScrollViewe farli ListView intercettare. È semplice e funziona sempre.


Un problema con questo, funziona bene senza il listener onitemclick, se voglio anche OnItemClickListener?
Hardik Joshi,

Funziona anche con visualizzazioni elenco nidificate e visualizzazioni elenco espandibili. Se si dispone di SwipeRefreshLaout, si verificheranno problemi quando si scorre verso l'alto. Un modo semplice per gestire anche quello è ottenere un'istanza di SwipeRefreshLayout attraverso i genitori, quindi disabilitarla su down e riabilitarla su up.
Kalel Wade,

2
Hello @ Moisés Olmedo, sto cercando di utilizzare lo stesso metodo, ma per ottenere questa visualizzazione personalizzata HorizontalListView ha richiamato setOnTouchListener ma non sovrascrive performClick. c'è un modo per affrontarlo?
Aayushi,

È fantastico - lo uso per far funzionare DragAndDropLinearLayout all'interno di scrollview - Ho impostato questo listener per trascinare il gestore e disabilitare la vista di scorrimento del frammento. L'unica differenza è che vorrei restituire false anziché true per far funzionare il trascinamento della selezione.
Boris Treukhov,

@ MoisésOlmedo Ho seguito la tua risposta. Funziona perfettamente in modalità verticale, ma non in orizzontale. Ho 11 articoli in elenco. Tutti sono visibili in verticale, ma in orizzontale ne ottengo solo 6. L'elenco non scorre.
Prabs,

141

Ho anche una soluzione. Uso sempre questo metodo. Prova questo

<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>

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

24
Questa dovrebbe essere la risposta accettata. Mentre tutte le altre soluzioni funzionano solo quando gli elementi dell'elenco hanno le stesse dimensioni, questa soluzione supera quelli quando gli elementi dell'elenco hanno altezza variabile. Ho trascorso alcune ore e finalmente ho trovato questo.
Khobaib,

1
È una risposta perfetta e dovrebbe essere votata come accettata. funziona per più altezze di file
iBabur,

4
Scrollview può ospitare solo un figlio diretto. Come è possibile.
Pranav,

8
Ho riscontrato un grosso problema con questa soluzione. Sconfigge l'intero scopo della visualizzazione elenco. Esegue essenzialmente un carico di tutte le visualizzazioni elenco (non solo quelle visibili) e modifica l'altezza per inghiottirle tutte (più come una LinearLayoutanziché una ListView. Ciò significa che se si dispone di un numero elevato di voci di elenco (o voci di elenco complesse) quindi i dispositivi Android impiegheranno molto tempo ad aprire l'attività (o addirittura a bloccarsi durante il tentativo nel mio caso).
reubenjohn

2
la peggior idea di sempre ... Hai appena ricreato un LinearLayout molto costoso :) - Romain Guy (ingegnere google) ... questa soluzione è solo per i noobs che non comprendono appieno ListView ... @reubenjohn hai perfettamente ragione
Selvin,

47

Devi solo sostituire il tuo <ScrollView ></ScrollView>con questo Custom ScrollViewcome <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;
    }
}

@Atul funziona bene sui dispositivi: Samsung captiavte i897, HTC Sensation, HTC Incredible, ma non funziona su HTC Desire x, quale potrebbe essere il problema?
pepela,

@Atul ma scorre a volte quando si usano 3 o 4 dita ma a volte.
pepela,

@pepela hai ragione. A volte non è fluido come una sola vista di scorrimento. Ma soddisfa le nostre esigenze.
Atul Bhardwaj,

Può intercettare tutti i movimenti quando si scorre una grande lista. per quanto mi riguarda, uso questa patch: pristalovpavel.wordpress.com/2014/12/26/…
anil

11

Ho avuto lo stesso problema e mentre cercavo su Google ho trovato la tua domanda. Sì, la risposta contrassegnata ha funzionato anche per me, ma c'era qualche problema.
Comunque ho trovato un'altra soluzione . che funziona perfettamente senza fare giocoleria.


4
Si prega di pubblicare la risposta su SO, non solo il collegamento a un sito esterno.
mad_manny,

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

un piccolo problema con questo è che voglio continuare a scorrere la vista di scorrimento quando la vista di elenco raggiunge la fine mentre la si tocca.
Badr,

6

Ecco il metodo esatto di utilizzo di Listview con in Scrollview. Tutto ciò che dobbiamo gestire gli eventi tattili.

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

presenta un bug quando l'area di scorrimento è fuori dall'area tattile
ademar111190,

6

Usa il seguente metodo e divertiti!

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 è un valore intero globale. Se è possibile sostituire la linea

list.scrollBy(0, 1);

con qualcos'altro per favore condividilo con noi.

Godere!


Molto vicino. Non funziona ancora in molte volte, ma almeno funziona in alcune volte.
Erdomester,

2
Funziona ma il problema è con la velocità della pergamena. È molto lento.
sumit pandey,

4

È una cattiva pratica avere due diverse viste di scorrimento insieme. ListView stesso ha una propria funzionalità di scorrimento e l'altezza viene regolata automaticamente in base alle impostazioni dell'adattatore per gli elementi della riga (tenendo presente la guida, non impostiamo un'altezza specifica su ListView nel nostro layout xml). Tuttavia, nel tuo caso, puoi sostituire ListView con una classe e questo regolerà l'altezza per ListView tenendo presente che ListView si trova all'interno di ScrollView.

Questo ti aiuterà:

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

Ora estendi il tuo ListView con questa classe, basta cambiare il tag ListView dal tuo xml di risorse a un effetto simile a questo,

<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>

Questo risolverà il tuo problema di scorrimento di ListView, poiché ora lo scrolling principale è gestito da ScrollView anziché da ListView.


Ciò consente a ListView di scorrere all'interno di NestedScrollView ??
KJEjava48,

Sì, lo permetterà. Come attraverso questa soluzione, le proprietà di scorrimento della visualizzazione elenco saranno disabilitate e la vista di scorrimento padre sarà responsabile dello scorrimento dei contenuti della visualizzazione lista. Spero che sia d'aiuto.
Ravi Kabra,

4

So che questa domanda è stata posta molto tempo fa, ma chi mai è bloccato per ora può risolverlo aggiungendo questa riga in ListView

android:nestedScrollingEnabled="true"

Per esempio -

                    <ListView
                    android:id="@+id/listView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="true" />

3

Ho un problema simile e risolto creando una classe personalizzata estendendo 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"/>

UIHaq Questo permette a ListView di scorrere all'interno di NestedScrollView ??
KJEjava48,

1
Non funziona per ExpandableListview multilivello come 3 livello o 4 livello. Qualsiasi aiuto??
KJEjava48,

1

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;

            }


        }

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

Classe di aiuto

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

    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>

4
Probabilmente dovresti spiegare un po ', una massa di codice non è eccezionale come una risposta senza una spiegazione.
Aaron Hall

Ho usato questa soluzione. Ma questa soluzione non è buona. La mia lista contiene 10 articoli, ma mostra 9.5 o 9 articoli.
Hai Rom,

1

La soluzione migliore è utilizzare NestedScrollVew con RecyclerView o, se si desidera utilizzare Listview, è possibile aggiungere la vista intestazione e piè di pagina a questo. Per esempio:

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

1

Ho provato e testato quasi tutti i metodi sopra menzionati, credetemi, dopo essere scappato completamente da RecyclerView, ho sostituito il mio ListView con RecyclerView e ha funzionato perfettamente. Non necessitava di alcuna libreria di terze parti per ExtendedHeightListView e tutti, solo RecyclerView semplice e chiaro.

Quindi ecco il mio file di layout prima di 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>

QUESTO È SUCCESSIVO ALLA SOSTITUZIONE DELLA MIA LISTA DI VISTA CON UNA DELLE MOLTE SOLUZIONI DI CUI SOPRA. Quindi il problema era che listview non si stava comportando correttamente a causa di 2 bug scrollview (forse non un bug) in Android.

Ho sostituito la vista con riciclatore per formare il mio layout finale.

Questo è il mio adattatore per la vista del riciclatore:

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

E questo è il mio layout personalizzato di 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>

E VOILA, ho ottenuto l'effetto desiderato di ListView (Now RecyclerView) in uno scollview. Ecco l'immagine finale dell'interfaccia utente

In ultima analisi, credo che la sostituzione di RecyclerView sia stata una scelta migliore per me, poiché ha migliorato la stabilità generale dell'app e mi ha anche aiutato a capire meglio RecyclerView. Se dovessi suggerire una soluzione, dirò di sostituire il tuo ListView con un RecyclerView.


1

La soluzione sopra fornita da @Shailesh Rohit funziona perfettamente. Alcuni trucchi devono essere fatti.

  1. Se si inserisce la classe helper all'interno della stessa classe (classe principale), rendere Helper class come statica e getListViewSize () non essere statica.

  2. Più importante, scrivi "Helper.getListViewSize (listView);" istruzione dopo aver impostato l'adattatore per la prima volta come "listView.setAdapter (myAdapter);" così come quando mai si utilizza "myAdapter.notifyDataSetChanged ();"

  3. L'utilizzo è mostrato di seguito.

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


0

Secondo me mentre stai usando setOnTouchListener om genitore o figlio interrompi lo scorrimento del genitore mentre tocchi il bambino altrimenti interrompi lo scorrimento del bambino mentre tocchi il genitore


0

Prova questo con ScrollView, non con ListView.

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

puoi formattare il codice ?? la risposta ha righe vuote con punto e virgola e nessun commento
Tejus Prasad,

Se non fai molto con ScrollView esteso, non è necessario scrivere qualcosa nelle righe con punti e virgola. Quindi rimuovili. E supponiamo che il nome del pacchetto 'com.me', quindi nel layout XML, utilizzare '<com.me.xScrollView ...' invece di '<ScrollView ...'
Kim Sangdeuk,

0

requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Chiamato quando un bambino non desidera che questo genitore e i suoi antenati intercettino gli eventi touch con onInterceptTouchEvent (MotionEvent). Questo genitore dovrebbe passare questa chiamata ai suoi genitori. Questo genitore deve obbedire a questa richiesta per la durata del tocco (vale a dire cancellare la bandiera solo dopo che un genitore ha ricevuto un up o un annullamento.

Prova questa risposta,

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

0

sostituire ListView con RecycleView all'interno di ScrollView. funziona senza intoppi senza codice sorgente aggiuntivo:

 <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>

0

Per ListView in ScrollView usa NestedScrollView può gestire questa funzionalità molto facilmente:

<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>

0

Ho riscontrato questo errore e la mia soluzione è la seguente:

1. Creare una visualizzazione elenco personalizzata non scorrevole

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. Utilizzare la classe personalizzata sopra per il file xml

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

Spero il meglio per te.


Ciò consente a ListView di scorrere all'interno di NestedScrollView ?? Penso che ridimensiona la visualizzazione elenco in base alle dimensioni dell'articolo.
KJEjava48,

Non funziona per ExpandableListview multilivello come 3 livello o 4 livello. Qualsiasi aiuto??
KJEjava48,

0

Ho trovato una soluzione per questo, Invece di usare scrollview, puoi usare addHeaderview e addFooterview di listview

Ecco il mio frammento,

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

Ora, con la visualizzazione elenco è anche possibile scorrere il layout. Divertirsi!!!


0

Sostituisci ScrollView con android.support.v4.widget.NestedScrollView all'interno di xml. corre

1) Utilizzare in XML :::: android.support.v4.widget.NestedScrollView

invece di:::: ScrollView

2) E utilizzare per la visualizzazione elenco in questo modo utilizzando NonScrollListView nel file cs:

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

3) Infine utilizza questo codice per identificare scrollview nel file cs:

NonScrollListView listView = (NonScrollListView) view.findViewById(R.id.listview);

Ciò consente a ListView di scorrere all'interno di NestedScrollView ??
KJEjava48,

Non funziona per ExpandableListview multilivello come 3 livello o 4 livello. Qualsiasi aiuto??
KJEjava48,

0

Miglior codice

<android.support.v4.widget.NestedScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/btmlyt"
android:layout_below="@+id/deshead_tv">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
   android:orientation="vertical"
   >

<TextView
    android:id="@+id/des_tv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/btmlyt"
    android:background="@android:color/white"
    android:paddingLeft="3dp"
    android:paddingRight="3dp"
    android:scrollbars="vertical"
    android:paddingTop="3dp"
    android:text="description"
    android:textColor="@android:color/black"
    android:textSize="18sp" />
</LinearLayout>

</android.support.v4.widget.NestedScrollView>


-1

Utilizzare questo metodo e la visualizzazione elenco diventa scorrevole all'interno della visualizzazione scorrimento: -

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

-1

Non è possibile aggiungere un ListView in una vista a scorrimento, poiché anche la vista elenco scolls e si verificherebbe un problema di sincronizzazione tra lo scorrimento listview e lo scoll vista scorrimento. È possibile creare una vista dell'elenco personalizzato e aggiungere questo metodo al suo interno.

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

-2

Non dare la vista di scorrimento a ListView, perché ha quell'impostazione predefinita

<ListView
    android:cacheColorHint="#00000000"
    android:id="@+id/ListView01"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.