আমি কোনও লিস্টভিউকে কীভাবে কোনও স্ক্রলভিউয়ের সংক্ষিপ্ত না করে রেখে দিতে পারি?


351

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

সুতরাং প্রশ্নটি হল, আপনি কীভাবে একটি তালিকা ভিউকে তার ন্যূনতম উচ্চতায় ভেঙে না ফেলে স্ক্রোলভিউতে স্থাপন করতে পারেন?


11
কারণ যখন কোনও ডিভাইস টাচ স্ক্রিন ব্যবহার করে তখন দুটি নেস্টেড স্ক্রোলযোগ্য ধারকগুলির মধ্যে পার্থক্য করার কোনও ভাল উপায় নেই। এটি traditionalতিহ্যবাহী ডেস্কটপগুলিতে কাজ করে যেখানে আপনি কোনও ধারক স্ক্রোল করতে স্ক্রোলবারটি ব্যবহার করেন।
রোমেন গাই

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

5
আমার ট্যাবলেট অ্যাপ্লিকেশানের জন্য এটিতে কেবল হোঁচট খেয়েছে। যদিও এটি স্মার্টফোনে খুব খারাপ বলে মনে হচ্ছে না, এটি এমন ট্যাবলেটে ভয়াবহ, যেখানে আপনি সহজেই সিদ্ধান্ত নিতে পারেন যে ব্যবহারকারী বাইরের বা অভ্যন্তরীণ স্ক্রোলভিউকে স্ক্রোল করতে চায় কিনা। @ ডগডাব্লু: ভয়ঙ্কর নকশা, আমি সম্মত।
জেলিফিশ

4
@ রোমাইন - এটি মোটামুটি পুরানো পোস্ট, তাই আমি ভাবছি যে যদি এখানে উদ্বেগগুলি ইতিমধ্যে মোকাবেলা করা হয়েছে, বা কোনও স্ক্রোলভিউর ভিতরে তালিকাভিউ ব্যবহার করার কোনও ভাল উপায় এখনও নেই (বা এমন কোনও বিকল্প যা ম্যানুয়ালি কোডিংয়ের সাথে জড়িত না একটি লিনিয়ারলাউট মধ্যে একটি তালিকাভিউ সমস্ত কুলুঙ্গি?
জিম

3
@ জিম: "বা এমন একটি বিকল্প যা কোনও লিয়ারলাইআউটে একটি তালিকাভিউয়ের সমস্ত কৌতুক ম্যানুয়ালি কোডিংয়ের সাথে জড়িত না" - সমস্ত কিছু ভিতরে রাখুন ListViewListViewএকাধিক সারি শৈলী, প্লাস অ-নির্বাচনযোগ্য সারি থাকতে পারে।
কমন্সওয়্যার

উত্তর:


196

ListViewএটিকে স্ক্রোল না করার জন্য একটি ব্যবহার করা অত্যন্ত ব্যয়বহুল এবং এর পুরো উদ্দেশ্যটির বিপরীতে ListView। আপনার এটি করা উচিত নয়LinearLayoutপরিবর্তে কেবল একটি ব্যবহার করুন।


69
উত্সটি আমার হতে হবে যেহেতু আমি গত 2 বা 3 বছর ধরে লিস্টভিউয়ের দায়িত্বে আছি :) তালিকাভিউ অ্যাডাপ্টারের ব্যবহারকে অনুকূল করে তুলতে অনেক অতিরিক্ত কাজ করে। এটির চারপাশে কাজ করার চেষ্টা করার পরেও লাস্টভিউকে লিনিয়ারলআউটটি করতে হবে না এমন অনেক কাজ করতে পারে। আমি বিশদে যাব না কারণ এখানে তালিকাভিউ বাস্তবায়নের ব্যাখ্যা দেওয়ার মতো পর্যাপ্ত জায়গা নেই। ঘটনাগুলি স্পর্শের ক্ষেত্রে লিস্টভিউয়ের সাথে যে আচরণ করে তাও এটি সমাধান করবে না। এর কোনও গ্যারান্টি নেই যে আজ যদি আপনার হ্যাকটি কাজ করে তবে এটি ভবিষ্যতে প্রকাশে এখনও কাজ করবে। লিনিয়ারলআউট ব্যবহার করা খুব বেশি কাজ হবে না।
রোমেন গাই

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

6
আপনি সহজেই একটি স্থির পদ্ধতি লিখতে পারেন যা কোনও অ্যাডাপ্টারের থেকে লিনিয়ারলআউট তৈরি করে।
রোমেন গাই

125
এটি কোনও উত্তর নয় How can I put a ListView into a ScrollView without it collapsing?... আপনি বলতে পারেন যে এটি করা উচিত নয়, তবে এটি কীভাবে করবেন সে সম্পর্কে একটি উত্তরও দিন, এটি একটি ভাল উত্তর। আপনি জানেন যে একটি তালিকাভিউতে স্ক্রোলিং ছাড়াও কিছু অন্যান্য দুর্দান্ত বৈশিষ্ট্য রয়েছে, এমন বৈশিষ্ট্যগুলি যা লিনিয়ারলআউট নেই।
জোর্হে ফুয়েন্তেস গঞ্জালেজ

44
যদি আপনার এমন একটি অঞ্চল থাকে যেখানে তালিকাগুলি + অন্যান্য দর্শন রয়েছে এবং আপনি সমস্ত কিছু এক হিসাবে স্ক্রোল করতে চান? এটি কোনও স্ক্রোলভিউয়ের মধ্যে তালিকাভিউ রাখার জন্য যুক্তিসঙ্গত ব্যবহারের মতো বলে মনে হচ্ছে। লিনিয়ারলআউট সাথে তালিকার ভিউ প্রতিস্থাপন করা কোনও সমাধান নয় কারণ তখন আপনি অ্যাডাপ্টার ব্যবহার করতে পারবেন না।
ব্যারি ফ্রুটম্যান

262

এখানে আমার সমাধান। আমি অ্যান্ড্রয়েড প্ল্যাটফর্মে মোটামুটি নতুন, এবং আমি নিশ্চিত যে এটি কিছুটা হ্যাচিশ, বিশেষত। সরাসরি কল করার বিষয়ে এবং LayoutParams.heightসরাসরি সম্পত্তি নির্ধারণের অংশে , তবে এটি কার্যকর।

আপনাকে যা করতে হবে তা হ'ল কল Utility.setListViewHeightBasedOnChildren(yourListView)এবং এটির আইটেমগুলির উচ্চতাটি ঠিকঠাক করে দেওয়ার জন্য এটির আকার পরিবর্তন করা হবে।

public class Utility {
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();

        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            if (listItem instanceof ViewGroup) {
                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
             }

             listItem.measure(0, 0);
             totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
}

66
আপনি সবেমাত্র একটি খুব ব্যয়বহুল লিনিয়ারলআউট পুনরায় তৈরি করেছেন :)
রোমেন গাই

82
ক এর LinearLayoutসমস্ত সহজাত বৈশিষ্ট্য ListViewনা থাকলে - এতে ডিভাইডার, শিরোনাম / পাদচরণ দর্শন, ফোনের ইউআই থিমের রংগুলির সাথে মেলে এমন একটি তালিকা নির্বাচক নেই, সত্যই, আপনি স্ক্রোল করতে পারবেন না এর কোনও কারণ নেই there's অভ্যন্তরীণ পাত্রে এটি শেষ না হওয়া পর্যন্ত এবং তারপরে স্পর্শ ইভেন্টগুলিকে আটকাতে বন্ধ করুন যাতে বাইরের ধারক স্ক্রোলগুলি। আপনি যখন নিজের স্ক্রল হুইলটি ব্যবহার করছেন তখন প্রতিটি ডেস্কটপ ব্রাউজার এটি করে। অ্যান্ড্রয়েড নিজেই নেস্টেড স্ক্রোলিং পরিচালনা করতে পারে যদি আপনি ট্র্যাকবলের মাধ্যমে চলাচল করেন তবে কেন স্পর্শের মাধ্যমে নয়?
নীল ট্রাফট

29
listItem.measure(0,0)যদি তালিকা আইটেমটি ভিউগ্রুপ উদাহরণ হয় তবে একটি এনপিই নিক্ষেপ করবে। আমি এর আগে নিম্নলিখিতগুলি যুক্ত করেছি listItem.measure:if (listItem instanceof ViewGroup) listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
সিক্লাব.এফ

4
0 ছাড়া অন্য প্যাডিং সহ তালিকাগুলির জন্য ঠিক করুন:int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
পল

8
দুর্ভাগ্যক্রমে এই পদ্ধতিটি কিছুটা ত্রুটিযুক্ত যখন ListViewভেরিয়েবল উচ্চতার আইটেমগুলি ধারণ করতে পারে। getMeasuredHeight()প্রকৃত উচ্চতার বিপরীতে কেবলমাত্র টার্গেট করা সর্বনিম্ন উচ্চতা প্রত্যাবর্তনের কল । আমি getHeight()পরিবর্তে ব্যবহার করার চেষ্টা করেছি , তবে এটি 0 ফিরে আসে anyone কীভাবে এটির কাছে যাওয়ার বিষয়ে কারও কি অন্তর্দৃষ্টি আছে?
ম্যাট হাগিনস

89

এই হ 'ল হবে কাজ ............
আপনি শুধু আপনার প্রতিস্থাপন আছে <ScrollView ></ScrollView>এই সঙ্গে লেআউট XML ফাইল 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;
    }
}

4
এটা খুব ভাল. স্ক্রোলভিউয়ের অভ্যন্তরে গুগল ম্যাপস টুকরোটি রাখা সম্ভব করে তোলে এবং এটি এখনও জুম ইন / আউট কাজ করে। ধন্যবাদ।
ম্যাগনাস জোহানসন

এই পদ্ধতির সাথে কি কেউ কোনও ধারণা লক্ষ্য করেছে? এটি এত সহজ আমি ভীত: ও
মারিজা মিলোসেভিক

1
ভাল সমাধান, গ্রহণযোগ্য উত্তর +1 হওয়া উচিত! আমি এটিকে নীচের উত্তরটির সাথে মিশিয়েছি (ডানজোনড থেকে), এবং এটি দুর্দান্ত কাজ!
tanou

1
এটি কেবলমাত্র আমার জন্য একই সময়ে কাজ করা বাচ্চাদের স্ক্রোলিং এবং ক্লিক করে fix বড় ধন্যবাদ
pellyadolfo

25

ListViewএকটি ভিতরে রাখার জন্য insted ScrollView, আমরা ListViewএকটি হিসাবে ব্যবহার করতে পারেন ScrollView। যে জিনিসগুলিতে ListViewথাকতে হবে সেগুলি ভিতরে রেখে দেওয়া যেতে পারে ListView। শীর্ষে এবং নীচে অন্যান্য লেআউটগুলি ListViewশিরোলেখ এবং পাদলেখের লেআউট যুক্ত করে স্থাপন করা যেতে পারে ListView। সুতরাং পুরো ListViewআপনাকে স্ক্রোলিংয়ের একটি অভিজ্ঞতা দেবে।


3
এটি ইমো সবচেয়ে মার্জিত এবং উপযুক্ত উত্তর। : এই পদ্ধতির উপর অধিক বিবরণের জন্য, এই উত্তর দেখুন stackoverflow.com/a/20475821/1221537
adamdport

21

আছে প্রচুর পরিস্থিতিতে যেখানে এটি ধারণা অনেক তোলে ListView এর আছে একটি ScrollView হবে।

এখানে ডগডাব্লুয়ের পরামর্শের ভিত্তিতে কোড ... একটি খণ্ডে কাজ করে, কম স্মৃতি গ্রহণ করে।

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0) {
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
        }
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

প্রতিটি এম্বেড থাকা তালিকার ভিউতে সেটলিস্টভিউহাইটবিজেডঅন চিলড্রেন (লিস্টভিউ) কল করুন।


তালিকা-আইটেমগুলি পরিবর্তনশীল আকারের হলে এটি কাজ করবে না, অর্থাত্ কিছু পাঠ্যদর্শন যা একাধিক লাইনের উপরে প্রসারিত হয়। কোন সমাধান?
খোবাইব

এখানে আমার মন্তব্য চেক করুন - এটি নিখুঁত সমাধান দেয় - stackoverflow.com/a/23315696/1433187
Khobaib

আমার জন্য এপিআই 19 দিয়ে কাজ করেছে, তবে এপিআই 23 এর সাথে নয়: এখানে এটি তালিকার ভিউয়ের নীচে অনেক বেশি সাদা স্থান যুক্ত করেছে।
ভাগ্য 10

17

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

public class ListViewForEmbeddingInScrollView extends ListView {
    public ListViewForEmbeddingInScrollView(Context context) {
        super(context);
    }

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

    public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 4, MeasureSpec.AT_MOST));
    }
}

উচ্চতা মাপের স্পেসকে খুব বড় আকারের (পূর্ণসংখ্যক। MAX_VALUE >> 4) দিয়ে AT_MOST হতে চালিত করার কারণে তালিকা ভিউ তার সমস্ত শিশুকে প্রদত্ত (খুব বড়) উচ্চতা পর্যন্ত পরিমাপ করে এবং সেই অনুযায়ী তার উচ্চতা নির্ধারণ করে।

এটি কয়েকটি কারণে অন্যান্য সমাধানগুলির চেয়ে আরও ভাল কাজ করে:

  1. এটি সবকিছু সঠিকভাবে পরিমাপ করে (প্যাডিং, বিভাজক)
  2. এটি পরিমাপ পাসের সময় তালিকাগুলির পরিমাপ করে
  3. # 2 এর কারণে এটি কোনও অতিরিক্ত কোড ছাড়াই প্রস্থ বা আইটেমের সংখ্যায় সঠিকভাবে পরিবর্তন পরিচালনা করে

নেতিবাচক দিক থেকে, আপনি তর্ক করতে পারেন যে এটি করা এসডিকে অনাবন্ধিত আচরণের উপর নির্ভর করছে যা পরিবর্তিত হতে পারে। অন্যদিকে, আপনি তর্ক করতে পারেন যে এভাবেই র‌্যাপ_ কনটেন্টকে তালিকাভিউয়ের সাথে সত্যই কাজ করা উচিত এবং বর্তমান র‌্যাপ_কন্টেন্ট আচরণটি কেবল ভেঙে গেছে।

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

যাইহোক, আমি বিশ্বাস করি যে আপনি সংখ্যার তালিকা আইটেমের সাথে কাজ করার সময় এটি একটি সঠিক বৈধ পন্থা। লিনিয়ারলআউটের তুলনায় এটি অকার্যকর হতে পারে তবে আইটেমের সংখ্যা যখন কম থাকে তখন লিনিয়ারলআউট ব্যবহার করা অপ্রয়োজনীয় অপ্টিমাইজেশন এবং অতএব অপ্রয়োজনীয় জটিলতা।


তালিকা দর্শনীয় ভেরিয়েবল উচ্চতার আইটেমগুলির সাথেও কাজ করে!
ডেনি

@ জেসন ওয়াই এটি কী করে, পূর্ণসংখ্যক। ম্যাক্স_ভ্যালু >> 4 এর অর্থ ?? সেখানে 4 কি ??
কেজেজেবা 48

আমার জন্য @ জেসন ওয়াই কাজটি কেবলমাত্র পূর্ণসংখ্যায় পরিণত হয়েছে worked MAX_VALUE >> 2 কে পূর্ণসংখ্যায় পরিণত হয়েছে MA MAX_VALUE >> 21 এর জন্য worked কেন এমন? এছাড়াও এটি স্ক্রোলভিউর সাথে কাজ করে নেস্টেডস্ক্রোলভিউয়ের সাথে নয়।
কেজেজেবা 48

13

এটির জন্য একটি বিল্ট-ইন সেটিং রয়েছে। স্ক্রোলভিউতে:

android:fillViewport="true"

জাভাতে,

mScrollView.setFillViewport(true);

রোমেন গাই এটি গভীরতার সাথে এখানে ব্যাখ্যা করেছেন: http://www.curious-creature.org/2010/08/15/scrolviews-handy-trick/


2
এটি লিনিয়ারলআউটের পক্ষে কাজ করে যেমন তিনি প্রদর্শিত হয়। এটি কোনও তালিকাভিউয়ের জন্য কাজ করে না। এই পোস্টের তারিখের উপর ভিত্তি করে, আমি কল্পনা করি যে তিনি এটি তার বিকল্পের উদাহরণ দেওয়ার জন্য লিখেছিলেন, তবে এটি প্রশ্নের উত্তর দেয় না।
ডগডব্লিউ

এটি দ্রুত সমাধান

10

আপনি কাস্টম তালিকাভিউ তৈরি করুন যা স্ক্রোলযোগ্য নয়

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

আপনার লেআউট রিসোর্স ফাইলে

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <!-- com.Example Changed with your Package name -->

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lv_nonscroll_list" >

        <!-- Your another layout in scroll view -->

    </RelativeLayout>
</RelativeLayout>

জাভা ফাইলে

তালিকার মত পরিবর্তনের মতো আপনার কাস্টমলিস্টভিউয়ের একটি অবজেক্ট তৈরি করুন: ননস্ক্রোললিস্টভিউ নন_স্ক্রোল_লিস্ট = (ননস্ক্রোললিস্টভিউ) ফাইন্ড ভিউবিআইআইডি (আর.আইডি.এলভি_নোনস্ক্রোল_লিস্ট);


8

আমরা দুটি স্ক্রোলিং সিমুলটেনিউইসলি ব্যবহার করতে পারি না W আমাদের তালিকাগুলির মোট দৈর্ঘ্য হবে এবং মোট উচ্চতার সাথে তালিকাগুলি প্রসারিত করব .তখন আমরা স্ক্রোলভিউতে সরাসরি তালিকা বা লিনিয়ারলআউট ব্যবহার করতে পারি কারণ স্ক্রোলভিউয়ের সরাসরি একটি সন্তান রয়েছে। আপনার কোডে সেটলিস্টভিউহাইটবাইজডনচিল্ডেন (এলভি) পদ্ধতিটি অনুলিপি করুন এবং তালিকা ভিউটি প্রসারিত করুন তারপরে আপনি স্ক্রোলভিউয়ের ভিতরে তালিকাগুলি ব্যবহার করতে পারেন। \ লেআউট এক্সএমএল ফাইল

<?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:layout_width="fill_parent"
        android:layout_height="fill_parent"
         android:background="#1D1D1D"
        android:orientation="vertical"
        android:scrollbars="none" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#1D1D1D"
            android:orientation="vertical" >

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="40dip"
                android:background="#333"
                android:gravity="center_vertical"
                android:paddingLeft="8dip"
                android:text="First ListView"
                android:textColor="#C7C7C7"
                android:textSize="20sp" />

            <ListView
                android:id="@+id/first_listview"
                android:layout_width="260dp"
                android:layout_height="wrap_content"
                android:divider="#00000000"
               android:listSelector="#ff0000"
                android:scrollbars="none" />

               <TextView
                android:layout_width="fill_parent"
                android:layout_height="40dip"
                android:background="#333"
                android:gravity="center_vertical"
                android:paddingLeft="8dip"
                android:text="Second ListView"
                android:textColor="#C7C7C7"
                android:textSize="20sp" />

            <ListView
                android:id="@+id/secondList"
                android:layout_width="260dp"
                android:layout_height="wrap_content"
                android:divider="#00000000"
                android:listSelector="#ffcc00"
                android:scrollbars="none" />
  </LinearLayout>
  </ScrollView>

   </LinearLayout>

ক্রিয়াকলাপ শ্রেণিতে অনক্রিট পদ্ধতি:

 import java.util.ArrayList;
  import android.app.Activity;
 import android.os.Bundle;
 import android.view.Menu;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.ListAdapter;
  import android.widget.ListView;

   public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview_inside_scrollview);
    ListView list_first=(ListView) findViewById(R.id.first_listview);
    ListView list_second=(ListView) findViewById(R.id.secondList);
    ArrayList<String> list=new ArrayList<String>();
    for(int x=0;x<30;x++)
    {
        list.add("Item "+x);
    }

       ArrayAdapter<String> adapter=new ArrayAdapter<String>(getApplicationContext(), 
          android.R.layout.simple_list_item_1,list);               
      list_first.setAdapter(adapter);

     setListViewHeightBasedOnChildren(list_first);

      list_second.setAdapter(adapter);

    setListViewHeightBasedOnChildren(list_second);
   }



   public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
      }

ভাল ফিক্স! এটি প্রয়োজন মতো কাজ করে। ধন্যবাদ। আমার ক্ষেত্রে তালিকার আগে আমার কাছে পুরো ভিউ রয়েছে এবং সঠিক সমাধানটি হল ভিউতে কেবল একটি উল্লম্ব স্ক্রোল।
প্রবাদবায়ু

4

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

public void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            if (listItem instanceof ViewGroup)
                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }

কোথায় এই পদ্ধতি কল?
ধ্রুপাল

তালিকাভিউ তৈরির পরে অ্যাডাপ্টার সেট করার পরে।
পরিত্যক্ত কার্ট

এটি দীর্ঘ তালিকায় খুব ধীর হয়ে যায়।
কাকান

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

3

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

তুমি অর্জন করার জন্য কি চেষ্টা করতেছ?


4
আমি একটি স্ক্রোলভিউয়ের মধ্যে একটি তালিকা ভিউ সম্পন্ন করার চেষ্টা করছি। আমি চাই না যে আমার লিস্টভিউটি স্ক্রোলযোগ্য হোক, তবে মাইলিস্টভিউ.স্রোলএনবলড = মিথ্যা সেট করার জন্য কোনও সাধারণ সম্পত্তি নেই;
ডগডব্লিউ

রোমেন গাই যেমন বলেছিলেন, এটি খুব একটা তালিকাভিউয়ের উদ্দেশ্য নয়। একটি তালিকাভিউ এমন একটি দৃষ্টিভঙ্গি যা আইটেমের দীর্ঘ তালিকা প্রদর্শন করার জন্য অনুকূলিত করা হয়েছে, অনেকগুলি জটিল যুক্তি সহ ভিউয়ের অলস লোডিং, ভিউ পুনঃব্যবহার ইত্যাদির জন্য ইত্যাদি etc. আপনি যদি কেবল উল্লম্ব কলামে একগুচ্ছ আইটেম চান তবে লিনিয়ারলআউট ব্যবহার করুন।
চেরিল সাইমন

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

2
একেবারে একমত। মনে রাখবেন যে লিনিয়ারলআউট সহ একটি বিদ্যমান অ্যাডাপ্টার ব্যবহার করা সহজ তবে আমি তালিকার ভিউ সরবরাহকারী সমস্ত সুন্দর জিনিস চাই, ডিভাইডারের মতো এবং আমি নিজে প্রয়োগ করার মতো মনে করি না।
আর্টেম রাশাকোভস্কিই

1
@ আর্টেমরুসাকোভস্কি আপনি কি দয়া করে লাস্টারলয়েউটে লিস্টভিউকে কোনও বিদ্যমান অ্যাডাপ্টারের সাথে প্রতিস্থাপনের সহজ উপায়টি ব্যাখ্যা করতে পারেন?
হ্যাপিহার্ডিক

3

আমি @ ডগডাব্লু'সকে Utilityসি # তে রূপান্তরিত করেছি (জ্যামারিনে ব্যবহৃত)। নীচে তালিকাতে স্থির-উচ্চতার আইটেমগুলির জন্য সূক্ষ্ম কাজ করে এবং বেশিরভাগ সূক্ষ্ম হতে চলেছে বা কমপক্ষে একটি ভাল সূচনা হবে, যদি কেবলমাত্র কিছু আইটেম স্ট্যান্ডার্ড আইটেমের চেয়ে কিছুটা বড় হয়।

// You will need to put this Utility class into a code file including various
// libraries, I found that I needed at least System, Linq, Android.Views and 
// Android.Widget.
using System;
using System.Linq;
using Android.Views;
using Android.Widget;

namespace UtilityNamespace  // whatever you like, obviously!
{
    public class Utility
    {
        public static void setListViewHeightBasedOnChildren (ListView listView)
        {
            if (listView.Adapter == null) {
                // pre-condition
                return;
            }

            int totalHeight = listView.PaddingTop + listView.PaddingBottom;
            for (int i = 0; i < listView.Count; i++) {
                View listItem = listView.Adapter.GetView (i, null, listView);
                if (listItem.GetType () == typeof(ViewGroup)) {
                    listItem.LayoutParameters = new LinearLayout.LayoutParams (ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
                }
                listItem.Measure (0, 0);
                totalHeight += listItem.MeasuredHeight;
            }

            listView.LayoutParameters.Height = totalHeight + (listView.DividerHeight * (listView.Count - 1));
        }
    }
}

ধন্যবাদ @ ডগডব্লিউ, যখন আমাকে নরপলিজসকোডের সাথে কাজ করতে হয়েছিল তখন এটি আমাকে একটি শক্ত জায়গা থেকে সরিয়ে দেয়। :-)


একটি প্রশ্ন: আপনি কখন এই setListViewHeightBasedOnChildren()পদ্ধতিটি কল করেছিলেন ? কারণ এটি আমার জন্য সব সময় কাজ করে না।
আলেকজান্দ্রি ডি

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

ঘটনাটি হল আমার তালিকাগুলি আমার ভিউমোডেলে তৈরি করা হয়েছে। ইউটিলিটি.সেটলিস্টভিউহাইট বেইসড চিলড্রেনের (আপনারলিস্টভিউ) কোনও কল করার আগে আমার তালিকাগুলি আমার দৃষ্টিতে তৈরি হওয়া আমি কীভাবে অপেক্ষা করতে পারি?
আলেকজান্দ্রি ডি

3

এটিই আমার পক্ষে কাজ করেছে:

ললিপপ এর পরে আপনি ব্যবহার করতে পারেন

yourtListView.setNestedScrollingEnabled(true);

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


এটি অ্যাপকম্প্যাট ক্রিয়াকলাপে ডায়ালগফ্র্যাগমেন্টে এপিআই 22 এ আমার তালিকার ভিউগুলিতে কোনও প্রভাব ফেলেনি। তারা এখনও ভেঙে পড়ে। @ ফিল রায়ানের উত্তর কিছুটা পরিবর্তন নিয়ে কাজ করেছে।
হাকান Çেলিক এমকে 1

3

আগে এটি সম্ভব ছিল না। তবে নতুন অ্যাপকম্প্যাট লাইব্রেরি এবং ডিজাইনের লাইব্রেরি প্রকাশের সাথে সাথে এটি অর্জন করা যায়।

আপনাকে কেবল নেস্টডস্ক্রোলভিউ https://developer.android.com/references/android/support/v4/widget/NestedScrollView.html ব্যবহার করতে হবে

আমি জানিনা এটি লিস্টভিউয়ের সাথে কাজ করবে বা করবে না তবে রিসাইক্লারউউয়ের সাথে কাজ করে।

টুকিটাকি সংকেতলিপি:

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

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

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

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

1
এটি রিসাইক্লারভিউয়ের সাথে কাজ করে তবে তালিকার ভিউয়ের সাথে নয়। থানেক্স
IgniteCoders

2

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

db = new dbhelper(this);

 cursor = db.dbCursor();
int count = cursor.getCount();
if (count > 0)
{    
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.layoutId);
startManagingCursor(YOUR_CURSOR);

YOUR_ADAPTER(**or SimpleCursorAdapter **) adapter = new YOUR_ADAPTER(this,
    R.layout.itemLayout, cursor, arrayOrWhatever, R.id.textViewId,
    this.getApplication());

int i;
for (i = 0; i < count; i++){
  View listItem = adapter.getView(i,null,null);
  linearLayout.addView(listItem);
   }
}

দ্রষ্টব্য: আপনি যদি এটি ব্যবহার notifyDataSetChanged();করেন তবে মতামতগুলি পুনরায় রঙ করা হবে না বলে লক্ষ্য হিসাবে কাজ করবে না। আপনার চারপাশের কোনও কাজের প্রয়োজন হলে এটি করুন

adapter.registerDataSetObserver(new DataSetObserver() {

            @Override
            public void onChanged() {
                super.onChanged();
                removeAndRedrawViews();

            }

        });

2

একটি স্ক্রোলভিউয়ের মধ্যে তালিকাভিউ ব্যবহার করার সময় দুটি সমস্যা রয়েছে।

1- তালিকাভিউ অবশ্যই তার বাচ্চাদের উচ্চতায় প্রসারিত করতে হবে। এই তালিকাটি এটি সমাধান করুন:

public class ListViewExpanded extends ListView
{
    public ListViewExpanded(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setDividerHeight(0);
    }

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

বিভাজকের উচ্চতা 0 হতে হবে, পরিবর্তে সারিগুলিতে প্যাডিং ব্যবহার করুন।

2- তালিকাভিউ স্পর্শ ইভেন্টগুলি গ্রাস করে তাই স্ক্রোলভিউ যথারীতি স্ক্রল করা যায় না। এই স্ক্রোলভিউ এই সমস্যার সমাধান করে:

public class ScrollViewInterceptor extends ScrollView
{
    float startY;

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e)
    {
        onTouchEvent(e);
        if (e.getAction() == MotionEvent.ACTION_DOWN) startY = e.getY();
        return (e.getAction() == MotionEvent.ACTION_MOVE) && (Math.abs(startY - e.getY()) > 50);
    }
}

এই কৌশলটি আমি খুঁজে পেয়েছি!


2

আমি যে সমাধানটি ব্যবহার করি তা হ'ল লিস্টভিউয়ের শিরোনাম এবং ভিভাল ভিউ হিসাবে স্ক্রোলভিউয়ের সমস্ত সামগ্রী (তালিকার উপরে এবং তালিকার নীচে থাকা উচিত) add

সুতরাং এটি কাজ করে, রূপান্তরটি এটি কীভাবে হওয়া উচিত তা পুনরায় আকার দেওয়া হয়েছে।


1

বিনয়ের কোডের জন্য ধন্যবাদ এখানে আমার কোড যা আপনি যখন কোনও স্ক্রোলভিউয়ের ভিতরে তালিকাগুলি রাখতে পারবেন না তবুও আপনার এমন কিছু দরকার

LayoutInflater li = LayoutInflater.from(this);

                RelativeLayout parent = (RelativeLayout) this.findViewById(R.id.relativeLayoutCliente);

                int recent = 0;

                for(Contatto contatto : contatti)
                {
                    View inflated_layout = li.inflate(R.layout.header_listview_contatti, layout, false);


                    inflated_layout.setId(contatto.getId());
                    ((TextView)inflated_layout.findViewById(R.id.textViewDescrizione)).setText(contatto.getDescrizione());
                    ((TextView)inflated_layout.findViewById(R.id.textViewIndirizzo)).setText(contatto.getIndirizzo());
                    ((TextView)inflated_layout.findViewById(R.id.textViewTelefono)).setText(contatto.getTelefono());
                    ((TextView)inflated_layout.findViewById(R.id.textViewMobile)).setText(contatto.getMobile());
                    ((TextView)inflated_layout.findViewById(R.id.textViewFax)).setText(contatto.getFax());
                    ((TextView)inflated_layout.findViewById(R.id.textViewEmail)).setText(contatto.getEmail());



                    RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

                    if (recent == 0)
                    {
                        relativeParams.addRule(RelativeLayout.BELOW, R.id.headerListViewContatti);
                    }
                    else
                    {
                        relativeParams.addRule(RelativeLayout.BELOW, recent);
                    }
                    recent = inflated_layout.getId();

                    inflated_layout.setLayoutParams(relativeParams);
                    //inflated_layout.setLayoutParams( new RelativeLayout.LayoutParams(source));

                    parent.addView(inflated_layout);
                }

আপেক্ষিক লেআউট কোনও স্ক্রোলভিউয়ের মধ্যে থাকে তাই এটি সমস্তই স্ক্রোলযোগ্য হয়ে যায় :)


1

@ জজুনোদ এর উত্তরে এখানে একটি ছোট্ট পরিবর্তন আছে যা আমার এটিকে পুরোপুরি কার্যকর করতে হবে:

public static void setListViewHeightBasedOnChildren(ListView listView)
{
    ListAdapter listAdapter = listView.getAdapter();
    if(listAdapter == null) return;
    if(listAdapter.getCount() <= 1) return;

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
    int totalHeight = 0;
    View view = null;
    for(int i = 0; i < listAdapter.getCount(); i++)
    {
        view = listAdapter.getView(i, view, listView);
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

: হাই, আপনার উত্তর বেশিরভাগ সময় কাজ করে, তবে তালিকার ভিউতে একটি শিরোনাম দর্শন এবং পায়ের দৃশ্য থাকলে তা কার্যকর হয় না। আপনি কি এটা পরীক্ষা করে দেখবেন?
hguser

তালিকা-আইটেমগুলি ভেরিয়েবল আকারের হলে আমার একটি সমাধান দরকার, অর্থাত্ কিছু পাঠ্যদর্শন যা একাধিক লাইনের উপরে প্রসারিত হয়। যেকোনো পরামর্শ?
খোবাইব

1

এটি চেষ্টা করুন, এটি আমার জন্য কাজ করে, আমি কোথায় পেয়েছি তা ভুলে গিয়েছিলাম, কোথাও স্ট্যাক ওভারফ্লোতে, কেন এটি কাজ করে না তা ব্যাখ্যা করার জন্য আমি এখানে নেই, তবে এটি উত্তরটি :)।

    final ListView AturIsiPulsaDataIsiPulsa = (ListView) findViewById(R.id.listAturIsiPulsaDataIsiPulsa);
    AturIsiPulsaDataIsiPulsa.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;
        }
    });
    AturIsiPulsaDataIsiPulsa.setClickable(true);
    AturIsiPulsaDataIsiPulsa.setAdapter(AturIsiPulsaDataIsiPulsaAdapter);

সম্পাদনা করুন!, আমি কোডটি পেয়েছি শেষ পর্যন্ত খুঁজে পেয়েছি। এখানে ! : স্ক্রোলভিউয়ের ভিতরে তালিকাভিউ অ্যান্ড্রয়েডে স্ক্রল করছে না


এটি কীভাবে স্ক্রোলভিউ মিথস্ক্রিয়া হারাতে রোধ করবে তা কভার করে, তবে প্রশ্নটি তালিকা দর্শনের উচ্চতা বজায় রাখার বিষয়ে ছিল।
পরিত্যক্ত কার্ট

1

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

import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListAdapter;

public class StretchedListView extends LinearLayout {

private final DataSetObserver dataSetObserver;
private ListAdapter adapter;
private OnItemClickListener onItemClickListener;

public StretchedListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOrientation(LinearLayout.VERTICAL);
    this.dataSetObserver = new DataSetObserver() {
        @Override
        public void onChanged() {
            syncDataFromAdapter();
            super.onChanged();
        }

        @Override
        public void onInvalidated() {
            syncDataFromAdapter();
            super.onInvalidated();
        }
    };
}

public void setAdapter(ListAdapter adapter) {
    ensureDataSetObserverIsUnregistered();

    this.adapter = adapter;
    if (this.adapter != null) {
        this.adapter.registerDataSetObserver(dataSetObserver);
    }
    syncDataFromAdapter();
}

protected void ensureDataSetObserverIsUnregistered() {
    if (this.adapter != null) {
        this.adapter.unregisterDataSetObserver(dataSetObserver);
    }
}

public Object getItemAtPosition(int position) {
    return adapter != null ? adapter.getItem(position) : null;
}

public void setSelection(int i) {
    getChildAt(i).setSelected(true);
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

public ListAdapter getAdapter() {
    return adapter;
}

public int getCount() {
    return adapter != null ? adapter.getCount() : 0;
}

private void syncDataFromAdapter() {
    removeAllViews();
    if (adapter != null) {
        int count = adapter.getCount();
        for (int i = 0; i < count; i++) {
            View view = adapter.getView(i, null, this);
            boolean enabled = adapter.isEnabled(i);
            if (enabled) {
                final int position = i;
                final long id = adapter.getItemId(position);
                view.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if (onItemClickListener != null) {
                            onItemClickListener.onItemClick(null, v, position, id);
                        }
                    }
                });
            }
            addView(view);

        }
    }
}
}

1

এই সমস্ত উত্তর ভুল! আপনি যদি কোনও লিস্টভিউ কোনও স্ক্রোল ভিউতে রাখার চেষ্টা করছেন তবে আপনার নকশাটি পুনরায় চিন্তা করা উচিত। আপনি একটি স্ক্রোলভিউতে একটি স্ক্রোলভিউ রাখার চেষ্টা করছেন। তালিকার সাথে হস্তক্ষেপ করা তালিকার কার্যকারিতা ক্ষতিগ্রস্থ করবে। এটি অ্যান্ড্রয়েড দ্বারা এটির মতো ডিজাইন করা হয়েছিল।

আপনি যদি তালিকাকে অন্য উপাদানগুলির মতো একই স্ক্রোলটিতে রাখতে চান তবে আপনাকে যা করতে হবে তা হল আপনার অ্যাডাপ্টারে একটি সাধারণ সুইচ বিবৃতি ব্যবহার করে তালিকার শীর্ষে অন্য আইটেমগুলি যুক্ত করতে হবে:

class MyAdapter extends ArrayAdapter{

    public MyAdapter(Context context, int resource, List objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         ViewItem viewType = getItem(position);

        switch(viewType.type){
            case TEXTVIEW:
                convertView = layouteInflater.inflate(R.layout.textView1, parent, false);

                break;
            case LISTITEM:
                convertView = layouteInflater.inflate(R.layout.listItem, parent, false);

                break;            }


        return convertView;
    }


}

তালিকার অ্যাডাপ্টার সমস্ত কিছু পরিচালনা করতে পারে যেহেতু এটি কেবল দৃশ্যমানকেই রেন্ডার করে।


0

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

আপনি যদি অন্য কোনও স্ক্রোলিং ভিউয়ের ভিতরে আসলে কোনও স্ক্রলিং তালিকাভিও চান তবে এটি কোনও লাভ করবে না, তবে অন্যথায় এটি কমপক্ষে আপনাকে একটি ধারণা দেবে।

আপনি স্ক্রোল করতে চান এমন সমস্ত সামগ্রী একত্রিত করতে এবং তালিকাভিউয়ের অ্যাডাপ্টারটিকে এতে সেট করতে আপনার একটি কাস্টম অ্যাডাপ্টার তৈরি করতে হবে।

আমার কাছে স্যাম্পল কোড হ্যান্ডি নেই তবে আপনি যদি এর মতো কিছু চান।

<ListView/>

(other content)

<ListView/>

তারপরে আপনাকে এমন একটি অ্যাডাপ্টার তৈরি করতে হবে যা সেই সমস্ত সামগ্রীর প্রতিনিধিত্ব করে। লিস্টভিউ / অ্যাডাপ্টারগুলি বিভিন্ন ধরণের হ্যান্ডেল করার জন্য যথেষ্ট স্মার্ট, তবে আপনাকে নিজে অ্যাডাপ্টারটি লিখতে হবে।

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


0

আমরা যখন ListViewভিতরে রাখি তখন ScrollViewদুটি সমস্যা দেখা দেয়। একটি হ'ল ScrollViewতার বাচ্চাদের UNSPECIFIED মোডে পরিমাপ করে, তাই ListViewকেবলমাত্র একটি আইটেম সামঞ্জস্য করার জন্য তার নিজস্ব উচ্চতা নির্ধারণ করে (কেন জানি না), অন্যটি ScrollViewস্পর্শ ইভেন্টটিকে বাধা দেয়ListView স্ক্রোল হয় না।

তবে আমরা কিছুটা আলাদা করে ভিতরে রেখে দিতে পারি place এই পোস্টটি , আমার দ্বারা, কর্মক্ষেত্রের ব্যাখ্যা দেয়। এই কর্মপরিকল্পনা দ্বারা আমরা পাশাপাশি এর পুনর্ব্যবহারযোগ্য বৈশিষ্ট্যটি ধরে রাখতে পারি ।ListViewScrollViewListView


0

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



-1

এখানে কোডটির আমার সংস্করণটি তালিকা তালিকার মোট উচ্চতার গণনা করে। এটি আমার জন্য কাজ করে:

   public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null || listAdapter.getCount() < 2) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(BCTDApp.getDisplaySize().width, View.MeasureSpec.AT_MOST);
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup) listItem.setLayoutParams(lp);
        listItem.measure(widthMeasureSpec, heightMeasureSpec);
        totalHeight += listItem.getMeasuredHeight();
    }

    totalHeight += listView.getPaddingTop() + listView.getPaddingBottom();
    totalHeight += (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight;
    listView.setLayoutParams(params);
    listView.requestLayout();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.