ListView ข้างใน ScrollView ไม่ได้เลื่อนบน Android


157

ฉันกำลังมีปัญหากับการเลื่อนภายในListView ScrollViewฉันมีกิจกรรมที่มี EditTexts บางส่วนในส่วนบนสุดแล้วโฮสต์แท็บที่มีสองแท็บที่มีหนึ่ง 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>

ใครช่วยบอกฉันทีว่าปัญหาคืออะไรที่นี่? ฉันมีอีกโพสต์เกี่ยวกับปัญหา ListView ภายใน ScrollView แต่พวกเขาไม่ได้ใช้ในกรณีของฉัน



ฉันได้รับการแก้ไข: androidhub4you.com/2012/12/4
Md Imran Choudhury

คำตอบ:


175

คุณไม่ควรใส่ListViewภายในScrollViewเพราะการดำเนินการระดับการเลื่อนตัวของมันเองและมันก็ไม่ได้รับท่าทางเพราะพวกเขาทั้งหมดจะถูกจัดการโดยผู้ปกครองListView ScrollViewฉันขอแนะนำให้คุณทำให้เค้าโครงของคุณง่ายขึ้น ตัวอย่างเช่นคุณสามารถเพิ่มมุมมองที่คุณต้องการเลื่อนไปที่ListViewส่วนหัวหรือส่วนท้าย

อัปเดต :

เริ่มต้นจาก API ระดับ 21 (Lollipop) คอนเทนเนอร์เลื่อนแบบซ้อนได้รับการสนับสนุนอย่างเป็นทางการโดย Android SDK มีหลายวิธีในViewและViewGroupชั้นเรียนที่มีฟังก์ชั่นนี้ เพื่อให้การทำงานเลื่อนซ้อนกันบนอมยิ้มคุณต้องเปิดการใช้งานสำหรับมุมมองของเด็กเลื่อนโดยการเพิ่มandroid:nestedScrollingEnabled="true"การประกาศ XML setNestedScrollingEnabled(true)หรือโดยการโทรอย่างชัดเจน

หากคุณต้องการให้การเลื่อนแบบซ้อนทำงานบนอุปกรณ์ pre-Lollipop ซึ่งคุณอาจทำคุณต้องใช้คลาสยูทิลิตี้ที่เกี่ยวข้องจากไลบรารีการสนับสนุน แรกที่คุณต้องทดแทนคุณScrollViewด้วยNestedScrollView หลังดำเนินทั้งNestedScrollingParentและNestedScrollingChildเพื่อให้สามารถใช้เป็นผู้ปกครองหรือภาชนะเลื่อนเด็ก

แต่ListViewไม่สนับสนุนการเลื่อนซ้อนกันดังนั้นคุณจำเป็นต้อง subclass NestedScrollingChildมันและดำเนินการ โชคดีที่ไลบรารีการสนับสนุนมีคลาสNestedScrollingChildHelperดังนั้นคุณเพียงแค่ต้องสร้างอินสแตนซ์ของคลาสนี้และเรียกใช้เมธอดจากเมธอดที่สอดคล้องกันของคลาสมุมมองของคุณ


ขอบคุณ Pixie แต่คุณต้องสังเกตุว่าฉันใช้ Tabhost กับสองแท็บแต่ละอันมี listview แยกต่างหาก ในกรณีนี้ฉันจะเพิ่มหัวกระดาษหรือท้ายกระดาษได้อย่างไร
Ashwani K

ใช่การใส่แท็บลงไปListViewจะแปลก แต่เลย์เอาต์ของคุณซับซ้อนมาก ฉันไม่สามารถเข้าใจสิ่งที่คุณต้องการให้ดูเหมือน อย่างไรก็ตามคุณควรทำให้มันง่ายขึ้นเพราะการListViewซ้อนกันในScrollViewที่ซ้อนอยู่ในที่อื่นScrollViewดูแปลกและจะไม่ทำงาน
Michael

6
เป็นไปได้ที่จะใช้ listView ภายใน scrollView กรุณาดูคำตอบด้านล่าง Clck ที่นี่
Atul Bhardwaj

2
ListView กำหนดเองภายใน 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;
        }
    });

สิ่งนี้จะปิดการใช้งานTouchEvents บนScrollViewและทำให้การListView สกัดกั้นพวกเขา มันง่ายและใช้งานได้ตลอดเวลา


ปัญหาหนึ่งเกี่ยวกับเรื่องนี้มันทำงานได้ดีโดยไม่ต้องฟัง onitemclick ถ้าฉันต้องการยัง OnItemClickListener แล้ว?
Hardik Joshi

วิธีนี้ใช้สำหรับมุมมองรายการแบบซ้อนและมุมมองรายการแบบขยายได้เช่นกัน หากคุณมี SwipeRefreshLaout คุณจะมีปัญหาเมื่อเลื่อนขึ้นจนสุด วิธีที่ง่ายในการจัดการเช่นกันคือรับอินสแตนซ์ของ SwipeRefreshLayout ผ่านผู้ปกครองจากนั้นปิดใช้งานมันลงและเปิดใช้งานอีกครั้ง
Kalel Wade

2
Hello @ Moisés Olmedo ฉันพยายามใช้วิธีการเดียวกัน แต่รับมุมมองที่กำหนดเองนี้ HorizontalListView ได้เรียกใช้ setOnTouchListener แต่ไม่ได้แทนที่ performClick มีวิธีจัดการกับเรื่องนี้หรือไม่?
Aayushi

นี่ยอดเยี่ยม - ฉันใช้เพื่อทำให้ DragAndDropLinearLayout ทำงานใน scrollview - ฉันตั้งค่า listener นี้ให้ลาก handler และปิด scrollview ของส่วน ข้อแตกต่างคือฉันจะกลับเท็จแทนที่จะเป็นจริงเพื่อให้การลากและวางทำงาน
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
นี่ควรเป็นคำตอบที่ยอมรับได้ ในขณะที่โซลูชันอื่นทั้งหมดใช้งานได้เมื่อ list-items มีขนาดเท่ากัน แต่โซลูชันนี้มีความโดดเด่นเมื่อ list-items มีความสูงของตัวแปร ใช้เวลาหลายชั่วโมงและในที่สุดก็พบสิ่งนี้
Khobaib

1
มันเป็นคำตอบที่สมบูรณ์แบบและควรได้รับการโหวตว่ายอมรับ ใช้ได้กับหลายแถวสูง
iBabur

4
Scrollview สามารถโฮสต์เด็กตรงได้เพียงคนเดียวเท่านั้นมันเป็นไปได้อย่างไร
Pranav

8
ฉันพบปัญหาสำคัญกับวิธีแก้ไขปัญหานี้ มันเอาชนะวัตถุประสงค์ทั้งหมดของมุมมองรายการ มันจะทำการโหลดของมุมมองรายการทั้งหมด (ไม่ใช่เฉพาะมุมมองที่มองเห็น) และเปลี่ยนความสูงเพื่อทำให้ครอบคลุมทั้งหมด (มากกว่าเช่นLinearLayoutมากกว่า a ListView) ซึ่งหมายความว่าหากคุณมีรายการในรายการจำนวนมาก (หรือรายการที่ซับซ้อน) แล้วอุปกรณ์หุ่นยนต์จะใช้เวลามากเวลาที่จะเปิดกิจกรรม (หรือแม้กระทั่งความผิดพลาดในขณะที่พยายามในกรณีของฉัน).
reubenjohn

2
ความคิดที่เลวร้ายที่สุดเท่าที่เคยมีมา ... คุณเพิ่งสร้าง LinearLayout ที่มีราคาแพงมาก :) - Romain Guy (วิศวกร google) ... วิธีนี้ใช้สำหรับผู้ที่ไม่เข้าใจ 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;
    }
}

@Atul นี้ทำงานได้ดีบนอุปกรณ์: Samsung captiavte i897, HTC Sensation, HTC Incredible แต่ใช้ไม่ได้กับ HTC Desire x สิ่งที่อาจเป็นปัญหาหรือไม่
pepela

@Atul แต่เลื่อนบางครั้งเมื่อใช้ 3 หรือ 4 นิ้ว แต่บางครั้ง
pepela

@pela คุณพูดถูกบางครั้งมันดูไม่ลื่นเท่ามุมมองเลื่อนเดียว แต่มันสนองความต้องการของเรา
Atul Bhardwaj

มันสามารถสกัดกั้นการเคลื่อนไหวทั้งหมดเมื่อเลื่อนดูรายการขนาดใหญ่ สำหรับฉันฉันใช้แพทช์นี้: pristalovpavel.wordpress.com/2014/12/26/…
anil

11

ฉันมีปัญหาเดียวกันและในขณะที่ googling ฉันพบคำถามของคุณ ใช่คำตอบที่ทำเครื่องหมายไว้สำหรับฉันด้วย แต่ก็มีปัญหาบางอย่าง
ยังไงก็ตามผมพบอีกวิธีการแก้ปัญหา ซึ่งทำงานได้อย่างสมบูรณ์แบบโดยไม่ทำ jugglery


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

ปัญหาเล็กน้อยเกี่ยวกับเรื่องนี้คือฉันต้องการเลื่อน scrollview ต่อไปเมื่อ listview ถึงจุดสิ้นสุดในขณะที่แตะ
Badr

6

นี่คือวิธีที่แน่นอนในการใช้ Listview กับใน Scrollview ทั้งหมดที่เราต้องจัดการเหตุการณ์สัมผัส

      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 นั้นมีฟังก์ชั่นการเลื่อนของตัวเองและความสูงจะปรับอัตโนมัติตามการตั้งค่าอะแดปเตอร์สำหรับรายการแถวของคุณ อย่างไรก็ตามในกรณีของคุณคุณสามารถแทนที่ ListView ด้วยคลาสและสิ่งนี้จะปรับความสูงสำหรับ ListView ของคุณโดยคำนึงว่า ListView ของคุณอยู่ใน ScrollView

สิ่งนี้จะช่วยคุณ:

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 ของคุณด้วยคลาสนี้เพียงแค่เปลี่ยนแท็ก ListView ของคุณจากทรัพยากร xml ของคุณไปเป็นแบบนี้

<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

ใช่มันจะช่วยให้ เช่นเดียวกับวิธีแก้ปัญหานี้คุณสมบัติการเลื่อนรายการ listview จะถูกปิดใช้งานและ parent scrollview จะรับผิดชอบในการเลื่อนเนื้อหา listview หวังว่ามันจะช่วย
Ravi Kabra

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
มันไม่ทำงานสำหรับหลายระดับ ExpandableListview เช่น 3 ระดับหรือ 4 ระดับ ความช่วยเหลือใด ๆ ??
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

ฉันใช้วิธีนี้ แต่วิธีนี้ไม่ดี รายการของฉันมี 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>

นี่คือหลังจากเปลี่ยนรายการของฉันกับหนึ่งในโซลูชั่นที่กล่าวข้างต้นมากมาย ดังนั้นปัญหาคือ listview นั้นทำงานไม่ถูกต้องเนื่องจากมี 2 bug scrollview bug (อาจไม่ใช่ bug) ใน android

ฉันแทนที่ด้วย recycler view เป็น form form สุดท้ายของฉัน

นี่คืออะแดปเตอร์มุมมองรีไซเคิลของฉัน:

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 ฉันได้รับผลที่ต้องการของ ListView (ตอนนี้ RecyclerView) ภายใน scollview นี่คือภาพสุดท้ายของ UI

ในหมายเหตุสุดท้ายฉันเชื่อว่าการเปลี่ยน RecyclerView เป็นตัวเลือกที่ดีกว่าสำหรับฉันเพราะมันปรับปรุงเสถียรภาพของแอพโดยรวมและช่วยให้ฉันเข้าใจ RecyclerView ได้ดีขึ้น ถ้าฉันจะแนะนำวิธีแก้ปัญหาฉันจะพูดว่าแทนที่ ListView ของคุณด้วย RecyclerView


1

วิธีการแก้ปัญหาข้างต้นโดย @Shailesh Rohit ทำงานได้อย่างสมบูรณ์แบบ เทคนิคบางอย่างจะต้องทำ

  1. หากคุณกำลังใส่คลาสตัวช่วยภายในคลาสเดียวกัน (คลาสหลัก) ให้คลาส Helper เป็นแบบสแตติกและ getListViewSize () ไม่เป็นแบบสแตติก

  2. สำคัญที่สุดเขียน "Helper.getListViewSize (listView);" คำสั่งหลังจากการตั้งค่าการ์ดเชื่อมต่อเป็นครั้งแรกเช่น "listView.setAdapter (myAdapter);" เช่นเดียวกับเมื่อคุณใช้ "myAdapter.notifyDataSetChanged ();"

  3. การใช้งานที่แสดงด้านล่าง

    listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (นี่คือ android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (ListView);

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


0

ตามที่ฉันในขณะที่คุณใช้ setOnTouchListener อ้อมพ่อแม่หรือลูกหยุดการเลื่อนของแม่ในขณะที่คุณสัมผัสกับเด็กอื่นหยุดเลื่อนเด็กในขณะที่คุณสัมผัสกับผู้ปกครอง


0

ลองใช้ ScrollView ไม่ใช่กับ ListView

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

คุณสามารถจัดรูปแบบรหัสได้หรือไม่? คำตอบมีเส้นว่างที่มีเครื่องหมายทวิภาคกึ่งและไม่มีความคิดเห็น
Tejus Prasad

หากคุณไม่ได้ทำอะไรมากกับ ScrollView ที่ขยายเพิ่มคุณไม่จำเป็นต้องเขียนอะไรบางอย่างในบรรทัดที่มีเครื่องหมายทวิภาคกึ่ง ดังนั้นเพียงแค่ลบพวกเขา และสมมติว่าชื่อแพ็กเกจของคุณ 'com.me' จากนั้นในโครงร่าง XML ให้ใช้ '<com.me.xScrollView ... ' แทน '<ScrollView ... '
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

แทนที่ ListView โดย RecycleView ภายใน ScrollView มันทำงานได้อย่างราบรื่นโดยไม่มีซอร์สโค้ดเพิ่มเติม:

 <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

สำหรับ ListView ภายใน ScrollView ใช้ 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. สร้าง listview ที่กำหนดเองซึ่งไม่สามารถเลื่อนได้

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

มันไม่ทำงานสำหรับหลายระดับ ExpandableListview เช่น 3 ระดับหรือ 4 ระดับ ความช่วยเหลือใด ๆ ??
KJEjava48

0

ฉันพบวิธีแก้ปัญหาสำหรับเรื่องนั้น แทนที่จะใช้ scrollview คุณสามารถใช้ addHeaderview และ addFooterview ของ listview

นี่คือตัวอย่างของฉัน

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

ขณะนี้ด้วย listview เค้าโครงของคุณยังสามารถเลื่อนได้ สนุกกับมัน!!!


0

แทนที่ ScrollView โดย android.support.v4.widget.NestedScrollView ภายใน xml มันทำงาน

1) ใช้ใน XML :::: android.support.v4.widget.NestedScrollView

แทน:::: ScrollView

2) และใช้สำหรับมุมมองรายการด้วยวิธีนี้โดยใช้ NonScrollListView ในไฟล์ 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) สุดท้ายใช้รหัสนี้เพื่อระบุ scrollview ในไฟล์ cs:

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

สิ่งนี้ช่วยให้ ListView เลื่อนภายใน NestedScrollView หรือไม่?
KJEjava48

มันไม่ทำงานสำหรับหลายระดับ ExpandableListview เช่น 3 ระดับหรือ 4 ระดับ ความช่วยเหลือใด ๆ ??
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 ของคุณสามารถเลื่อนได้ภายใน 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

คุณไม่สามารถเพิ่ม ListView ในมุมมองแบบเลื่อนเนื่องจากมุมมองรายการยังคงเป็น scolls และจะมีปัญหาในการซิงโคไนซ์ระหว่าง listview scroll และ scroll view scoll คุณสามารถสร้าง 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.