স্ক্রোলভিউয়ের ভিতরে তালিকাভিউ অ্যান্ড্রয়েডে স্ক্রল করছে না


157

এ এর ListViewভিতরে স্ক্রোলিং করতে আমার সমস্যা হচ্ছে ScrollView। আমার একটি ক্রিয়াকলাপ রয়েছে যার উপরের অংশে কিছু এডিটেক্সট রয়েছে এবং তারপরে দুটি ট্যাব সহ একটি ট্যাব হোস্ট রয়েছে যার প্রতিটিতে একটি তালিকা ভিউ রয়েছে। এডিটেক্সট ভিউগুলিকে যখন ফোকাস করা হয়, তখন নরম কীবোর্ড আসে এবং আমার কাছে যেমন একটি স্ক্রোলভিউ থাকে, সামগ্রীটি স্ক্রোলযোগ্য হয়। তবে সমস্যাটি তখন উপস্থিত হয় যখন তালিকার ভিউগুলিতে আরও বেশি আইটেম থাকে (ট্যাবগুলিতে থাকে), আমি আরও আইটেম থাকলেও তালিকার ভিউ স্ক্রোল করতে পারছি না।

নিম্নলিখিত লেআউটটি এক্সএমএল:

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

দয়া করে কেউ কি আমাকে বলতে পারেন যে এখানে সমস্যা কী? স্ক্রোলভিউ সমস্যার ভিতরে তালিকাভিউতে আমার আর একটি পোস্ট রয়েছে তবে সেগুলি আমার ক্ষেত্রে কার্যকর হয়নি।



আমি একটি সমাধান পেয়েছি: androidhub4you.com/2012/12/…
মোঃ ইমরান চৌধুরী চৌধুরী

উত্তর:


175

আপনার কোনও ListViewভিতরে লাগানো উচিত নয় ScrollViewকারণ ListViewশ্রেণি তার নিজস্ব স্ক্রোলিং প্রয়োগ করে এবং এটি কেবল অঙ্গভঙ্গি গ্রহণ করে না কারণ সেগুলি সমস্ত পিতা-মাতার দ্বারা পরিচালিত হয় ScrollView। আমি আপনাকে দৃ layout়ভাবে কোনওভাবে আপনার লেআউটটিকে সরল করার পরামর্শ দিচ্ছি। উদাহরণস্বরূপ, আপনি মতামত আপনাকে স্ক্রল করতে চান যুক্ত করতে পারেন ListViewহেডার বা পাদলেখ হিসাবে।

আপডেট :

এপিআই লেভেল 21 (ললিপপ) থেকে শুরু করে নেস্টেড স্ক্রোল ধারকগুলি আনুষ্ঠানিকভাবে অ্যান্ড্রয়েড এসডিকে সমর্থন করে। পদ্ধতি একটি গুচ্ছ সেখানে থাকেন Viewএবং ViewGroupশ্রেণীর যা এই কার্যকারিতা প্রদান করে। ললিপপটিতে নেস্টেড স্ক্রোলিংয়ের কাজ করার জন্য android:nestedScrollingEnabled="true"আপনাকে এটির এক্সএমএল ঘোষণায় যুক্ত করে বা স্পষ্টভাবে কল করে চাইল্ড স্ক্রোল দেখার জন্য সক্ষম করতে হবে setNestedScrollingEnabled(true)

আপনি সম্ভবত প্রাক-ললিপপ ডিভাইসে নেস্টেড স্ক্রোলিংয়ের কাজ করতে চান, আপনাকে সমর্থন লাইব্রেরি থেকে সংশ্লিষ্ট ইউটিলিটি ক্লাস ব্যবহার করতে হবে। প্রথমে আপনাকে নেস্টডস্ক্রোলভিউScrollView দিয়ে আপনাকে প্রতিস্থাপন করতে হবে । পরেরটি নেস্টডস্ক্রোলিংপেন্ট এবং নেস্টেডস্ক্রোলিংচিল্ড উভয়ই প্রয়োগ করে যাতে এটি পিতামাতা বা শিশু স্ক্রোল ধারক হিসাবে ব্যবহার করতে পারে।

কিন্তু ListViewনেস্টেড স্ক্রোলিং সমর্থন করে না, সুতরাং আপনার এটি সাবক্লাস এবং প্রয়োগ করতে হবে NestedScrollingChild। ভাগ্যক্রমে, সাপোর্ট লাইব্রেরি নেস্টডস্ক্রোলিংচিল্ড হেল্পার ক্লাস সরবরাহ করে, তাই আপনাকে কেবল এই শ্রেণীর একটি উদাহরণ তৈরি করতে হবে এবং আপনার ভিউ সম্পর্কিত বিভাগ থেকে এর পদ্ধতিগুলি কল করতে হবে।


ধন্যবাদ পিক্সি, তবে আপনি অবশ্যই লক্ষ্য করেছেন যে আমি দুটি ট্যাব সহ একটি পৃথক তালিকার ভিউ সহ একটি ট্যাবহস্ট ব্যবহার করছি। এই ক্ষেত্রে আমি কীভাবে শিরোনাম বা পাদচরণ যুক্ত করতে পারি?
আশ্বানি কে

হ্যাঁ, একটিতে ট্যাব লাগানো ListViewঅদ্ভুত হবে। তবে আপনার লেআউটটি খুব জটিল। আপনি এটি দেখতে কেমন চান তা আমি বুঝতেও পারি না। যাইহোক আপনি আরও সহজ করে তুলতে চাই কারণ একটি ListViewনেস্টেড ScrollViewযা অন্যের মধ্যে নেস্ট করা থাকে তা ScrollViewদেখতে অদ্ভুত লাগে এবং কাজ করবে না।
মাইকেল

6
কোনও স্ক্রোলের ভিতরেই ভিভিউ তালিকাটি ব্যবহার করা সম্ভব lease অনুগ্রহ করে নীচের উত্তর ক্লকটি এখানে দেখুন
অতুল ভরদ্বাজ


1
হ্যাঁ, স্ক্রোলযোগ্য ভিউগুলিতে বাসা বাঁধাই সম্ভব, তবে এটি এটিও নির্দেশ করে যে আপনার লেআউটটি (এবং ইউই ডিজাইন) কিছুটা জটিল
সুয়েটিশি

304

আমি একটি সমাধান পেয়েছি যা দুর্দান্তভাবে কাজ করে এবং ListViewসমস্যা ছাড়াই স্ক্রোল করতে পারে:

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

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

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

এটি যা করে তা হ'ল TouchEventগুলি নিষ্ক্রিয় করে ScrollViewএবং সেগুলি ListView বাধা দেয়। এটি সহজ এবং সর্বদা কাজ করে।


এটির সাথে একটি সমস্যা, এটি অনটিম্লিক্লিক শ্রোতা ছাড়াই ভালভাবে কাজ করছে, যদি আমি ওনটাইমক্লিকলিস্টনারও চাই?
হার্ডিক যোশি

এটি নেস্টেড তালিকার ভিউ এবং প্রসারণযোগ্য তালিকা দর্শনগুলির জন্যও কাজ করে। আপনার যদি একটি সোয়াইপ রিফ্রেশআলআউট থাকে তবে পুরোপুরি স্ক্রোল করার সময় আপনার সমস্যা হবে। এটি পরিচালনা করার একটি সহজ উপায় হ'ল পিতা-মাতার মাধ্যমে সোয়েপরিফ্রেশলয়আউটের একটি উদাহরণ পাওয়া এবং তারপরে এটি অক্ষম করুন এবং এটিকে পুনরায় সক্ষম করুন।
কালেল ওয়েড

2
হ্যালো @ মোইসস ওলমেডো আমি একই পদ্ধতিটি ব্যবহার করার চেষ্টা করছি তবে এই কাস্টম ভিউ হরাইজেন্টাললিস্টভিউ পেয়ে সেটঅনটচলিস্টাইনারটি ডেকেছে তবে পারফর্ম ক্লিকের ওভাররাইড করে না। এটি মোকাবেলা করার উপায় আছে?
আয়ুষি

এটি দুর্দান্ত - আমি এটি স্ক্রোলভিউয়ের মধ্যে ড্র্যাগএন্ডড্রপলাইনআলাইনআউটটি তৈরি করতে ব্যবহার করি - আমি এই শ্রোতাটিকে হ্যান্ডলারটিকে টেনে আনতে এবং খণ্ডটির স্ক্রোলভিউ অক্ষম করার জন্য সেট করেছি। পার্থক্যটি হ'ল আমি ড্র্যাগ এবং ড্রপ কাজ করতে সত্যের পরিবর্তে মিথ্যা ফিরিয়ে দেব ।
বরিস ট্রুখভ

@ মাইস ওলমেডো আমি আপনার উত্তর অনুসরণ করেছি। এটি প্রতিকৃতি মোডে পুরোপুরি কাজ করছে তবে ল্যান্ডস্কেপে নয়। আমার তালিকায় 11 টি আইটেম রয়েছে। এগুলির সমস্ত প্রতিকৃতিতে দৃশ্যমান, তবে ল্যান্ডস্কেপটিতে কেবল 6 পাচ্ছে List তালিকাটি স্ক্রোলিং নয়।
প্রবস

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>

নেস্টডলিস্টভিউ.জভা শ্রেণি:

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
স্ক্রোলভিউ কেবলমাত্র একটি সরাসরি শিশুকে হোস্ট করতে পারে ow এটা কীভাবে সম্ভব।
প্রণব

8
আমি এই সমাধানটি সহ একটি বড় সমস্যা পেয়েছি। এটি তালিকা দেখার সম্পূর্ণ উদ্দেশ্যকে পরাস্ত করে। এটি মূলত সমস্ত তালিকার ভিউ (কেবল দৃশ্যমান নয়) এর একটি লোড সম্পাদন করে এবং উচ্চতা পরিবর্তন করে সেগুলি সমস্তগুলিকে আবদ্ধ করে তোলে (আরও একটি এর LinearLayoutচেয়ে বেশি পছন্দ করে ListViewThis এর অর্থ হ'ল যদি আপনার কাছে তালিকার আইটেমগুলির একটি বৃহত সংখ্যক (অথবা জটিল তালিকা আইটেম) থাকে তারপরে অ্যান্ড্রয়েড ডিভাইসগুলি ক্রিয়াকলাপটি খুলতে (বা আমার ক্ষেত্রে চেষ্টা করার সময় ক্র্যাশ করতেও) অনেক বেশি সময় লাগবে
re

2
সবচেয়ে খারাপ ধারণা ... আপনি সবেমাত্র একটি খুব ব্যয়বহুল লিনিয়ারলআউট :) তৈরি করেছেন :) - রোমেন গাই (গুগল ইঞ্জিনিয়ার) ... এই সমাধানটি কেবলমাত্র সেইসব নুবশুলের জন্য যারা তালিকার ভিউ পুরোপুরি বুঝতে পারে না ... @ রিউবেনজোহান আপনি একেবারেই সঠিক
সেলভিন

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

@ এটি এই ডিভাইসগুলিতে ভাল কাজ করার মতো: স্যামসাং ক্যাপটিভেট আই 897, এইচটিসি সেনসেশন, এইচটিসি অবিশ্বাস্য, তবে এইচটিসি ডিজায়ার এক্স এ কাজ করে না, সমস্যা কী হতে পারে?
পেপেলা

@ অতুল কিন্তু কখনও কখনও 3 বা 4 আঙ্গুল ব্যবহার করার সময় স্ক্রোল হয় তবে কখনও কখনও।
পেপেলা

@ পেপেলা আপনি ঠিক বলেছেন omeএক সময় এটি কেবলমাত্র একটি স্ক্রোল দেখার মত মসৃণ নয়। তবে এটি আমাদের প্রয়োজন পূরণ করে।
অতুল ভরদ্বাজ 14'13

বৃহত তালিকার ভিউ স্ক্রোল করার সময় এটি সমস্ত গতি বাধা দিতে পারে। আমার হিসাবে, আমি এই প্যাচটি ব্যবহার করি: pristalovpavel.wordpress.com/2014/12/26/…
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

এখানে স্ক্রোলভিউতে তালিকার সাথে ব্যবহার করার সঠিক পদ্ধতি। আমাদের সমস্ত স্পর্শ ইভেন্ট পরিচালনা করতে হবে।

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

স্ক্রোল অঞ্চলটি স্পর্শ ক্ষেত্রের বাইরে চলে যাওয়ার সময় একটি বাগ রয়েছে
এডেমার 111190

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
এটির কাজ কিন্তু সমস্যাটি স্ক্রোলটির গতি নিয়ে। এটা খুব laggy।
সুমিত পান্ডে

4

দু'টি আলাদা স্ক্রোলিং ভিউ একসাথে রাখা খারাপ অভ্যাস। তালিকাগুলির নিজস্ব নিজস্ব স্ক্রোলিং কার্যকারিতা রয়েছে এবং উচ্চতা আপনার সারি আইটেমগুলির জন্য অ্যাডাপ্টারের সেটিংস অনুযায়ী স্বয়ংক্রিয়ভাবে সামঞ্জস্য হয় (মনে রেখে কিলপিং, আমরা আমাদের লেআউট এক্সএমএলে তালিকাভিউতে নির্দিষ্ট উচ্চতা নির্ধারণ করছি না)। তবে আপনার ক্ষেত্রে, আপনি তালিকার ভিউটিকে কোনও শ্রেণীর সাথে প্রতিস্থাপন করতে পারেন এবং এটি আপনার তালিকাভিউ স্ক্রোলভিউয়ের মধ্যে রয়েছে তা মনে রেখে আপনার তালিকার জন্য উচ্চতা সামঞ্জস্য করবে।

এটি আপনাকে সহায়তা করবে:

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

এখন আপনার ক্লাসের সাথে আপনার তালিকাগুলি প্রসারিত করুন, কেবলমাত্র আপনার সূত্রের এক্সএমএল থেকে আপনার তালিকাভিউ ট্যাগটিকে এই জাতীয় স্মোকিংয়ে পরিবর্তন করুন,

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

এটি তালিকাভিউয়ের আপনার স্ক্রোলিং সমস্যাটি সমাধান করবে, এখন প্যারেন্ট স্ক্রোলিংটি তালিকাটি দেখুন এর পরিবর্তে স্ক্রোলভিউ দ্বারা পরিচালিত হয়।


এটি কি তালিকাভুক্তকে নেস্টডস্ক্রোলভিউয়ের ভিতরে স্ক্রোল করার অনুমতি দেয় ??
কেজেজেবা 48

হ্যাঁ, এটি অনুমতি দেবে। এই সমাধানের মাধ্যমে, তালিকার স্ক্রোলিং বৈশিষ্ট্যগুলি অক্ষম করা হবে, এবং প্যারেন্ট স্ক্রোলভিউ তালিকাভুক্তির সামগ্রীগুলি স্ক্রোল করার জন্য দায়বদ্ধ be আশা করি এটা সাহায্য করবে.
রবি কাবার

4

আমি জানি এই প্রশ্নটি অনেক আগেই জিজ্ঞাসা করা হয়েছিল, তবে এখনকার পক্ষে কে এখন আটকে আছে আপনার লাস্টভিউতে এই লাইনটি যুক্ত করে এটি সমাধান করতে পারে

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

ইউআইএইএইচএসি কি এটি লিস্টভিউকে নেস্টডস্ক্রোলভিউয়ের ভিতরে স্ক্রোল করার অনুমতি দেয় ??
কেজেজেবা 48

1
এটি 3 স্তরের বা 4 স্তরের মতো মাল্টিলেভেল এক্সপেন্ডেবললিস্টভিউয়ের জন্য কাজ করছে না। কোন সাহায্য??
কেজেজেভা 48

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

সবচেয়ে ভাল সমাধানটি হ'ল রিসাইক্লারভিউ সহ নেস্টেডস্ক্রোলভি ব্যবহার করা বা আপনি যদি তালিকার সাথে যেতে চান তবে আপনি এটিতে শিরোলেখ এবং পাদচরণের দৃশ্য যুক্ত করতে পারেন। উদাহরণ স্বরূপ:

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

1

আমি উপরে উল্লিখিত প্রায় সমস্ত পদ্ধতি পরীক্ষা করে দেখেছি, আমার উপর আস্থা রাখুন, সম্পূর্ণরূপে রিসাইক্লারভিউ থেকে পালানোর পরে, আমি আমার লিস্টভিউকে পুনর্ব্যবহারকারী সাথে প্রতিস্থাপন করেছি এবং এটি পুরোপুরি কার্যকরভাবে কাজ করেছে। এক্সটেন্ডডহাইটলিস্টভিউ এবং সমস্ত, কেবল সাধারণ এবং সাধারণ রিসাইক্লারভিউয়ের জন্য কোনও তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন নেই Did

রিসাইক্লারভিউয়ের আগে হেরেস আমার লেআউট ফাইলটি:

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

এবং এটি আমার পুনর্ব্যবহারযোগ্য কাস্টম বিন্যাস:

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

এবং ভয়েলা, আমি একটি স্কলভিউয়ের মধ্যে তালিকাভিউ (এখন পুনর্ব্যবহারযোগ্য) এর কাঙ্ক্ষিত প্রভাব পেয়েছি। হেরস ইউআই এর চূড়ান্ত চিত্র

একটি চূড়ান্ত নোটে, আমি বিশ্বাস করি যে আমার জন্য পুনর্ব্যবহারযোগ্য প্রতিস্থাপন করা আরও ভাল পছন্দ ছিল, কারণ এটি সামগ্রিক অ্যাপ্লিকেশন স্থায়িত্বকে উন্নত করেছিল এবং আমাকে পুনর্ব্যক্তিকর দৃশ্যটি আরও ভালভাবে বুঝতে সহায়তা করেছে। যদি আমি কোনও সমাধানের পরামর্শ দিই, তবে আমি বলতে চাই যে আপনার তালিকার ভিউটিকে একটি পুনর্ব্যবহারযোগ্য ভিউয়ের সাথে প্রতিস্থাপন করুন।


1

@ শৈলেশ রোহিত প্রদত্ত সমাধানের উপরে নিখুঁতভাবে কাজ করে। কিছু কৌশল করতে হবে।

  1. যদি আপনি একই শ্রেণীর (মূল শ্রেণীর) মধ্যে সহায়ক শ্রেণি স্থাপন করে থাকেন তবে হেল্পার ক্লাসটিকে স্থিতিশীল হিসাবে তৈরি করুন এবং লাস্টলিস্টভিজ ()টি স্থির নয়।

  2. সর্বাধিক গুরুত্বপূর্ণ, "হেল্পার.গেটলিস্টভিউসাইজ (তালিকাভিউ) লিখুন;" "listView.setAdapter (myAdapter) এর মত প্রথমবারের জন্য অ্যাডাপ্টার সেট করার পরে বিবৃতি;" পাশাপাশি আপনি যখন কখনও "myAdapter.notifyDataSetChanged () ব্যবহার করছেন;"

  3. ব্যবহার নীচে দেখানো হয়েছে।

    listView = (লিস্টভিউ) সন্ধান ভিউবিআইআইডি (আর.আইডি.লিস্টভিউ); myAdapter = নতুন অ্যারেএডাপ্টার (এটি, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);

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


0

আমার মতে আপনি যখন সেটঅন্টিচলাইস্টেনার ওম পিতামাতা বা শিশু ব্যবহার করছেন তখন সন্তানের সাথে স্পর্শ করার সাথে সাথে পিতা-মাতার স্ক্রোলিং বন্ধ করুন অন্যথায় আপনি যখন পিতামাতার সাথে স্পর্শ করেন তখন সন্তানের স্ক্রোলিং বন্ধ করে দেন


0

লিস্টভিউ দিয়ে নয়, স্ক্রোলভিউ দিয়ে এটি ব্যবহার করে দেখুন।

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

আপনি কোড ফর্ম্যাট করতে পারেন ?? উত্তরের আধা কোলন সহ খালি লাইন রয়েছে এবং কোনও মন্তব্য নেই
তেজুস প্রসাদ

আপনি যদি আপনার বর্ধিত স্ক্রোলভিউ দিয়ে বেশি কিছু না করেন তবে আপনাকে আধা কোলনের সাহায্যে লাইনে কিছু লেখার দরকার নেই। সুতরাং শুধু তাদের অপসারণ। এবং ধরুন আপনার প্যাকেজের নাম 'com.me', তারপরে এক্সএমএল লেআউটে, << স্ক্রোলভিউ ... 'এর পরিবর্তে' <com.me.xScrolView ... 'ব্যবহার করুন
কিম সাংদেউক

0

অনুরোধডিসালোলোইনটারসেপ্ট টাচ এভেন্ট (বুলিয়ান বাতিল না করে ইন্টারসেপ্ট)

কল করা হয় যখন কোনও শিশু এই পিতামাতা এবং এর পূর্বপুরুষদের অনারসেপ্ট টুচেন্ট (মোশনইভেন্ট) এর মাধ্যমে স্পর্শ ইভেন্টগুলিতে বাধা দিতে চায় না। এই পিতামাতার এই কলটি তার পিতামাতার কাছে পৌঁছে দেওয়া উচিত। এই পিতামাতার অবশ্যই এই স্পর্শের সময়কালের জন্য এই অনুরোধটি মেনে চলতে হবে (অর্থাত্ এই পিতামাতার একটি আপ বা বাতিল পাওয়ার পরে কেবল পতাকাটি সাফ করুন।

এই উত্তরটি চেষ্টা করুন,

    listview.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

// Disallow the touch request for parent scroll on touch of child view
            scrollView.requestDisallowInterceptTouchEvent(true);

            int action = event.getActionMasked();
            switch (action) {
                case MotionEvent.ACTION_UP:
                    scrollView.requestDisallowInterceptTouchEvent(false);
                    break;
            }
            return false;
        }
    });

0

স্ক্রোলভিউয়ের ভিতরে রিসাইক্ল ভিউ দ্বারা তালিকাভুক্তটি প্রতিস্থাপন করুন। এটি অতিরিক্ত উত্স কোড ছাড়াই সুচারুভাবে চালিত হয়:

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

স্ক্রোলভিউর ভিতরে তালিকাভুক্তির জন্য নেস্টেডস্ক্রোলভিউ ব্যবহার করুন এটি খুব সহজেই এই কার্যকারিতাটি পরিচালনা করতে পারে:

<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

আমার এই ত্রুটি হয়েছে nd এবং আমার সমাধান নিম্নলিখিত হিসাবে অনুসরণ করছে:

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

}

২. এক্সএমএল ফাইলের জন্য উপরের কাস্টম ক্লাসটি ব্যবহার করুন

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

আপনার জন্য আশা করি সেরা।


এটি কি তালিকাভুক্তকে নেস্টডস্ক্রোলভিউয়ের ভিতরে স্ক্রোল করার অনুমতি দেয় ?? আমি মনে করি এটি আইটেমের আকার অনুযায়ী লিস্টভিউয়ের আকার পরিবর্তন করে।
কেজেজেবা 48

এটি 3 স্তরের বা 4 স্তরের মতো মাল্টিলেভেল এক্সপেন্ডেবললিস্টভিউয়ের জন্য কাজ করছে না। কোন সাহায্য??
কেজেজেভা 48

0

আমি এর জন্য একটি সমাধান পেয়েছি, স্ক্রোলভিউ ব্যবহার করার পরিবর্তে, আপনি addHeaderview এবং তালিকার ভিউ অ্যাডফুটারভিউ ব্যবহার করতে পারেন

এখানে আমার স্নিপেট,

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

এখন, তালিকা দর্শন সহ আপনার বিন্যাসটিও স্ক্রোল করা যায়। উপভোগ কর!!!


0

XML এর ভিতরে android.support.v4.widget.NestedScrollView দ্বারা স্ক্রোলভিউ প্রতিস্থাপন করুন। এটি চলে

1) এক্সএমএলে ব্যবহার করুন :::: 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) অবশেষে সিএস ফাইলে স্ক্রোলভিউ সনাক্ত করতে এই কোডটি ব্যবহার করুন:

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

এটি কি তালিকাভুক্তকে নেস্টডস্ক্রোলভিউয়ের ভিতরে স্ক্রোল করার অনুমতি দেয় ??
কেজেজেভা 48

এটি 3 স্তরের বা 4 স্তরের মতো মাল্টিলেভেল এক্সপেন্ডেবললিস্টভিউয়ের জন্য কাজ করছে না। কোন সাহায্য??
কেজেজেভা 48

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

আপনি কোনও স্ক্রোল ভিউতে একটি তালিকাভিউ যুক্ত করতে পারবেন না, কারণ তালিকার ভিউটিও স্কল করে এবং তালিকার ভিউ স্ক্রোল এবং স্ক্রোল ভিউ স্কোলের মধ্যে একটি সমন্বয় সমস্যা হবে। আপনি একটি কাস্টমলিস্ট ভিউ তৈরি করতে এবং এটিতে এই পদ্ধতিটি যুক্ত করতে পারেন।

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