ScrollView 내의 ListView가 Android에서 스크롤되지 않습니다.


157

ListView내부 스크롤에 문제가 ScrollView있습니다. 상단 부분에 EditText가있는 Activity가 있고 각각 하나의 ListView가있는 두 개의 탭이있는 탭 호스트가 있습니다. EditText보기에 초점이 맞춰지면 소프트 키보드가 나타나고 ScrollView가 있으면 내용을 스크롤 할 수 있습니다. 그러나 문제는 ListViews (탭에 하나)에 더 많은 항목이있을 때 더 많은 항목이 있어도 ListView를 스크롤 할 수없는 경우에 발생합니다.

다음은 레이아웃 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>

누구든지 문제가 무엇인지 말해 줄 수 있습니까? ScrollView 내부의 ListView에 다른 게시물이 있지만 내 경우에는 아무 소용이 없습니다.



나는 해결책을 얻는다 : androidhub4you.com/2012/12/…
Md Imran Choudhury

답변:


175

클래스는 자체 스크롤을 구현하고 부모가 모두 처리하기 때문에 제스처를받지 않기 때문에 ListView내부를 넣지 않아야합니다 . 어떻게 든 레이아웃을 단순화하는 것이 좋습니다. 예를 들어 스크롤하려는보기를 머리글 또는 바닥 글로 추가 할 수 있습니다 .ScrollViewListViewScrollViewListView

업데이트 :

API 레벨 21 (롤리팝)부터 중첩 된 스크롤 컨테이너는 Android SDK에서 공식적으로 지원됩니다. 이 기능을 제공 하는 많은 메소드 ViewViewGroup클래스가 있습니다. Lollipop에서 중첩 스크롤을 작동 시키려면 android:nestedScrollingEnabled="true"XML 선언 에 추가 하거나 명시 적으로 호출 하여 하위 스크롤보기에 대해 스크롤을 활성화해야합니다 setNestedScrollingEnabled(true).

롤리팝 이전 장치에서 중첩 스크롤 작업을하려면 지원 라이브러리에서 해당 유틸리티 클래스를 사용해야합니다. 첫째로 당신은 당신을 교체해야 ScrollViewNestedScrollView . 후자는 NestedScrollingParentNestedScrollingChild를 모두 구현 하므로 부모 또는 자식 스크롤 컨테이너로 사용할 수 있습니다.

그러나 ListView중첩 스크롤을 지원하지 않으므로 서브 클래 싱하고 구현해야합니다 NestedScrollingChild. 다행히 지원 라이브러리는 NestedScrollingChildHelper 클래스를 제공 하므로이 클래스의 인스턴스를 작성하고보기 클래스의 해당 메소드에서 해당 메소드를 호출하기 만하면됩니다.


감사합니다 Pixie, 그러나 당신은 각각 별도의 목록보기를 포함하는 두 개의 탭이있는 탭 호스트를 사용하고 있음을 알았을 것입니다. 이 경우 머리글이나 바닥 글을 어떻게 추가 할 수 있습니까?
Ashwani K

예, 탭을 넣는 ListView것은 이상합니다. 그러나 레이아웃은 매우 복잡합니다. 나는 당신이 원하는 것을 이해할 수조차 없습니다. 어쨌든 당신은 더 나은 때문에 간단하게 것 ListView에 중첩 된 ScrollView또 다른에 중첩되어있는 ScrollView이상한 모양과 작동하지 않습니다.
Michael

6
scrollView 내부에서 listView를 사용할 수 있습니다. 아래 답변을 참조하십시오 여기를 클릭하십시오
Atul Bhardwaj

2
있는 ScrollView의 내부 사용자 지정 목록보기 stackoverflow.com/questions/18813296/... .
Dedaniya HirenKumar

1
예, 스크롤 가능한 뷰를 중첩 할 수 있지만 레이아웃 (및 UE 디자인)이 약간 복잡하다는 것을 나타냅니다
suitianshi

304

나는 훌륭하게 작동하고 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;
        }
    });

이 명령을 주면 안 함입니다 TouchEvent온의 ScrollView와 만드는 ListView 절편을. 간단하고 항상 작동합니다.


OnItemClickListener를 원한다면 onitemclick 리스너없이 잘 작동합니다.
Hardik Joshi

중첩 목록보기 및 확장 가능한 목록보기에서도 작동합니다. SwipeRefreshLaout이있는 경우 맨 위로 스크롤 할 때 문제가 발생합니다. 이를 처리하는 쉬운 방법은 부모를 통해 SwipeRefreshLayout 인스턴스를 가져 와서 비활성화 한 다음 다시 활성화하는 것입니다.
Kalel Wade

2
안녕하세요 @ Moisés Olmedo 같은 방법을 사용하려고하지만이 사용자 정의보기를 가져 오기 HorizontalListView에 setOnTouchListener가 호출되었지만 performClick을 재정의하지는 않습니다. 이 문제를 해결할 방법이 있습니까?
Aayushi

이것은 훌륭합니다-DragAndDropLinearLayout이 scrollview 내에서 작동하도록 사용합니다. 핸들러를 드래그하고 프래그먼트의 scrollview를 비활성화하도록이 리스너를 설정했습니다. 유일한 차이점은 드래그 앤 드롭이 작동하도록 true 대신 false 를 반환한다는 것입니다 .
Boris Treukhov

@ MoisésOlmedo 나는 당신의 대답을 따랐습니다. 세로 모드에서는 완벽하게 작동하지만 가로 모드에서는 작동하지 않습니다. 나는 11 개의 아이템을 가지고있다. 모두 세로로 볼 수 있지만 가로로만 6이됩니다. 목록이 스크롤되지 않습니다.
Prabs

141

또한 하나의 솔루션이 있습니다. 나는 항상이 방법을 사용합니다. 이 시도

<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 클래스 :

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
이것이 정답입니다. 다른 모든 솔루션은 목록 항목의 크기가 동일한 경우에만 작동하지만이 솔루션은 목록 항목의 높이가 가변적 인 경우보다 우수합니다. 몇 시간을 보냈고 마침내 이것을 발견했습니다.
Khobaib

1
완벽한 답변이며 수락 된 것으로 투표해야합니다. 여러 높이의 행에 적용
iBabur

4
Scrollview는 하나의 직계 자식 만 호스팅 할 수 있습니다.
Pranav

8
이 솔루션에서 중요한 문제를 발견했습니다. 목록보기의 전체 목적을 무시합니다. 본질적으로 보이는 목록뿐만 아니라 모든 목록보기의로드를 수행하고 높이를 변경하여 모두를 덮습니다 (보다 LinearLayout오히려 비슷 합니다 ListView.) 목록 항목이 많거나 복잡한 목록 항목이있는 경우 그런 다음 안드로이드 장치는 활동을 여는 데 많은 시간이 걸릴 것입니다 (또는 제 경우에는 충돌 할 수도 있습니다)
reubenjohn

2
최악의 아이디어 ... 당신은 방금 매우 비싼 LinearLayout을 다시 만들었습니다 :) – Romain Guy (google engineer) ...이 솔루션은 ListView를 완전히 이해하지 못하는 멍청한 사람들만을위한 것입니다 ... @reubenjohn 당신은 절대적으로 맞습니다
Selvin

47

당신은 <ScrollView ></ScrollView>이것을 다음 Custom ScrollView과 같이 바꿔야합니다.<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;
    }
}

@이 기능은 장치에서 잘 작동합니다 : Samsung captiavte i897, HTC Sensation, HTC Incredible, 그러나 HTC Desire x에서는 작동하지 않습니다. 문제는 무엇입니까?
pepela

@Atul 그러나 때로는 3 개 또는 4 개의 손가락을 사용할 때 스크롤이됩니다.
pepela

@pepela 당신이 맞습니다. 때로는 하나의 스크롤보기만큼 부드럽 지 않습니다. 그러나 그것은 우리의 필요를 충족시킵니다.
Atul Bhardwaj

큰 목록보기를 스크롤하면 모든 동작을 가로 챌 수 있습니다. 나를 위해, 나는이 패치를 사용 : pristalovpavel.wordpress.com/2014/12/26/…
anil

11

나는 같은 문제가 있었고 인터넷 검색 중에 귀하의 질문을 발견했습니다. 예, 대답이 나에게도 효과가 있었지만 몇 가지 문제가있었습니다.
어쨌든 나는 다른 해결책을 찾았다 . 저글링없이 완벽하게 작동합니다.


4
외부 사이트로 연결되는 것이 아니라 SO에 답변을 게시하십시오.
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;
    }
});

이것에 대한 약간의 문제는 목록보기가 끝에 도달했을 때 스크롤보기를 계속 스크롤하고 싶다는 것입니다.
Badr

6

Scrollview에서 Listview를 사용하는 정확한 방법은 다음과 같습니다. 터치 이벤트 만 처리하면됩니다.

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

스크롤 영역이 터치 영역을 벗어 났을 때 버그가 발생했습니다
ademar111190

6

다음 방법을 사용하여 즐기십시오!

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은 전역 정수 값입니다. 라인을 교체 할 수 있다면

list.scrollBy(0, 1);

다른 것과 함께 우리와 공유하십시오.

즐겨!


아주 근접한. 여전히 여러 번 작동하지 않지만 최소한 몇 번만 작동합니다.
erdomester

2
작동하지만 문제는 스크롤 속도에 있습니다. 매우 게으르다.
sumit pandey

4

두 개의 서로 다른 스크롤보기를 함께 갖는 것은 좋지 않습니다. ListView 자체에는 자체 스크롤 기능이 있으며 행 항목의 어댑터 설정에 따라 높이가 자동으로 조정됩니다 (레이아웃 XML에서 특정 높이를 ListView로 설정하지 않음을 명심하십시오). 그러나 귀하의 경우 ListView를 클래스로 바꿀 수 있으며 이는 ListView가 ScrollView 내에 있음을 염두에두고 ListView의 높이를 조정합니다.

이것은 당신을 도울 것입니다 :

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

이제이 클래스를 사용하여 ListView를 확장하고 리소스 XML에서 이와 같은 스모킹으로 ListView 태그를 변경하십시오.

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

이것은 부모 스크롤이 ListView가 아닌 ​​ScrollView에 의해 관리되므로 ListView의 스크롤 문제를 해결합니다.


이것은 ListView가 NestedScrollView 내부에서 스크롤되도록 허용합니까 ??
KJEjava48

그렇습니다. 이 솔루션을 통해 목록보기 스크롤 속성이 비활성화되고 부모 스크롤보기가 목록보기 내용을 스크롤해야합니다. 도움이 되길 바랍니다.
라비 카브라

4

나는이 질문이 오래 전에 요청되었다는 것을 알고 있지만, 지금 막 붙어있는 사람은이 줄을 ListView에 추가 하여이 문제를 해결할 수 있습니다.

android:nestedScrollingEnabled="true"

예를 들어-

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

3

비슷한 문제가 있고 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);
    }
}

용법:

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

UIHaq 이것은 ListView가 NestedScrollView 내부에서 스크롤되도록 허용합니까 ??
KJEjava48

1
3 레벨 또는 4 레벨과 같은 다중 레벨 ExpandableListview에서는 작동하지 않습니다. 어떤 도움?
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;

            }


        }

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

도우미 클래스

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

    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
당신은 아마 조금 설명해야 할 것입니다. 대량의 코드는 설명이없는 대답만큼 좋지 않습니다.
Aaron Hall

이 솔루션에 익숙했습니다. 그러나이 솔루션은 좋지 않습니다. Becuz 내 목록에는 10 개의 항목이 있지만 9.5 또는 9 개의 항목이 표시됩니다.
Hai Rom

1

가장 좋은 해결책은 NestedScrollVew를 RecyclerView와 함께 사용하거나 Listview와 함께 사용하려는 경우 여기에 머리글 및 바닥 글보기를 추가하는 것입니다. 예를 들면 다음과 같습니다.

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

1

나는 위에서 언급 한 거의 모든 방법을 시도하고 테스트했으며, RecyclerView에서 완전히 도망 간 후에 ListView를 RecyclerView로 바꾸었고 완벽하게 작동했습니다. ExtendedHeightListView 및 일반 및 간단한 RecyclerView에 대한 타사 라이브러리가 필요하지 않았습니다.

그래서 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>

이것은 위에서 언급 한 여러 솔루션 중 하나로 내 목록을 교체 한 후입니다. 따라서 문제는 안드로이드에서 2 개의 scrollview 버그 (버그가 아닐 수도 있음)로 인해 listview가 올바르게 작동하지 않는다는 것입니다.

최종 레이아웃을 형성하기 위해 재활용 뷰로 바꿨습니다.

이것은 내 재활용 뷰 어댑터입니다.

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

그리고 이것은 내 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>

그리고 VOILA, 나는 scollview 내에서 ListView (Now RecyclerView)의 원하는 효과를 얻었습니다. 다음은 UI의 최종 이미지입니다.

마지막으로, 전체 앱 안정성을 개선하고 RecyclerView를 더 잘 이해하는 데 도움이 되었기 때문에 RecyclerView를 교체하는 것이 나에게 더 나은 선택이라고 생각합니다. 해결책을 제안하려면 ListView를 RecyclerView로 바꾸십시오.


1

@Shailesh Rohit가 제공 한 위의 솔루션은 완벽하게 작동합니다. 몇 가지 트릭을 수행해야합니다.

  1. 헬퍼 클래스를 동일한 클래스 (주 클래스)에 넣으면 헬퍼 클래스를 정적으로 만들고 getListViewSize ()를 정적으로하지 마십시오.

  2. 가장 중요한 것은 "Helper.getListViewSize (listView);"를 작성하십시오. "listView.setAdapter (myAdapter);"와 같이 처음으로 어댑터를 설정 한 후의 명령문 "myAdapter.notifyDataSetChanged ();"를 사용하는 경우

  3. 사용법은 아래와 같습니다.

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

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


0

부모님이나 자녀가 setOnTouchListener를 사용하는 동안 나에게 따르면 부모를 터치하면 부모의 스크롤을 중지하고 부모를 터치하면 자식의 스크롤을 중지합니다


0

ListView가 아니라 ScrollView로 시도하십시오.

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

코드를 포맷 할 수 있습니까 ?? 대답은 세미콜론으로 빈 줄이 있고 주석은 없습니다
Tejus Prasad

확장 된 ScrollView로 많은 작업을 수행하지 않으면 세미콜론으로 줄에 무언가를 쓸 필요가 없습니다. 따라서 제거하십시오. 패키지 이름 'com.me'을 가정 한 다음 레이아웃 XML에서 '<ScrollView ...'대신 '<com.me.xScrollView ...'를 사용하십시오.
Kim Sangdeuk

0

requestDisallowInterceptTouchEvent (부울 disallowIntercept)

자식이이 부모와 그 조상이 onInterceptTouchEvent (MotionEvent)로 터치 이벤트를 가로 채기를 원하지 않을 때 호출됩니다. 이 부모는이 요청을 부모에게 전달해야합니다. 이 부모는 터치가 지속되는 동안이 요청을 준수해야합니다. 즉,이 부모가 위로 또는 취소를받은 후에 만 ​​플래그를 지우십시오.

이 대답을 시도하십시오.

    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 내에서 ListView를 RecycleView로 바꿉니다. 추가 소스 코드없이 원활하게 실행됩니다.

 <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 내부의 ListView의 경우 NestedScrollView를 사용하면이 기능을 매우 쉽게 처리 할 수 ​​있습니다.

<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

이 오류가 발생했으며 솔루션은 다음과 같습니다.

1. 스크롤 할 수없는 사용자 정의 목록보기를 작성하십시오.

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 파일에 위의 사용자 정의 클래스를 사용하십시오.

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

당신을 위해 최선을 다하겠습니다.


이것은 ListView가 NestedScrollView 내부에서 스크롤되도록 허용합니까 ?? 항목 크기에 따라 Listview의 크기가 조정된다고 생각합니다.
KJEjava48

3 레벨 또는 4 레벨과 같은 다중 레벨 ExpandableListview에서는 작동하지 않습니다. 어떤 도움?
KJEjava48

0

나는 그에 대한 해결책을 발견 하는 대신있는 ScrollView를 사용, 당신은 목록보기의 addHeaderview 및 addFooterview을 사용할 수 있습니다

여기 내 스 니펫이 있습니다.

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

이제 목록보기로 레이아웃을 스크롤 할 수도 있습니다. 즐기세요 !!!


0

xml 내에서 ScrollView를 android.support.v4.widget.NestedScrollView로 바꿉니다. 그것은 작동한다

1) XML에서 사용 :::: android.support.v4.widget.NestedScrollView

대신에:::: ScrollView

2) CSS 파일의 NonScrollListView를 사용하여 이런 방식으로 목록보기에 사용하십시오.

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) 마지막 으로이 코드를 사용하여 CSS 파일에서 스크롤보기를 식별하십시오.

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

이것은 ListView가 NestedScrollView 내부에서 스크롤되도록 허용합니까 ??
KJEjava48

3 레벨 또는 4 레벨과 같은 다중 레벨 ExpandableListview에서는 작동하지 않습니다. 어떤 도움?
KJEjava48

0

최고의 코드

<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

이 방법을 사용하면 목록보기가 스크롤보기 내에서 스크롤 가능하게됩니다.

   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

목록보기도 scolls하고 목록보기 스크롤과 스크롤보기 scoll간에 동기화 문제가 있으므로 스크롤보기에 ListView를 추가 할 수 없습니다. CustomList View를 작성하고이 메소드를 추가 할 수 있습니다.

@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

에 스크롤보기를 제공하지 ListView마십시오.

<ListView
    android:cacheColorHint="#00000000"
    android:id="@+id/ListView01"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.