ScrollView içindeki ListView Android'de kaydırılmıyor


157

ListViewİçinde kaydırma ile ilgili sorun yaşıyorumScrollView . Bazı EditTexts üst kısmında ve sonra bir sekme ana her biri bir ListView olan iki sekme olan bir etkinlik var. EditText görünümleri odaklandığında, yazılım klavyesi açılır ve ScrollView'um olduğu için içerik kaydırılabilir. Ancak sorun ListViews (sekmelerde olanlar) daha fazla öğe olduğunda, daha fazla öğe olsa bile, ListView kaydırma mümkün değildir geliyor.

XML düzenidir:

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

Lütfen birisi bana sorunun ne olduğunu söyleyebilir mi? ListView ScrollView içinde sorun başka bir yazı var, ama benim durumumda hiçbir faydası vardı.



Bir çözüm buldum
Md Imran Choudhury

Yanıtlar:


175

Bir koymamaliydiniz ListViewiçeride a ScrollViewçünkü ListViewhepsi ebeveyn tarafından işlenir çünkü sınıfının uyguladığı kendi kaydırma ve sadece jestler almaz ScrollView. Düzeninizi bir şekilde basitleştirmenizi önemle tavsiye ederim. Örneğin ListView, üstbilgi veya altbilgi olarak kaydırılmasını istediğiniz görünümleri ekleyebilirsiniz .

GÜNCELLEME :

API Seviye 21 (Lollipop) iç içe kaydırma kapsayıcılarından başlayarak Android SDK tarafından resmi olarak desteklenmektedir. Bu işlevselliği sağlayan bir grup yöntem Viewve ViewGroupsınıf vardır. İç içe kaydırma işleminin Lollipop üzerinde çalışmasını sağlamak android:nestedScrollingEnabled="true"için, XML bildirimine ekleyerek veya açıkça arayarak bir alt kaydırma görünümü için etkinleştirmeniz gerekirsetNestedScrollingEnabled(true) .

Büyük olasılıkla yaptığınız Lollipop öncesi aygıtlarda iç içe kaydırma işlemini yapmak istiyorsanız, Destek kitaplığındaki karşılık gelen yardımcı program sınıflarını kullanmanız gerekir. Önce sizi NestedScrollViewScrollView ile değiştirmeniz gerekiyor . İkincisi uygular hem NestedScrollingParent ve NestedScrollingChild bir ebeveyn veya çocuk kaydırma kapsayıcı olarak kullanılabilecek şekilde.

Ancak ListViewiç içe kaydırmayı desteklemez, bu nedenle alt sınıfı sınıflandırmanız ve uygulamanız gerekir NestedScrollingChild. Neyse ki, Destek kütüphanesi NestedScrollingChildHelper sınıfını sağlar, bu nedenle bu sınıfın bir örneğini oluşturmanız ve yöntemlerini görünüm sınıfınızın ilgili yöntemlerinden çağırmanız yeterlidir .


Teşekkürler Pixie, ama her biri ayrı bir liste görünümü içeren iki sekmeli bir tabhost kullandığımı fark etmiş olmalısınız. Bu durumda üstbilgileri veya altbilgileri nasıl ekleyebilirim?
Ashwani K

Evet, sekmeleri içine koymak ListViewgarip olurdu. Ancak düzeniniz çok karmaşık. Neye benzediğini bile anlayamıyorum. Her neyse, daha basit hale getirmeniz daha iyi olur, çünkü başka bir ListViewiçine yerleştirilmiş bir ScrollViewyuvalanmış ScrollViewgarip görünüyor ve çalışmaz.
Michael


2
scrollview içindeki özel liste görünümü stackoverflow.com/questions/18813296/… .
Dedaniya HirenKumar

1
evet, kaydırılabilir görünümleri yuvalamak mümkündür, ancak aynı zamanda düzeninizin (ve UE tasarımının) biraz karmaşık olduğunu gösterir
suitianshi

305

Mükemmel çalışan ve sorunsuz kaydırmak bir çözüm buldum ListView:

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

Ne yapar devre dışı olduğunu TouchEventüzerine ler ScrollViewve yapmak ListView keseninin onları. Çok basittir ve her zaman çalışır.


Bu konuda bir sorun, onitemclick dinleyici olmadan iyi çalışıyor, o zaman ben de OnItemClickListener istiyorsanız?
Hardik Joshi

Bu, iç içe liste görünümleri ve genişletilebilir liste görünümleri için de geçerlidir. Bir SwipeRefreshLaout'unuz varsa, yukarı kaydırdığınızda sorun yaşarsınız. Bunu da ele almanın kolay bir yolu, ebeveynler aracılığıyla SwipeRefreshLayout'un bir örneğini almak ve daha sonra devre dışı bırakmak ve yeniden etkinleştirmek.
Kalel Wade

2
Merhaba @ Moisés Olmedo ben aynı yöntemi kullanmaya çalışıyorum ama bu Özel görünümü elde HorizontalListView setOnTouchListener üzerinde çağırdı ama performClick geçersiz kılmaz. Bununla başa çıkmanın bir yolu var mı?
Aayushi

Bu harika - DragAndDropLinearLayout'un scrollview içinde çalışmasını sağlamak için kullanıyorum - bu dinleyiciyi işleyiciyi sürüklemek ve parçanın scrollview özelliğini devre dışı bırakmak için ayarladım. Tek fark, sürükle ve bırak işini yapmak için true yerine false döndürürüm .
Boris Treukhov

@ MoisésOlmedo Cevabınızı takip ettim. Portre modunda mükemmel çalışıyor, ancak manzara modunda değil. Listede 11 ürün var. Hepsi dikey olarak görülebilir, ancak manzarada sadece 6 alıyorum. Liste kaydırma yapmıyor.
Prabs

141

Benim de bir çözümüm var. Ben her zaman bu yöntemi kullanıyorum. Bunu dene

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

NestedListView.java sınıfı:

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
Bu kabul edilen cevap olmalı. Diğer tüm çözümler yalnızca liste öğeleri aynı boyuttayken çalışır, ancak bu çözüm liste öğeleri değişken yüksekliğe sahip olduğunda göze çarpmaktadır. Birkaç saat geçirdim ve sonunda bunu buldum.
Khobaib

1
Mükemmel bir cevap ve kabul edildiği gibi oylanmalıdır. satırların birden çok yüksekliği için çalışır
iBabur

4
Scrollview yalnızca bir doğrudan çocuğa ev sahipliği yapabilir.
Pranav

8
Bu çözümle ilgili büyük bir sorun buldum. Liste görünümünün tüm amacını yener. Temelde tüm liste görünümlerinin bir yükünü (yalnızca görünür olanları değil) gerçekleştirir ve tümünü hepsini içine alacak şekilde değiştirir (daha çok a LinearLayoutyerine benzer ListView.) Bu, çok sayıda liste öğeniz (veya karmaşık liste öğeleri) varsa sonra android cihazlar etkinliği açmak için çok zaman alacaktır (veya benim durumumda çalışırken çöküyor)
reubenjohn

2
şimdiye kadarki en kötü fikir ... Çok pahalı bir LinearLayout'u yeniden yarattınız :) - Romain Guy (google mühendisi) ... bu çözüm sadece ListView'ı tam olarak anlamayan yeni başlayanlar için ... @reubenjohn kesinlikle haklısınız
Selvin

47

Eğer sadece değiştirmek zorunda <ScrollView ></ScrollView>bununla Custom ScrollViewbeğendiniz <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;
    }
}

@ Bu cihazlarda iyi çalışıyor: Samsung captiavte i897, HTC Sensation, HTC Incredible, ancak HTC Desire x üzerinde çalışmıyor, sorun ne olabilir?
pepela

@Atul ama bazen 3 veya 4 parmak kullanırken bazen kaydırır.
pepela

@pepela haklısın.Bazen sadece bir kaydırma Görünümü kadar pürüzsüz değil. Ama ihtiyacımızı karşılıyor.
Atul Bhardwaj

Büyük liste görünümü kaydırıldığında tüm hareketleri kesebilir. Bana gelince
anil

11

Ben de aynı sorunu yaşadım ve googling yaparken sorunuzu buldum. Evet işaretli cevap benim için de çalıştı ama bir sorun vardı.
Neyse başka bir çözüm buldum . hiçbir hokkabazlık yapmadan mükemmel çalışır.


4
Lütfen yalnızca harici siteye bağlantı vermekle kalmayıp SO'ya yanıt gönderin.
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;
    }
});

Bununla ilgili küçük bir sorun, liste görünümü dokunurken sonuna ulaştığında kaydırma görünümünü kaydırmaya devam etmek istiyorum.
Bedir

6

Aşağıda, Scrollview'da Listview özelliğini kullanmanın tam yöntemi verilmiştir. Tek yapmamız gereken dokunma olaylarını.

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

alanı dokunma alanı dışında olduğunda bir hata var
ademar111190 15:12

6

Aşağıdaki yöntemi kullanın ve tadını çıkarın!

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 genel bir tamsayı değeridir. Hattı değiştirebilirseniz

list.scrollBy(0, 1);

başka bir şeyle lütfen bizimle paylaşın.

Zevk almak!


Çok yakın. Hala birçok kez çalışmıyor, ama en azından birkaç kez çalışıyor.
erdomester

2
Çalışıyor ama sorun kaydırma hızı ile. Çok laggy.
sumit pandey

4

Birlikte iki farklı kaydırma görünümüne sahip olmak kötü bir uygulamadır. ListView'ın kendi kaydırma işlevi vardır ve satır öğeleriniz için Adaptör ayarlarına göre yükseklik otomatik olarak ayarlanır (Akılda tutarak, Mizanpaj xml'de ListView için belirli bir yükseklik ayarlamıyoruz). Ancak sizin durumunuzda, ListView öğesini bir sınıfla değiştirebilirsiniz; bu, ListView'ınızın ScrollView içinde olduğunu göz önünde bulundurarak ListView'ınızın yüksekliğini ayarlayacaktır.

Bu sana yardım edecek:

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

Şimdi ListView'inizi bu sınıfla genişletin, ListView etiketinizi kaynak xml'nizden böyle bir şekilde değiştirin.

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

Üst kaydırma artık ListView yerine ScrollView tarafından yönetildiği için, bu ListView kaydırma sorununuzu çözecektir.


Bu ListView NestedScrollView içinde kaydırmak sağlar?
KJEjava48

Evet, izin verir. Bu çözümde olduğu gibi, liste görünümü kaydırma özellikleri devre dışı bırakılır ve liste görünümü içeriklerini kaydırmak için üst kaydırma görünümü sorumludur. Umarım yardımcı olur.
Ravi Kabra

4

Bu sorunun uzun zaman önce sorulduğunu biliyorum, ama şimdilik kim sıkışmış bu listeyi ListView'inize ekleyerek bunu çözebilir

android:nestedScrollingEnabled="true"

Örneğin -

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

3

Benzer sorunu yaşadım ve ListView ile genişleterek özel sınıf oluşturarak çözüldüm.

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

Kullanımı:

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

UIHaq Bu ListView NestedScrollView içinde kaydırmak sağlar?
KJEjava48

1
3 düzey veya 4 düzey gibi çok düzeyli Genişletilebilir Liste için çalışmıyor. Herhangi bir yardım??
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;

            }


        }

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

Yardımcı sınıf

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

    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
Muhtemelen biraz açıklamalısınız, bir kod kütlesi açıklama olmadan bir cevap kadar büyük değildir.
Aaron Hall

Bu çözümü kullandım. Ancak bu çözüm iyi değil. Listem 10 öğe var, ancak 9.5 veya 9 öğe görüntülüyor.
Hai Rom

1

En iyi çözüm RecedlerView ile NestedScrollVew kullanmaktır ya da Listview ile gitmek istiyorsanız buna üstbilgi ve altbilgi görünümü ekleyebilirsiniz. Örneğin:

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

1

Denedim ve neredeyse belirtilen tüm yöntemleri test, güven bana, tamamen RecyclerView kaçtıktan sonra, benim ListView RecyclerView ile değiştirildi ve mükemmel çalıştı. ExtendedHeightListView ve hepsi için herhangi bir 3. Parti kütüphaneye gerek yoktu, sadece düz ve basit RecyclerView.

Yani heryc Yerleşim dosyamı recyclerView'dan önce

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

BU, LISTVIEW'IMI YUKARIDA DAHİL OLAN ÇOK ÇÖZÜMDEN BİRİ İLE DEĞİŞTİRMEDEN SONRA. Yani sorun android 2 scrollview hata (belki bir hata değil) nedeniyle listview düzgün davranmıyor olmasıydı.

Son düzenimi oluşturmak için geri dönüşüm görünümü ile değiştirdim.

Bu benim geri dönüşüm izleme adaptörüm:

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

Ve bu benim RecyclerView özel düzenim:

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

Ve VOILA, bir scollview içinde ListView (Şimdi RecyclerView) istenen etkisini aldım. Heres UI Nihai Görüntü

Son bir notta, genel uygulama kararlılığını geliştirdiği için RecyclerView'i değiştirmenin benim için daha iyi bir seçim olduğuna ve ayrıca RecyclerView'i daha iyi anlamama yardımcı olduğuna inanıyorum. Bir çözüm önermek istersem, ListView'ınızı bir RecyclerView ile değiştireceğim diyeceğim.


1

@Shailesh Rohit tarafından verilen yukarıdaki çözüm mükemmel çalışıyor. Bazı püf noktaları yapılmalıdır.

  1. Aynı sınıfı (ana sınıf) içine yardımcı sınıf koyuyorsanız, Helper sınıfını statik olarak yapın ve getListViewSize () statik olmamalıdır.

  2. En önemlisi, "Helper.getListViewSize (listView);" "listView.setAdapter (myAdapter);" gibi bağdaştırıcıyı ilk kez ayarladıktan sonra ifade; "myAdapter.notifyDataSetChanged ();"

  3. Kullanım aşağıda gösterilmiştir.

    listView = (ListView) findViewById (R.id.listView); myAdapter = yeni ArrayAdapter (bu, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (liste görünümü);

    ) (MyAdapter.notifyDataSetChanged; Helper.getListViewSizelistView (liste görünümü);


0

Eğer ebeveyn veya çocuk setOnTouchListener om kullanırken bana göre Çocuk üzerine dokunduğunuzda ebeveyn kaydırma, başka ebeveyn dokunduğunuzda çocuğun kaydırma durdurmak


0

ListView ile değil ScrollView ile deneyin.

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

kodu biçimlendirebilir misiniz ?? cevabı yarı
kolonlu

Genişletilmiş ScrollView'ınızla fazla bir şey yapmazsanız, noktalı virgül içeren satırlara bir şey yazmanız gerekmez. Yani onları kaldırın. Ve paket adınızı 'com.me' olarak düşünün, ardından XML düzeninde, '<ScrollView ...' yerine '<com.me.xScrollView ...' kullanın
Kim Sangdeuk

0

requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Bir çocuk bu ebeveynin ve atalarının onInterceptTouchEvent (MotionEvent) ile dokunma olaylarına müdahale etmesini istemediğinde çağrılır. Bu ebeveyn bu çağrıyı ebeveynlerine iletmelidir. Bu ebeveyn, dokunma süresi boyunca bu isteğe uymalıdır (yani, yalnızca bu ebeveyn bir yükseltme veya iptal aldıktan sonra bayrağı temizleyin.

Bu cevabı deneyin,

    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

ScrollView içinde ListView RecycleView ile değiştirin. ek kaynak kodu olmadan sorunsuz çalışır:

 <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

ScrollView içindeki ListView için NestedScrollView kullanın, bu işlevselliği çok kolay bir şekilde işleyebilir:

<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

Bu hatayı aldım.Ve benim çözüm şöyle:

1. Kaydırılamayan özel bir liste görünümü oluşturun

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. xml dosyası için yukarıdaki özel sınıfı kullanın

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

Sizin için en iyisini umuyoruz.


Bu ListView NestedScrollView içinde kaydırmak sağlar? Liste boyutuna göre Liste Görünümü'nü yeniden boyutlandırdığını düşünüyorum.
KJEjava48

3 düzey veya 4 düzey gibi çok düzeyli Genişletilebilir Liste için çalışmıyor. Herhangi bir yardım??
KJEjava48

0

Bunun için bir çözüm buldum , scrollview kullanmak yerine addHeaderview ve addFooterview listview

İşte snippet'im,

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

Artık liste görünümü ile mizanpajınız da kaydırılabilir. Tadını çıkar!!!


0

ScrollView yerine android.support.v4.widget.NestedScrollView öğesini xml içinde değiştirin. koşar

1) XML'de kullanın :::: android.support.v4.widget.NestedScrollView

onun yerine:::: ScrollView

2) Ve cs dosyasında NonScrollListView kullanarak liste görünümü için bu şekilde kullanın:

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) Son olarak cs dosyasındaki scrollview'i tanımlamak için bu kodu kullanın:

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

Bu ListView NestedScrollView içinde kaydırmak sağlar?
KJEjava48

3 düzey veya 4 düzey gibi çok düzeyli Genişletilebilir Liste için çalışmıyor. Herhangi bir yardım??
KJEjava48

0

En İyi Kod

<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

Bu yöntemi kullanın ve liste görünümünüz kaydırma görünümünde kaydırılabilir hale gelir: -

   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

Liste görünümü de aynı zamanda ve liste görünümü kaydırma ve kaydırma görünümü scoll arasında bir eşzamanlama sorunu olacağından kaydırma Görünümünde ListView ekleyemezsiniz. Bir Özel Liste Görünümü oluşturabilir ve bu yöntemi buna ekleyebilirsiniz.

@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

Kaydırma görünümü verme ListView, çünkü bu ayar varsayılan

<ListView
    android:cacheColorHint="#00000000"
    android:id="@+id/ListView01"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.