ScrollView के अंदर ListView Android पर स्क्रॉल नहीं कर रहा है


157

मुझे ListViewअंदर स्क्रॉलिंग से परेशानी हो रही है ScrollView। मेरे पास एक गतिविधि है जिसमें शीर्ष भाग में कुछ EditTexts हैं और फिर एक टैब होस्ट है जिसमें दो टैब हैं जिनमें से प्रत्येक में एक सूची है। जब EditText दृश्य केंद्रित होते हैं, तो नरम कीबोर्ड ऊपर आता है और जैसा कि मेरे पास एक स्क्रॉल दृश्य है, सामग्री स्क्रॉल योग्य है। लेकिन समस्या तब आती है जब ListViews (टैब में वाले) में अधिक आइटम होते हैं, मैं सूची दृश्य स्क्रॉल नहीं कर पा रहा हूं, भले ही अधिक आइटम हों।

निम्नलिखित लेआउट 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 पर एक और पोस्ट है, लेकिन वे मेरे मामले में किसी काम के नहीं थे।



मुझे एक हल मिलता है: androidhub4you.com/2012/12/…
Md इमरान चौधरी

जवाबों:


175

आपको अपने ListViewअंदर नहीं डालना चाहिए ScrollViewक्योंकि ListViewवर्ग अपने स्वयं के स्क्रॉलिंग को लागू करता है और यह केवल इशारों को प्राप्त नहीं करता है क्योंकि वे सभी माता-पिता द्वारा नियंत्रित किए जाते हैं ScrollView। मैं आपको किसी भी तरह अपने लेआउट को सरल बनाने के लिए दृढ़ता से सलाह देता हूं। उदाहरण के लिए आप उन विचारों को जोड़ सकते हैं, ListViewजिन्हें आप शीर्षलेखकों या पादलेखों तक स्क्रॉल करना चाहते हैं ।

अद्यतन :

एपीआई स्तर 21 से शुरू (लॉलीपॉप) नेस्टेड स्क्रॉल कंटेनर आधिकारिक तौर पर एंड्रॉइड एसडीके द्वारा समर्थित हैं। इन Viewऔर ViewGroupवर्गों में विधियों का एक समूह है जो इस कार्यक्षमता को प्रदान करते हैं। लॉलीपॉप पर नेस्टेड स्क्रॉलिंग का काम करने के लिए आपको android:nestedScrollingEnabled="true"अपने XML घोषणा में जोड़कर या स्पष्ट रूप से कॉल करके बच्चे को स्क्रॉल दृश्य के लिए सक्षम करना होगा setNestedScrollingEnabled(true)

यदि आप पूर्व-लॉलीपॉप उपकरणों पर नेस्टेड स्क्रॉलिंग का काम करना चाहते हैं, जो कि आप शायद करते हैं, तो आपको समर्थन लाइब्रेरी से संबंधित उपयोगिता वर्ग का उपयोग करना होगा। सबसे पहले आपको NestedScrollView केScrollView साथ बदलना होगाNiedScrollingParent और NestedScrollingChild दोनों को बाद में लागू किया जाता है, इसलिए इसे माता-पिता या बच्चे के स्क्रॉल कंटेनर के रूप में उपयोग किया जा सकता है।

लेकिन ListViewनेस्टेड स्क्रॉलिंग का समर्थन नहीं करता है, इसलिए आपको इसे उप-वर्ग करने और कार्यान्वित करने की आवश्यकता है NestedScrollingChild। सौभाग्य से, समर्थन पुस्तकालय NestedScrollingChildHelper वर्ग प्रदान करता है , इसलिए आपको बस इस वर्ग का एक उदाहरण बनाना होगा और अपने दृश्य वर्ग के संबंधित तरीकों से इसके तरीकों को कॉल करना होगा।


धन्यवाद पिक्सी, लेकिन आपने देखा होगा कि मैं दो टैब के साथ एक टैबहोस्ट का उपयोग कर रहा हूं, जिनमें से प्रत्येक में अलग-अलग सूचीचित्र हैं। इस मामले में मैं शीर्ष लेख या पाद लेख कैसे जोड़ सकता हूं?
अश्वनी

हाँ, टैब लगाना ListViewअजीब होगा। लेकिन आपका लेआउट बहुत जटिल है। मैं यह भी नहीं समझ सकता कि आप इसे किस तरह देखना चाहते हैं। वैसे भी आप इसे बेहतर बना सकते हैं क्योंकि एक ListViewनेस्टेड एक नेस्टेड है ScrollViewजो दूसरे में नेस्टेड ScrollViewहै, अजीब लगता है और काम नहीं करेगा।
माइकल

6
यह एक scrollView.Please देखें अंदर ListView उपयोग करने के लिए नीचे दिए गए उत्तर संभव है Clck यहाँ
अतुल भारद्वाज

2
स्क्रॉलव्यू stackoverflow.com/questions/18813296/… के अंदर कस्टम सूची दृश्य
डिडानिया हिरेनकुमार

1
हां, स्क्रॉल करने योग्य विचारों को घोंसला बनाना संभव है, लेकिन यह भी इंगित करता है कि आपका लेआउट (और यूई डिजाइन) थोड़ा जटिल है
suitianshi

304

मुझे एक ऐसा समाधान मिला, जो शानदार तरीके से काम करता है और ListViewबिना किसी समस्या के स्क्रॉल कर सकता है:

ListView lv = (ListView)findViewById(R.id.myListView);  // your listview inside scrollview
lv.setOnTouchListener(new ListView.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                // Disallow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(true);
                break;

            case MotionEvent.ACTION_UP:
                // Allow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }

            // Handle ListView touch events.
            v.onTouchEvent(event);
            return true;
        }
    });

यह क्या करता है TouchEventपर s को अक्षम करता है ScrollViewऔर ListView उन्हें इंटरसेप्ट करता है। यह सरल है और हर समय काम करता है।


इसके साथ एक मुद्दा है, onitemclick श्रोता के बिना इसका अच्छा काम, अगर मैं भी OnItemClickListener चाहता हूँ?
हार्दिक जोशी

यह नेस्टेड सूची दृश्यों और विस्तार योग्य सूची विचारों के लिए भी काम करता है। यदि आपके पास एक SwipeRefreshLaout है, तो आपके पास सभी तरह से स्क्रॉल किए जाने पर समस्याएँ होंगी। इसे संभालने का एक आसान तरीका यह है कि माता-पिता के माध्यम से SwipeRefreshLayout का एक उदाहरण प्राप्त करें, और फिर इसे नीचे अक्षम करें, और इसे फिर से सक्षम करें।
कलल वेड

2
नमस्कार @ Moisés Olmedo मैं एक ही विधि का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह कस्टम दृश्य प्राप्त करना HoroscopeListView ने इस पर setOnTouchListener को कॉल किया है, लेकिन PerformClick को ओवरराइड नहीं करता है। क्या इससे निपटने का कोई तरीका है?
आयूषी

यह बहुत अच्छा है - मैं इसका उपयोग स्क्रोलव्यू के अंदर ड्रैगअंड्रोप्लिनयरलाईट काम करने के लिए करता हूं - मैंने इस श्रोता को हैंडलर खींचने और टुकड़े के स्क्रॉलव्यू को अक्षम करने के लिए सेट किया है। फर्क सिर्फ इतना है कि मैं ड्रैग और ड्रॉप काम करने के लिए सही के बजाय गलत लौटाता हूं ।
बोरिस ट्रेखोव

@ MoisésOlmedo मैंने आपके उत्तर का अनुसरण किया है। यह पूरी तरह से पोर्ट्रेट मोड में काम कर रहा है, लेकिन लैंडस्केप में नहीं। मेरे पास सूची में 11 आइटम हैं। वे सभी चित्र में दिखाई दे रहे हैं, लेकिन परिदृश्य में केवल 6. मिल रहा है सूची स्क्रॉल नहीं है।
प्रॉप्स

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
यह स्वीकृत उत्तर होना चाहिए। जबकि अन्य सभी समाधान केवल तब काम करते हैं जब सूची-आइटम एक ही आकार के होते हैं, यह समाधान उन लोगों को बाहर खड़ा करता है जब सूची-आइटम में परिवर्तनशील ऊंचाई होती है। कुछ घंटे बिताए और अंत में यह पाया।
खोबिब

1
इसका सही उत्तर है और इसे स्वीकार किया जाना चाहिए। पंक्तियों की कई ऊंचाइयों के लिए काम करता है
iBabur

4
स्क्रॉलव्यू केवल एक प्रत्यक्ष बच्चे की मेजबानी कर सकता है। यह कैसे संभव है।
प्रणव

8
मुझे इस समाधान के साथ एक प्रमुख मुद्दा मिला। यह सूची दृश्य के संपूर्ण उद्देश्य को पराजित करता है। यह अनिवार्य रूप से सभी सूची दृश्यों (न केवल दृश्य वाले) का भार करता है और उन सभी को संलग्न करने के लिए ऊँचाई को बदलता है (अधिक से अधिक एक तरह LinearLayoutसे ListView। इसका मतलब है कि यदि आपके पास बड़ी संख्या में सूची आइटम (या जटिल सूची आइटम हैं) तब एंड्रॉइड डिवाइस को गतिविधि को खोलने में बहुत समय लगेगा (या मेरे मामले में प्रयास करते समय भी दुर्घटनाग्रस्त हो सकता है)।
reubenjohn

2
सबसे बुरा विचार कभी ... आपने सिर्फ एक बहुत ही महंगा लिनेरलॉयआउट फिर से बनाया है :) - रोमेन गाइ (Google इंजीनियर) ... यह समाधान केवल उन नॉब्स के लिए है जो पूरी तरह से ListView को नहीं समझते हैं ... @reubenjohn आप बिल्कुल सही हैं
सेल्विन

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

@ डिवाइस पर यह काम अच्छा है: सैमसंग कैप्टिव i897, एचटीसी सेंसेशन, एचटीसी इनक्रेडिबल, लेकिन एचटीसी डिजायर एक्स पर काम नहीं करता है, क्या समस्या हो सकती है?
पेपेला

@Atul लेकिन कभी-कभी 3 या 4 उंगलियों का उपयोग करते समय स्क्रॉल होता है लेकिन कभी-कभी।
पेपेला

@pepela आप सही हैं। इसके केवल एक स्क्रॉल दृश्य के रूप में चिकनी नहीं है। लेकिन यह हमारी जरूरत को पूरा करता है।
अतुल भारद्वाज

बड़ी सूची को स्क्रॉल करते समय यह सभी गतियों को बाधित कर सकता है। मेरे लिए, मैं इस पैच का उपयोग करता हूं
anil

11

मेरे पास एक ही मुद्दा था और गुगली करते समय मुझे आपका सवाल मिला। हां चिह्नित जवाब ने मेरे लिए भी काम किया लेकिन कुछ मुद्दा था।
वैसे भी मुझे एक और उपाय मिला । जो पूरी तरह से बिना किसी बाजीगरी के काम करता है।


4
कृपया एसओ पर जवाब पोस्ट करें, न कि केवल बाहरी साइट से लिंक करें।
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;
    }
});

इसके साथ एक छोटी सी समस्या यह है कि मैं स्क्रॉलव्यू को स्क्रॉल करना जारी रखना चाहता हूं जब सूची छूते समय अंत तक पहुंच जाती है।
बद्र

6

यहाँ स्क्रॉलव्यू में Listview का उपयोग करने की सटीक विधि दी गई है। हम सभी को स्पर्श घटनाओं को संभालना होगा।

      lstvNextTracks.setOnTouchListener(new OnTouchListener()
      {
          @Override
          public boolean onTouch(View v, MotionEvent event)
          {
         Log.e("Lisview *************", "focused");
         SCView.requestDisallowInterceptTouchEvent(true);
         return false;
          }
      });




    SCView.setOnTouchListener(new OnTouchListener()
    {

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int arr[] = new int[] { 1, 2 };
            lstvNextTracks.getLocationOnScreen(arr);

            /* Get bounds of child Listview*/
            int lstvTop = arr[0];
            int lstvBottom = arr[1] + lstvNextTracks.getHeight();
            int lstvLeft = arr[1];
            int lstvRight = arr[0] + lstvNextTracks.getWidth();

            float x = event.getRawX();
            float y = event.getRawY();

            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                /*check if child ListView bounds are touched*/
                if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight)
                {
                    SCView.clearFocus();
                    /*This statement tells the ScrollView to do not handle this touch event, so the child Listview will handle this touch event and will scroll */
                    SCView.requestDisallowInterceptTouchEvent(true);
                    /*The child Listview isFocusable attribute must be set to true otherwise it will not work*/
                    lstvNextTracks.requestFocus();
                    return true;
                } else
                    return false;
            } else if (event.getAction() == MotionEvent.ACTION_MOVE)
            {

                if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight)
                {
                    SCView.clearFocus();
                    SCView.requestDisallowInterceptTouchEvent(true);
                    lstvNextTracks.requestFocus();
                    return true;
                } else
                    return false;
            } else if (event.getAction() == MotionEvent.ACTION_UP)
            {
                SCView.clearFocus();
                SCView.requestDisallowInterceptTouchEvent(true);
                lstvNextTracks.requestFocus();
                return false;
            } else
            {
                return false;
            }
        }
    });

एक बग है जब स्क्रॉल क्षेत्र स्पर्श क्षेत्र से बाहर है
ademar111190

6

निम्नलिखित विधि का उपयोग करें और आनंद लें!

private void setListViewScrollable(final ListView list) {
    list.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            listViewTouchAction = event.getAction();
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                list.scrollBy(0, 1);
            }
            return false;
        }
    });

    list.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                list.scrollBy(0, -1);
            }
        }
    });
}

listViewTouchAction एक वैश्विक पूर्णांक मान है। यदि आप लाइन को बदल सकते हैं

list.scrollBy(0, 1);

कुछ और के साथ हमारे साथ साझा करें।

का आनंद लें!


बहुत करीब। यह अभी भी कई बार काम नहीं करता है, लेकिन कम से कम यह कुछ समय में काम करता है।

2
इसकी कार्यप्रणाली लेकिन समस्या स्क्रॉल की गति के साथ है। यह बहुत ही सुस्त है।
सुमित पांडे

4

दो अलग-अलग स्क्रॉलिंग विचारों को एक साथ रखने के लिए इसका एक बुरा अभ्यास है। ListView की अपनी स्क्रॉलिंग कार्यक्षमता है और आपकी पंक्ति वस्तुओं के लिए एडेप्टर सेटिंग्स के अनुसार ऑटो को समायोजित किया जाता है (मन में दबाकर, हम अपने लेआउट xml में ListView के लिए विशिष्ट ऊंचाई सेट नहीं कर रहे हैं)। हालाँकि, आपके मामले में, आप ListView को एक वर्ग के साथ बदल सकते हैं और यह आपके ListView की ऊंचाई को ध्यान में रखते हुए समायोजित करेगा कि आपका ListView स्क्रॉल दृश्य के अंदर है।

इससे आपको मदद मिलेगी:

public class ExpandableHeightListview extends ListView
{

    boolean expanded = false;

    public ExpandableHeightListview(Context context)
    {
        super(context);
    }

    public ExpandableHeightListview(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ExpandableHeightListview(Context context, AttributeSet attrs,int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded()
    {
        return expanded;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // HACK! TAKE THAT ANDROID!
        if (isExpanded())
        {
            // Calculate entire height by providing a very large height hint.
            // But do not use the highest 2 bits of this integer; those are
            // reserved for the MeasureSpec mode.
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        }
        else
        {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded)
    {
        this.expanded = expanded;
    }
}

अब इस श्रेणी के साथ अपने ListView का विस्तार करें, अपने 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 NestedScrollView के अंदर स्क्रॉल करने की अनुमति देता है ??
KJEjava48

हाँ, यह अनुमति देगा। इस समाधान के माध्यम से, सूची दृश्य स्क्रॉलिंग गुणों को अक्षम कर दिया जाएगा, और सूची स्क्रॉल सामग्री को स्क्रॉल करने के लिए माता-पिता स्क्रॉलव्यू जिम्मेदार होंगे। आशा करता हूँ की ये काम करेगा।
रवि काबरा

4

मुझे पता है कि यह सवाल बहुत पहले से पूछा जा रहा है, लेकिन जो अभी के लिए अटका हुआ है वह इस सूची को अपने ListView में जोड़कर हल कर सकता है

android:nestedScrollingEnabled="true"

उदाहरण के लिए -

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

3

मैंने इसी तरह की समस्या और सूची दृश्य के साथ विस्तार करके कस्टम वर्ग बनाकर हल किया है।

ScrollableListView.java

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

public class ScrollableListView extends ListView {

    public ScrollableListView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollableListView (Context context) {
        super(context);
    }

    public ScrollableListView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

उपयोग:

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

UIHaq क्या यह ListView NestedScrollView के अंदर स्क्रॉल करने की अनुमति देता है ??
KJEjava48

1
यह 3 स्तर या 4 स्तर की तरह मल्टीलेवल एक्सपेंडेबलस्टव्यू के लिए काम नहीं कर रहा है। कोई मदद??
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
आपको शायद थोड़ा समझाना चाहिए, एक कोड का एक द्रव्यमान एक स्पष्टीकरण के बिना उत्तर के रूप में महान नहीं है।
हारून हॉल

मैं इस समाधान के लिए इस्तेमाल किया। लेकिन यह समाधान अच्छा नहीं है। मेरी सूची में 10 आइटम हैं, लेकिन यह 9.5 या 9 आइटम प्रदर्शित करता है।
हाई रोम

1

सबसे अच्छा समाधान यह है कि RecyclerView के साथ NestedScrollVew का उपयोग करें या यदि आप 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 और सभी के लिए किसी भी 3 पार्टी लाइब्रेरी की आवश्यकता नहीं थी, बस सादा और सरल RecyclerView।

तो recyclerView से पहले मेरे लेआउट फ़ाइल Heres:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:elevation="5dp">

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relativeLayoutre"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    tools:context="com.example.android.udamovappv3.activities.DetailedActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/my_toolbar_detail"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_gravity="top"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <TextView
        android:id="@+id/title_name"
        android:layout_width="fill_parent"
        android:layout_height="128dp"
        android:layout_alignParentStart="true"
        android:layout_marginTop="59dp"
        android:background="#079ED9"
        android:gravity="left|center"
        android:padding="25dp"
        android:text="Name"
        android:textColor="#ffffff"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@+id/my_toolbar_detail"
        app:layout_constraintVertical_bias="0.0"
        tools:layout_editor_absoluteX="0dp" />


    <ImageView
        android:id="@+id/iv_poster"
        android:layout_width="131dp"
        android:layout_height="163dp"
        android:layout_alignStart="@+id/my_toolbar_detail"
        android:layout_below="@+id/title_name"
        android:layout_marginBottom="15dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="15dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:srcCompat="@mipmap/ic_launcher" />

    <Button
        android:id="@+id/bt_mark_as_fav"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/iv_poster"
        android:layout_alignParentEnd="true"
        android:layout_marginBottom="11dp"
        android:layout_marginEnd="50dp"
        android:background="#079ED9"
        android:text="Mark As \n Favorite"
        android:textSize="10dp" />

    <TextView
        android:id="@+id/tv_runTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/tv_rating"
        android:layout_below="@+id/tv_releaseDate"
        android:layout_marginTop="11dp"
        android:text="TextView"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_releaseDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/tv_runTime"
        android:layout_alignTop="@+id/iv_poster"
        android:text="TextView"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/tv_rating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/bt_mark_as_fav"
        android:layout_below="@+id/tv_runTime"
        android:layout_marginTop="11dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/tv_overview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/iv_poster"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="5dp"
        android:foregroundGravity="center"
        android:text="adasdasdfadfsasdfasdfasdfasdfnb agfjuanfalsbdfjbdfklbdnfkjasbnf;kasbdnf;kbdfas;kdjabnf;lbdnfo;aidsnfl';asdfj'plasdfj'pdaskjf'asfj'p[asdfk"
        android:textColor="#000000"
         />


    <RelativeLayout
        android:id="@+id/foodItemActvity_linearLayout_fragments"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@+id/tv_overview">
        <TextView
            android:id="@+id/fragment_dds_review_textView_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Reviews:"

            android:textAppearance="?android:attr/textAppearanceMedium" />
        <com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView
            android:id="@+id/expandable_listview"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/fragment_dds_review_textView_label"
            android:padding="8dp">

        </com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView>
    </RelativeLayout>
</RelativeLayout>
</ScrollView>

यह उन सभी मामलों में से एक के साथ मेरे दृष्टिकोण को समझने के बाद है जो अभिन्न हैं। तो समस्या यह थी कि एंड्रॉइड में 2 स्क्रॉलव्यू बग (शायद बग नहीं) के कारण लिस्टव्यू ठीक से व्यवहार नहीं कर रहा था।

मैंने अपने अंतिम लेआउट को बनाने के लिए पुनर्नवीनीकरण दृश्य के साथ प्रतिस्थापित किया।

यह मेरा पुनर्नवीनीकरण दृश्य अनुकूलक है:

public class TrailerAdapter extends RecyclerView.Adapter<TrailerAdapter.TrailerAdapterViewHolder> {

private ArrayList<String> Youtube_URLS;

private Context Context;

public TrailerAdapter(Context context, ArrayList<String> Youtube_URLS){
    this.Context = context;
    this.Youtube_URLS = Youtube_URLS;
}
@Override
public TrailerAdapter.TrailerAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.trailer_layout, parent, false);
    return new TrailerAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(TrailerAdapter.TrailerAdapterViewHolder holder, int position) {
    Picasso.with(Context).load(R.drawable.ic_play_arrow_black_24dp).into(holder.iv_playbutton);
    holder.item_id.setText(Youtube_URLS.get(position));
}

@Override
public int getItemCount() {
    if(Youtube_URLS.size()==0){
        return 0;
    }else{
        return Youtube_URLS.size();
    }
}

public class TrailerAdapterViewHolder extends RecyclerView.ViewHolder {
    ImageView iv_playbutton;
    TextView item_id;

    public TrailerAdapterViewHolder(View itemView) {
        super(itemView);
        iv_playbutton = (ImageView)itemView.findViewById(R.id.play_button);
        item_id = (TextView)itemView.findViewById(R.id.tv_trailer_sequence);
    }
}
}

और यह मेरा RecyclerView कस्टम लेआउट है:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="56dp"
    android:padding="6dip" >

    <ImageView
        android:id="@+id/play_button"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="6dip"
        android:layout_marginStart="12dp"
        android:src="@drawable/ic_play_arrow_black_24dp"
        android:layout_centerVertical="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:id="@+id/tv_trailer_sequence"
        android:layout_width="wrap_content"
        android:layout_height="26dip"
        android:layout_centerVertical="true"
        android:layout_toEndOf="@+id/play_button"
        android:ellipsize="marquee"
        android:gravity="center"
        android:maxLines="1"
        android:text="Description"
        android:textSize="12sp" />

</RelativeLayout>

और VOILA, मैं एक scollview के भीतर ListView (अब RecyclerView) का वांछित प्रभाव मिला। UI की अंतिम छवि का उपयोग करता है

अंतिम नोट पर, मेरा मानना ​​है कि RecyclerView को बदलना मेरे लिए एक बेहतर विकल्प था, क्योंकि इसने समग्र ऐप स्थिरता में सुधार किया, और इससे मुझे RecyclerView को बेहतर तरीके से समझने में भी मदद मिली। अगर मैं एक समाधान का सुझाव दे रहा था, तो इम कहने के लिए एक RecyclerView के साथ अपने ListView को बदलने जा रहा हूँ।


1

@ शीलेश रोहित द्वारा दिया गया उपरोक्त समाधान पूरी तरह से ठीक काम करता है। कुछ टोटके करने होंगे।

  1. यदि आप एक ही क्लास (मुख्य वर्ग) के अंदर हेल्पर क्लास लगा रहे हैं तो हेल्पर क्लास को स्टैटिक बनाएं और getListViewSize () स्टैटिक न बनें।

  2. सबसे महत्वपूर्ण, "Helper.getListViewSize (listView), लिखें" पहली बार "listView.setAdapter (myAdapter);" जैसे एडॉप्टर सेट करने के बाद स्टेटमेंट साथ ही साथ जब भी आप "myAdapter.notifyDataSetChanged ();"

  3. उपयोग नीचे दिखाया गया है।

    listView = (ListView) findViewById (R.id.listView); myAdapter = नया ArrayAdapter (यह, android.R.layout.simple_list_item_1, listVuesues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (ListView);

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


0

मेरे अनुसार जब आप setOnTouchListener ओम माता-पिता का उपयोग कर रहे हैं या बच्चे माता-पिता की स्क्रॉलिंग बंद कर देते हैं, जैसा कि आप बच्चे पर स्पर्श करते हैं, तो बच्चे के स्क्रॉल को रोकते हैं जैसे आप माता-पिता को छूते हैं


0

इसे स्क्रॉल दृश्य के साथ देखें, सूची दृश्य के साथ नहीं।

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

आप कोड प्रारूप कर सकते हैं ?? जवाब में अर्ध-बृहदान्त्र के साथ खाली लाइनें हैं और कोई टिप्पणी नहीं
तेजस प्रसाद

यदि आप अपने विस्तारित स्क्रॉल दृश्य के साथ बहुत कुछ नहीं करते हैं, तो आपको अर्ध कॉलनों के साथ लाइनों में कुछ लिखने की आवश्यकता नहीं है। तो बस उन्हें हटा दें। और मान लें कि आपके पैकेज का नाम 'com.me' है, तो लेआउट XML में, '<स्क्रॉल.काम' के बजाय '<com.me.xScrollView ...' का उपयोग करें
Kim Sangdeuk

0

requestDisallowInterceptTouchEvent (बूलियन अस्वीकृति)

जब कोई बच्चा इस माता-पिता और उसके पूर्वजों को onInceptceptTouchEvent (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

स्क्रॉल दृश्य के अंदर RecycleView द्वारा सूची दृश्य को बदलें। यह अतिरिक्त स्रोत कोड के बिना आसानी से चलता है:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.hung.recycleviewtest.MainActivityFragment"
    >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycle_view"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:background="@android:color/darker_gray"/>
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycle_view_a"
            android:layout_marginTop="40dp"
            android:layout_below="@id/recycle_view"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:background="@android:color/darker_gray"/>
    </RelativeLayout>

</ScrollView>

0

स्क्रॉल दृश्य के अंदर ListView NestedScrollView का उपयोग करें यह इस कार्यक्षमता को बहुत आसानी से संभाल सकता है:

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="5dip"/>

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

0

मुझे यह त्रुटि मिली है। और मेरा समाधान इस प्रकार है:

1. एक कस्टम लिस्टव्यू बनाएं जो न के बराबर है

public class NonScrollListView extends ListView {

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

}

2. xml फ़ाइल के लिए कस्टम वर्ग के ऊपर का उपयोग करें

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

आशा है कि आप के लिए सबसे अच्छा है।


यह ListView NestedScrollView के अंदर स्क्रॉल करने की अनुमति देता है ?? मुझे लगता है कि यह आइटम आकार के अनुसार सूची का आकार बदलता है।
KJEjava48

यह 3 स्तर या 4 स्तर की तरह मल्टीलेवल एक्सपेंडेबलस्टव्यू के लिए काम नहीं कर रहा है। कोई मदद??
KJEjava48

0

मुझे इसके लिए एक समाधान मिला , स्क्रॉल स्क्रॉल का उपयोग करने के बजाय, आप addHeaderview और listFooterview का उपयोग कर सकते हैं

यहाँ मेरा स्निपेट है,

//  create separate layout and add it dynamically
    scrollview=getLayoutInflater().inflate(R.layout.yourlayout,null);
    lv=(ListView)listview.findViewById(R.id.listView2);
    lv.addHeaderView(scrollview);
    lv.setContentView(lv);

अब, सूची के साथ आपके लेआउट को भी स्क्रॉल किया जा सकता है। का आनंद लें!!!


0

Android.support.v4.widget.NestedScrollView द्वारा xml के अंदर स्क्रॉल दृश्य बदलें। यह चलता है

1) XML में उपयोग :::: android.support.v4.widget.NestedScrollView

के बजाय:::: ScrollView

2) और सीएस फाइल में नॉनस्क्रोलिस्टस्ट व्यू का उपयोग करके इस तरह से सूची देखने के लिए उपयोग करें:

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) आखिरकार इस कोड का उपयोग cs फ़ाइल में स्क्रॉलव्यू की पहचान करने के लिए करें:

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

यह ListView NestedScrollView के अंदर स्क्रॉल करने की अनुमति देता है ??
KJEjava48

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

आप स्क्रॉल दृश्य में एक सूची दृश्य जोड़ नहीं सकते, क्योंकि सूची दृश्य में भी स्कोल होता है और सूची स्क्रॉल और स्क्रॉल दृश्य स्कोल के बीच एक सिंक्रोनाइज़ेशन समस्या होगी। आप एक CustomList दृश्य बना सकते हैं और इस पद्धति को इसमें जोड़ सकते हैं।

@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, coz यह कि सेटिंग डिफ़ॉल्ट है

<ListView
    android:cacheColorHint="#00000000"
    android:id="@+id/ListView01"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.