ListView bên trong ScrollView không cuộn trên Android


157

Tôi đang gặp rắc rối với một cuộn ListViewbên trong a ScrollView. Tôi có một Hoạt động có một số EditTexts ở phần trên cùng và sau đó là một máy chủ tab có hai tab có một ListView mỗi tab. Khi chế độ xem Chỉnh sửa được tập trung, bàn phím mềm sẽ xuất hiện và khi tôi có ScrollView, nội dung có thể cuộn được. Nhưng vấn đề xảy ra khi có nhiều mục hơn trong ListView (những mục trong tab), tôi không thể cuộn ListView, ngay cả khi có nhiều mục hơn.

Sau đây là bố cục 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>

Xin vui lòng bất cứ ai có thể cho tôi biết những gì vấn đề ở đây? Tôi có một bài viết khác về vấn đề ListView bên trong ScrollView, nhưng chúng không được sử dụng trong trường hợp của tôi.



Tôi nhận được một giải pháp: androidhub4you.com/2012/12/ Mạnh
Md Imran Choudhury

Câu trả lời:


175

Bạn không nên đặt ListViewbên trong ScrollViewListViewlớp thực hiện cuộn riêng và nó không nhận được cử chỉ vì tất cả đều được xử lý bởi phụ huynh ScrollView. Tôi thực sự khuyên bạn nên đơn giản hóa bố cục của bạn bằng cách nào đó. Ví dụ: bạn có thể thêm các chế độ xem bạn muốn được cuộn đến ListViewđầu trang hoặc chân trang.

CẬP NHẬT :

Bắt đầu từ các thùng chứa cuộn lồng nhau API cấp 21 (Lollipop) được Android SDK hỗ trợ chính thức. Có một loạt các phương thức trong ViewViewGroupcác lớp cung cấp chức năng này. Để làm cho hoạt động cuộn lồng nhau trên Lollipop, bạn phải kích hoạt nó cho chế độ xem cuộn con bằng cách thêm android:nestedScrollingEnabled="true"vào khai báo XML của nó hoặc bằng cách gọi rõ ràng setNestedScrollingEnabled(true).

Nếu bạn muốn làm cho công việc cuộn lồng nhau trên các thiết bị tiền Lollipop, điều mà bạn có thể làm, bạn phải sử dụng các lớp tiện ích tương ứng từ thư viện Hỗ trợ. Trước tiên, bạn phải thay thế bạn ScrollViewbằng NestedScrollView . Cái sau thực hiện cả NestedScrollingParentNestedScrollingChild để nó có thể được sử dụng như một thùng chứa cuộn cha hoặc con.

Nhưng ListViewkhông hỗ trợ cuộn lồng nhau, do đó bạn cần phải phân lớp nó và thực hiện NestedScrollingChild. May mắn thay, thư viện Hỗ trợ cung cấp lớp NestedScrollingChildHelper , vì vậy bạn chỉ cần tạo một thể hiện của lớp này và gọi các phương thức của nó từ các phương thức tương ứng của lớp xem của bạn.


Cảm ơn Pixie, nhưng bạn hẳn đã nhận thấy rằng tôi đang sử dụng một tabhost với hai tab mỗi tab chứa một listview riêng. Trong trường hợp này làm thế nào tôi có thể thêm tiêu đề hoặc chân trang?
Ashwani K

Vâng, đặt các tab vào ListViewsẽ là lạ. Nhưng bố cục của bạn rất rất phức tạp. Tôi thậm chí không thể hiểu bạn muốn nó trông như thế nào. Dù sao, tốt hơn hết là bạn nên làm cho nó đơn giản hơn vì một cái ListViewlồng vào ScrollViewcái khác được lồng vào cái khác ScrollViewtrông lạ và sẽ không hoạt động.
Michael

6
Có thể sử dụng listView bên trong scrollView. Vui lòng xem phần bên dưới Trả lời Clck tại đây
Atul Bhardwaj

2
listview tùy chỉnh bên trong scrollview stackoverflow.com/questions/18813296/ .
DedLocation HirenKumar

1
vâng, có thể lồng các khung nhìn có thể cuộn được, nhưng nó cũng chỉ ra rằng bố cục của bạn (và thiết kế UE) hơi phức tạp
suitianshi

304

Tôi tìm thấy một giải pháp hoạt động xuất sắc và có thể cuộn ListViewmà không gặp vấn đề gì:

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

Những gì nó làm là vô hiệu hóa các TouchEvents trên ScrollViewvà làm cho ListView chúng bị chặn. Nó là đơn giản và làm việc tất cả các thời gian.


Một vấn đề với điều này, nó hoạt động tốt mà không cần người nghe onitemclick, nếu tôi cũng muốn OnItemClickListener thì sao?
Hardik Joshi

Điều này hoạt động cho các khung nhìn danh sách lồng nhau và các khung nhìn danh sách có thể mở rộng là tốt. Nếu bạn có SwipeRefreshLaout, bạn sẽ gặp vấn đề khi cuộn toàn bộ. Một cách dễ dàng để xử lý điều đó cũng là lấy một thể hiện của SwipeRefreshLayout thông qua cha mẹ, sau đó vô hiệu hóa nó xuống và bật lại nó.
Kalel Wade

2
Xin chào @ Moisés Olmedo tôi đang cố gắng sử dụng cùng một phương thức nhưng nhận được chế độ xem Tùy chỉnh này, ListListList đã đặt trên OnTouchListener nhưng không ghi đè biểu diễnClick. Có cách nào để đối phó với điều này?
Aayushi

Điều này thật tuyệt - Tôi sử dụng nó để làm cho DragAndDropLinearLayout hoạt động bên trong scrollview - Tôi đặt trình nghe này để kéo trình xử lý và vô hiệu hóa cuộn xem của đoạn. Sự khác biệt duy nhất là tôi sẽ trả về false thay vì true để thực hiện thao tác kéo và thả.
Boris Treukhov

@ MoisésOlmedo Tôi đã theo dõi câu trả lời của bạn. Nó hoạt động hoàn hảo ở chế độ dọc, nhưng không ở chế độ ngang. Tôi có 11 mục trong danh sách. Tất cả chúng đều có thể nhìn thấy trong chân dung, nhưng trong phong cảnh chỉ nhận được 6. Danh sách không được cuộn.
năm15

141

Tôi cũng có một giải pháp. Tôi luôn luôn sử dụng phương pháp này. Thử cái này

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

Lớp 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
Đây phải là câu trả lời được chấp nhận. Mặc dù tất cả các giải pháp khác chỉ hoạt động khi các mục danh sách có cùng kích thước, giải pháp này vượt trội so với các mục khi danh sách có chiều cao thay đổi. Đã dành một vài giờ và cuối cùng tìm thấy điều này.
Khobaib

1
Đó là một câu trả lời hoàn hảo và nên được bình chọn là chấp nhận. hoạt động cho nhiều độ cao của hàng
iBabur

4
Scrollview chỉ có thể lưu trữ một đứa trẻ trực tiếp. Làm thế nào là có thể.
Pranav

8
Tôi tìm thấy một vấn đề lớn với giải pháp này. Nó đánh bại toàn bộ mục đích của danh sách xem. Về cơ bản, nó thực hiện tải tất cả các chế độ xem danh sách (không chỉ các chế độ hiển thị) và thay đổi chiều cao để nhấn chìm tất cả (giống như một LinearLayoutthay vì ListView. Điều này có nghĩa là nếu bạn có một số lượng lớn các mục danh sách (hoặc các mục danh sách phức tạp) sau đó các thiết bị Android sẽ mất rất nhiều thời gian để mở hoạt động (hoặc thậm chí gặp sự cố trong khi thử trong trường hợp của tôi).
reubenjohn

2
ý tưởng tồi tệ nhất từ ​​trước đến nay ... Bạn vừa tạo lại một tuyến tính rất đắt tiền :) - Romain Guy (kỹ sư google) ... giải pháp này chỉ dành cho những người không hiểu đầy đủ về ListView ... @reubenjohn bạn hoàn toàn đúng
Selvin

47

Bạn phải chỉ cần thay thế của bạn <ScrollView ></ScrollView>với điều này Custom ScrollViewnhư <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;
    }
}

@Aulul hoạt động tốt như vậy trên các thiết bị: Samsung captiavte i897, HTC Sensation, HTC Incredible, nhưng không hoạt động trên HTC Desire x, vấn đề có thể là gì?
pepela

@Atul nhưng đôi khi cuộn khi sử dụng 3 hoặc 4 ngón tay nhưng đôi khi.
pepela

@pepela bạn nói đúng. Đôi khi nó không mượt mà chỉ bằng một lần xem. Nhưng nó đáp ứng nhu cầu của chúng tôi.
Atul Bhardwaj

Nó có thể chặn tất cả các chuyển động khi cuộn listview lớn. đối với tôi, tôi sử dụng bản vá này: pristalovpavel.wordpress.com/2014/12/26/ trên
anil

11

Tôi đã có một vấn đề tương tự và trong khi googling tôi tìm thấy câu hỏi của bạn. Có đánh dấu câu trả lời làm việc cho tôi cũng có nhưng có một số vấn đề.
Dù sao tôi đã tìm thấy một giải pháp khác . mà hoạt động hoàn hảo mà không làm bất kỳ tung hứng.


4
Xin vui lòng gửi câu trả lời trên SO, không chỉ liên kết đến trang web bên ngoài.
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;
    }
});

một vấn đề nhỏ với điều này là tôi muốn tiếp tục cuộn scrollview khi listview đến cuối trong khi chạm vào nó.
Badr

6

Đây là phương pháp chính xác để sử dụng Listview trong Scrollview. Tất cả chúng ta phải xử lý các sự kiện chạm.

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

có lỗi khi vùng cuộn ra khỏi vùng cảm ứng
ademar111190

6

Sử dụng phương pháp sau và tận hưởng!

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 là một giá trị số nguyên toàn cầu. Nếu bạn có thể thay thế dòng

list.scrollBy(0, 1);

với một cái gì đó khác xin vui lòng chia sẻ nó với chúng tôi.

Thưởng thức!


Rất gần. Nó vẫn không hoạt động trong nhiều lần, nhưng ít nhất nó hoạt động trong một vài lần.
erdomester

2
Nó hoạt động nhưng vấn đề là với tốc độ của cuộn. Nó rất lag.
sumit pandey

4

Đó là một thực tế xấu để có hai quan điểm cuộn khác nhau với nhau. Bản thân ListView có chức năng cuộn riêng và chiều cao được điều chỉnh tự động theo cài đặt Bộ điều hợp cho các mục hàng của bạn (Xin lưu ý, chúng tôi không đặt chiều cao cụ thể cho ListView trong xml Bố cục của chúng tôi). Tuy nhiên, trong trường hợp của bạn, bạn có thể thay thế ListView bằng một lớp và điều này sẽ điều chỉnh độ cao cho ListView của bạn lưu ý rằng ListView của bạn nằm trong ScrollView.

Điều này sẽ giúp bạn:

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

Bây giờ hãy mở rộng ListView của bạn với lớp này, chỉ cần thay đổi thẻ ListView của bạn từ xml tài nguyên của bạn thành dễ chịu như thế này,

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

Điều này sẽ giải quyết vấn đề cuộn của bạn về ListView, vì bây giờ việc cuộn cha được quản lý bởi ScrollView thay vì ListView.


Điều này có cho phép ListView cuộn bên trong NestedScrollView không ??
KJEjava48

Vâng, nó sẽ cho phép. Như thông qua giải pháp này, các thuộc tính cuộn listview sẽ bị vô hiệu hóa và scrollview cha sẽ chịu trách nhiệm cuộn các nội dung listview. Hy vọng nó giúp.
Ravi Kabra

4

Tôi biết câu hỏi này đã được hỏi từ lâu, nhưng ai đã từng bị mắc kẹt bây giờ có thể giải quyết vấn đề này bằng cách thêm dòng này vào ListView của bạn

android:nestedScrollingEnabled="true"

Ví dụ -

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

3

Tôi đã gặp vấn đề tương tự và được giải quyết bằng cách tạo lớp tùy chỉnh bằng cách mở rộng với 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);
    }
}

Sử dụng:

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

UIHaq Điều này có cho phép ListView cuộn bên trong NestedScrollView không ??
KJEjava48

1
Nó không hoạt động cho ExpandableListview đa cấp như 3 cấp hoặc 4 cấp. Có ai giúp không ??
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_ad CHƯƠNG

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

        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;

            }


        }

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

Lớp người trợ giúp

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

    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
Có lẽ bạn nên giải thích một chút, một khối mã không tuyệt vời như một câu trả lời mà không có lời giải thích.
Aaron Hall

Tôi đã sử dụng giải pháp này. Nhưng giải pháp này không tốt. Becuz danh sách của tôi có 10 mục, nhưng nó hiển thị 9,5 hoặc 9 mục.
Hai Rom

1

Giải pháp tốt nhất là sử dụng NestedScrollVew với RecyclerView hoặc nếu bạn muốn đi với Listview thì bạn có thể thêm chế độ xem tiêu đề và chân trang vào đây. Ví dụ:

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

1

Tôi đã thử và thử nghiệm gần như tất cả các phương pháp được đề cập ở trên, tin tưởng tôi, sau khi chạy hoàn toàn khỏi RecyclerView, tôi đã thay thế ListView của mình bằng RecyclerView và nó hoạt động hoàn hảo. Không cần bất kỳ thư viện bên thứ 3 nào cho ExtendedHeightListView và tất cả, chỉ cần RecyclerView đơn giản và đơn giản.

Vì vậy, đây là tệp Bố cục của tôi trước khi tái chế:

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

ĐÂY LÀ SAU KHI THAY ĐỔI DANH SÁCH CỦA TÔI VỚI MỘT TRONG NHIỀU GIẢI PHÁP ĐƯỢC GỬI TRÊN. Vì vậy, vấn đề là listview không hoạt động đúng do 2 lỗi scrollview (có thể không phải là lỗi) trong Android.

Tôi đã thay thế khung nhìn với trình tái chế để tạo thành bố cục cuối cùng của tôi.

Đây là bộ chuyển đổi xem tái chế của tôi:

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

Và đây là bố cục tùy chỉnh RecyclerView của tôi:

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

Và VOILA, tôi đã nhận được hiệu ứng mong muốn của ListView (Now RecyclerView) trong một scollview. Đây là hình ảnh cuối cùng của giao diện người dùng

Lưu ý cuối cùng, tôi tin rằng việc thay thế RecyclerView là lựa chọn tốt hơn đối với tôi, vì nó đã cải thiện tính ổn định của ứng dụng nói chung và cũng giúp tôi hiểu rõ hơn về RecyclerView. Nếu tôi muốn đề xuất một giải pháp, tôi sẽ nói thay thế ListView của bạn bằng RecyclerView.


1

Giải pháp trên được đưa ra bởi @Shailesh Rohit hoạt động hoàn toàn tốt. Một số thủ thuật phải được thực hiện.

  1. Nếu bạn đang đặt lớp trình trợ giúp bên trong cùng một lớp (lớp chính) thì hãy tạo lớp Trình trợ giúp dưới dạng tĩnh và getListViewSize () không tĩnh.

  2. Quan trọng nhất, hãy viết "Helper.getListViewSize (listView);" câu lệnh sau khi cài đặt bộ điều hợp lần đầu tiên như "listView.setAd CHƯƠNG (myAd CHƯƠNG);" cũng như khi nào bạn đang sử dụng "myAd CHƯƠNG.notifyDataSetChanged ();"

  3. Cách sử dụng được hiển thị dưới đây.

    listView = (ListView) findViewById (R.id.listView); myAd CHƯƠNG = new ArrayAd CHƯƠNG (this, android.R.layout.simple_list_item_1, listValues); listView .setAd CHƯƠNG (myAd CHƯƠNG); Helper.getListViewSizelistView (listView);

    myAd CHƯƠNG.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);


0

Theo tôi, trong khi bạn đang sử dụng setOnTouchListener, cha mẹ hoặc con dừng cuộn di chuyển của cha mẹ khi bạn chạm vào con khác, hãy dừng việc di chuyển con khi bạn chạm vào cha mẹ


0

Hãy thử điều này với ScrollView, không phải với ListView.

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

bạn có thể định dạng mã ?? câu trả lời có dòng trống với dấu chấm phẩy và không có bình luận
Tejus Prasad

Nếu bạn không làm gì nhiều với ScrollView mở rộng của mình, bạn không cần phải viết một cái gì đó trong các dòng có dấu hai chấm. Vì vậy, chỉ cần loại bỏ chúng. Và giả sử tên gói của bạn 'com.me', sau đó trong bố cục XML, hãy sử dụng '<com.me.xScrollView ...' thay vì '<ScrollView ...'
Kim Sangdeuk

0

requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Được gọi khi một đứa trẻ không muốn cha mẹ này và tổ tiên của nó chặn các sự kiện chạm bằng onInterceptTouchEvent (MotionEvent). Cha mẹ này nên truyền cuộc gọi này cho cha mẹ của nó. Phụ huynh này phải tuân theo yêu cầu này trong suốt thời gian chạm (nghĩa là chỉ xóa cờ sau khi phụ huynh này đã nhận được hoặc hủy bỏ.

Hãy thử câu trả lời này,

    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

thay thế ListView bằng RecyclView bên trong ScrollView. nó chạy trơn tru mà không cần mã nguồn bổ sung:

 <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

Đối với ListView bên trong ScrollView, hãy sử dụng NestedScrollView, nó có thể xử lý chức năng này rất dễ dàng:

<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

Tôi đã có lỗi này. Và giải pháp của tôi là như sau:

1. Tạo một listview tùy chỉnh không thể cuộ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();    
}

}

2. Sử dụng lớp tùy chỉnh ở trên cho tệp xml

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

Hy vọng tốt nhất cho bạn.


Điều này có cho phép ListView cuộn bên trong NestedScrollView không ?? Tôi nghĩ rằng nó thay đổi kích thước Listview theo kích thước mục.
KJEjava48

Nó không hoạt động cho ExpandableListview đa cấp như 3 cấp hoặc 4 cấp. Có ai giúp không ??
KJEjava48

0

Tôi đã tìm thấy một giải pháp cho điều đó, Thay vì sử dụng scrollview, Bạn có thể sử dụng addHeaderview và addFooterview của listview

Đây là đoạn trích của tôi,

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

Bây giờ, với listview, bố cục của bạn cũng có thể được cuộn. Tận hưởng đi !!!


0

Thay thế ScrollView bằng android.support.v4.widget.NestedScrollView bên trong xml. nó chạy

1) Sử dụng trong XML :::: android.support.v4.widget.NestedScrollView

thay vì:::: ScrollView

2) Và sử dụng để xem danh sách theo cách này bằng cách sử dụng NonScrollListView trong tệp cs:

public class NonScrollListView extends ListView {    

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

3) Cuối cùng sử dụng mã này để xác định scrollview trong tệp cs:

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

Điều này có cho phép ListView cuộn bên trong NestedScrollView không ??
KJEjava48

Nó không hoạt động cho ExpandableListview đa cấp như 3 cấp hoặc 4 cấp. Có ai giúp không ??
KJEjava48

0

Mã tốt nhất

<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

Sử dụng phương pháp này và listview của bạn trở nên có thể cuộn bên trong scrollview: -

   ListView lstNewsOffer.setAdapter(new ViewOfferAdapter(
                            ViewNewsDetail.this, viewOfferList));
                    getListViewSize(lstNewsOffer);

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

-1

Bạn không thể thêm ListView trong Chế độ xem cuộn, vì chế độ xem danh sách cũng có các điểm khác nhau và sẽ có một vấn đề đồng bộ hóa giữa cuộn listview và scoll xem cuộn. Bạn có thể tạo Chế độ xem CustomList và thêm phương thức này vào đó.

@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

Không cho chế độ xem cuộn ListView, vì nó có cài đặt mặc định

<ListView
    android:cacheColorHint="#00000000"
    android:id="@+id/ListView01"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.