android - ScrollView लेआउट के अंदर एक LinearLayout भरने के लिए ListAdapter का उपयोग करना




android-layout android-arrayadapter (3)

मुझे एक बहुत ही आम समस्या का सामना करना पड़ रहा है: मैंने एक गतिविधि की है और अब यह पता चला है कि इसे इस ScrollView भीतर कुछ आइटम प्रदर्शित करना चाहिए। ऐसा करने का सामान्य तरीका मौजूदा सूची ListAdapter का उपयोग करना होगा, इसे एक ListView और BOOM से कनेक्ट करें, मेरे पास मेरी वस्तुओं की सूची होगी।

लेकिन आपको ListView में नेस्टेड ListView नहीं ScrollView क्योंकि यह स्क्रॉलिंग को खराब करता है - यहां तक ​​कि एंड्रॉइड लिंट इसके बारे में शिकायत भी करता है।

तो मेरा सवाल यहाँ है:

मैं ListAdapter को एक LinearLayout या कुछ समान कैसे ListAdapter ?

मुझे पता है कि यह समाधान बहुत सारी वस्तुओं के लिए स्केल नहीं करेगा लेकिन मेरी सूचियां बहुत छोटी हैं (<10 आइटम) इसलिए विचारों का पुन: उपयोग वास्तव में आवश्यक नहीं है। निष्पादन के अनुसार मैं सभी विचारों को सीधे LinearLayout में रखने के साथ रह सकता हूं।

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

विचार?

अद्यतन: सही दिशा को प्रेरित करने के लिए मैं अपनी समस्या दिखाने के लिए नमूना लेआउट जोड़ता हूं:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/news_detail_layout"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:visibility="visible">


    <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#FFF"
            >

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical"
                android:paddingLeft="@dimen/news_detail_layout_side_padding"
                android:paddingRight="@dimen/news_detail_layout_side_padding"
                android:paddingTop="@dimen/news_detail_layout_vertical_padding"
                android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
                >

            <TextView
                    android:id="@+id/news_detail_date"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:gravity="center_horizontal"
                    android:text="LALALA"
                    android:textSize="@dimen/news_detail_date_height"
                    android:textColor="@color/font_black"
                    />

            <Gallery
                    android:id="@+id/news_detail_image"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:paddingTop="5dip"
                    android:paddingBottom="5dip"
                    />

            <TextView
                    android:id="@+id/news_detail_headline"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:gravity="center_horizontal"
                    android:text="Some awesome headline"
                    android:textSize="@dimen/news_detail_headline_height"
                    android:textColor="@color/font_black"
                    android:paddingTop="@dimen/news_detail_headline_paddingTop"
                    android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
                    />

            <TextView
                    android:id="@+id/news_detail_content"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:text="Here comes a lot of text so the scrollview is really needed."
                    android:textSize="@dimen/news_detail_content_height"
                    android:textColor="@color/font_black"
                    />

            <!---
                HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER. 
                They should be positioned at the end of the content, so making the scrollview smaller is not an option.
            ---->                        

        </LinearLayout>
    </ScrollView>
</LinearLayout>

अद्यतन 2 मैंने इसे समझना आसान बनाने के लिए शीर्षक बदल दिया (एक डाउनवोट मिला, दोह!)।


आपको शायद मैन्युअल रूप से LinearLayout अपने आइटम जोड़ना चाहिए:

LinearLayout layout = ... // Your linear layout.
ListAdapter adapter = ... // Your adapter.

final int adapterCount = adapter.getCount();

for (int i = 0; i < adapterCount; i++) {
  View item = adapter.getView(i, null, null);
  layout.addView(item);
}

संपादित करें : मैंने इस दृष्टिकोण को खारिज कर दिया जब मुझे लगभग 200 गैर-तुच्छ सूची सूची प्रदर्शित करने की आवश्यकता थी, यह बहुत धीमी है - नेक्सस 4 को मेरी "सूची" प्रदर्शित करने के लिए लगभग 2 सेकंड की आवश्यकता है, जो अस्वीकार्य था। तो मैं हेडर के साथ फ्लो के दृष्टिकोण में बदल गया। यह बहुत तेज़ी से काम करता है क्योंकि जब उपयोगकर्ता स्क्रॉल करता है, तब दृश्य दृश्यों की मांग पर सूची दृश्य बनाए जाते हैं।

फिर से शुरू करें: लेआउट के विचारों का मैन्युअल जोड़ कोड (जैसे संभावित रूप से कम चलने वाले हिस्सों और बग) के लिए आसान है, लेकिन प्रदर्शन समस्याओं से पीड़ित है, इसलिए यदि आपके पास 50 विचार या अधिक पसंद हैं, तो मैं हेडर दृष्टिकोण का उपयोग करने की सलाह देता हूं।

उदाहरण। असल में गतिविधि (या खंड) लेआउट इस तरह कुछ बदलता है (अब स्क्रॉलव्यू की आवश्यकता नहीं है):

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/my_top_layout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"/>

फिर header_layout onCreateView() (मैं एक टुकड़े के साथ एक उदाहरण का उपयोग करूंगा) आपको एक हेडर व्यू जोड़ने की आवश्यकता है और उसके बाद एडाप्टर सेट करें (मुझे लगता है कि हेडर संसाधन आईडी header_layout ):

ListView listView = (ListView) inflater.inflate(R.layout.my_top_layout, container, false);
View header = inflater.inflate(R.layout.header_layout, null);
// Initialize your header here.
listView.addHeaderView(header, null, false);

BaseAdapter adapter = // ... Initialize your adapter.
listView.setAdapter(adapter);

// Just as a bonus - if you want to do something with your list items:
view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // You can just use listView instead of parent casted to ListView.
    if (position >= ((ListView) parent).getHeaderViewsCount()) {
      // Note the usage of getItemAtPosition() instead of adapter's getItem() because
      // the latter does not take into account the header (which has position 0).
      Object obj = parent.getItemAtPosition(position);
      // Do something with your object.
    }
  }
});

मुख्य रूप से main.xml पर अपना दृश्य सेट करें, फिर row.xml से फुलाएं

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="450dp" >

        <ListView
            android:id="@+id/mainListView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@+id/size"
            android:layout_below="@+id/editText1"
            android:gravity="fill_vertical|fill_horizontal"
            android:horizontalSpacing="15dp"
            android:isScrollContainer="true"
            android:numColumns="1"
            android:padding="5dp"
            android:scrollbars="vertical"
            android:smoothScrollbar="true"
            android:stretchMode="columnWidth" >

</ListView>

    <TextView
        android:id="@+id/size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:background="#ff444444"
        android:gravity="center"
        android:text="TextView"
        android:textColor="#D3D3D3"
        android:textStyle="italic" />

    </EditText>

</RelativeLayout> 

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 
  android:paddingTop="3dp">

<TextView
  android:id="@+id/rowTextView"
  android:layout_width="0dip"
  android:layout_height="41dp"
  android:layout_margin="4dp"
  android:layout_weight="2.83"
  android:ellipsize="end"
  android:gravity="center_vertical"
  android:lines="1"
  android:text="John Doe"
  android:textColor="@color/color_white"
  android:textSize="23dp" >
</TextView>

</LinearLayout>

मैं हेडर व्यू समाधान के साथ रहूंगा। इसके साथ कुछ भी गलत नहीं है। फिलहाल मैं एक ही दृष्टिकोण का उपयोग कर एक गतिविधि को लागू करता हूं।

स्पष्ट रूप से "आइटम भाग" स्थैतिक (अलग-अलग आइटम गिनती बनाम फिक्स आइटम गिनती इत्यादि) से अधिक गतिशील रूप से होता है अन्यथा आप एडाप्टर का उपयोग करने के बारे में नहीं सोचेंगे। तो जब आपको एडाप्टर की आवश्यकता होती है तो ListView का उपयोग करें।

एडाप्टर से लीनियरलाउट को पॉप्युलेट करने वाले समाधान को कार्यान्वित करना एक कस्टम लेआउट के साथ ListView बनाने के अलावा कुछ और नहीं है।

बस मेरे 2 सेंट।







android-arrayadapter