android - स्क्रॉलव्यू में एंड्रॉइड लिस्ट व्यू पंक्तियां पूरी तरह प्रदर्शित नहीं होती हैं-क्लिप




listview textview (6)

स्क्रॉलव्यू के अंदर ListView एम्बेड करते समय मुझे एक समस्या आई, या कम से कम वह जगह है जहां मुझे लगता है कि समस्या आती है। ListView तत्व एक काफी सरल है:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/general_background_list_middle" 
    android:paddingTop="4dp"
    android:paddingBottom="4dp"
    android:paddingRight="0dp"
    android:paddingLeft="0dp">

    <ImageView
        android:id="@+id/chat_friends_avatar"       
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_marginLeft="7dp"
        android:layout_marginRight="8dp"
        android:paddingRight="0dp" 
        android:paddingLeft="0dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/friends_icon_avatar_default"/>

    <TextView
        android:id="@+id/chat_message_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/chat_friends_avatar"
        android:layout_alignParentTop="true"
        android:layout_marginRight="35dp"
        android:maxLines="10"
        android:textSize="12dp"/>

    <TextView
        android:id="@+id/chat_friend_name"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        style="@style/SubText"
        android:layout_toRightOf="@id/chat_friends_avatar"      
        android:layout_below="@id/chat_message_text" />

    <TextView
        android:id="@+id/chat_message_time"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        android:layout_marginTop="3dp"
        style="@style/SubText"
        android:layout_alignParentRight="true"
        android:layout_below="@id/chat_message_text" />

</RelativeLayout>   

हालांकि, जब मैं स्क्रॉलव्यू में ऐसे तत्वों की एक सूची एम्बेड करता हूं, कुछ अन्य तत्वों के बीच, पंक्तियों को पूरी तरह से प्रदर्शित नहीं किया जाता है, तो पाठ को लपेटने पर उन्हें क्लिप (नीचे छवि देखें) बंद कर दिया जाता है। ListView को स्क्रॉलव्यू में निम्नानुसार तत्काल किया गया है:

<ListView
android:id="@+id/info_chat_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:cacheColorHint="@color/frame_background_color"
android:clickable="false"
android:divider="@null"
android:footerDividersEnabled="false"
android:focusable="false" >
</ListView> 

यदि ListView की ऊंचाई "wrap_content" पर सेट की गई है तो केवल पहला तत्व दिखाया गया है। यही कारण है कि मैं सूची की पंक्तियों की ऊंचाई की गणना करने के लिए एक विधि का उपयोग कर रहा हूं:

private int getCommentsListHeight() {
        if (mChatAdapter != null && mChatAdapter.getCount() != 0) {
            if (mChatList != null) {// && mCommentsListItemHeight == 0) {
                mCommentsListItemHeight = 0;
                for (int i = 0; i < mChatAdapter.getCount(); i++) {
                    // Get view item height
                    View viewItem = mChatAdapter
                            .getView(i, new View(OnAirActivity.this), mChatList);
                    viewItem.measure(0, 0);
                    Logger.d(LOGTAG, "View " + i + " measured height = " + viewItem.getMeasuredHeight());
                    mCommentsListItemHeight += viewItem.getMeasuredHeight();
                }
            }
            //return mChatAdapter.getCount() * mCommentsListItemHeight;
            return mCommentsListItemHeight;
        } else {
            return 0;
        }
    }

दुर्भाग्यवश, यदि टेक्स्टव्यू के अंदर का पाठ लपेटा गया है, तो कई लाइनों पर भी, getMeasuredHeight () विधि द्वारा लौटाई गई पंक्ति तत्व की ऊंचाई स्थिर है। इसके अलावा पंक्ति तत्व के अंदर TextView पर प्राप्त getLineCount () पाठ को लपेटने पर भी 1 लौटाता है।

दूसरी तरफ, यदि यह लिस्ट व्यू लाइनरलाइट में एम्बेडेड है, तो सब कुछ ठीक काम करता है और पूर्ण सूची बिना क्लिपिंग के प्रदर्शित होती है।

क्या आपके पास कोई सुझाव है कि यहां क्या गलत हो सकता है? मुझे वास्तव में सूची तत्वों की ऊंचाई को मापने के विचार को पसंद नहीं है और यह स्पष्ट रूप से काम नहीं करता है, लेकिन एंड्रॉइड अच्छी तरह से स्क्रॉलव्यू के अंदर ListView को उसमें फिट करने के लिए क्यों नहीं खींच सकता है?

क्लिप सूची:


इसे आज़माएं .. सभी दृश्य बनाने के बाद स्क्रीन पर स्क्रॉलव्यू स्थान के लिए बोले लाइन जोड़ें (एक्स, वाई)

  ScrollView scrollView = (ScrollView)findViewById(R.id.scrollView);

  scrollView.smoothScrollTo(0,0);// top location zero index

मुझे अपनी परियोजना में एक ही समस्या थी। आपको स्क्रॉलव्यू के अंदर सरल रैखिकलाइट बनाना होगा। इसके बाद आपको लेआउटइनफ्लेटर का उपयोग करके अपनी सूचीदृश्य आइटम xml के साथ नया दृश्य बनाना होगा । सृजन के बाद सभी डेटा नए दृश्य में डाल दें और लीनारलाउट में बाल दृश्य के रूप में जोड़ें :

linearLayot.addView(newView, position_you_need).

उम्मीद है कि यह आपकी मदद करेगा!


मैं ListView को ViewPager के अंदर देख सकता हूं; इस समस्या को हल करने के लिए एक अन्य सरल दृष्टिकोण app:layout_behavior="@string/appbar_scrolling_view_behavior" जोड़ने के लिए है app:layout_behavior="@string/appbar_scrolling_view_behavior" नीचे दिए गए अनुसार आपके लेआउट xml में ViewPager पर।

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

सूची के निचले हिस्से में एक ही व्यवहार को रोकने के लिए, आप android:layout_marginBottom="?attr/actionBarSize" भी जोड़ सकते हैं android:layout_marginBottom="?attr/actionBarSize" जैसे ViewPager को

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_marginBottom="?attr/actionBarSize"/>

यह देर से आ रहा है, लेकिन मुझे उम्मीद है कि यह किसी अन्य व्यक्ति की मदद करेगा।


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

<include android:id="@+id/info_comment_1" layout="@layout/chat_single_message" />
<include android:id="@+id/info_comment_2" layout="@layout/chat_single_message" />
<include android:id="@+id/info_comment_3" layout="@layout/chat_single_message" />
<include android:id="@+id/info_comment_4" layout="@layout/chat_single_message" />
<include android:id="@+id/info_comment_5" layout="@layout/chat_single_message" />

गतिविधि वर्ग में मैं इन विचारों के लिए पांच प्लेसहोल्डर घोषित करता हूं:

private RelativeLayout mChatMessages[] = new RelativeLayout[COMMENTS_NUMBER];

और उन्हें आरंभ करें:

mChatMessages[0] = (RelativeLayout) mMoreInfoLayout.findViewById(R.id.info_comment_1);
mChatMessages[1] = (RelativeLayout) mMoreInfoLayout.findViewById(R.id.info_comment_2);
mChatMessages[2] = (RelativeLayout) mMoreInfoLayout.findViewById(R.id.info_comment_3);
mChatMessages[3] = (RelativeLayout) mMoreInfoLayout.findViewById(R.id.info_comment_4);
mChatMessages[4] = (RelativeLayout) mMoreInfoLayout.findViewById(R.id.info_comment_5);

फिर, जब भी कोई नया संदेश प्राप्त होता है, तो मैं चैटएडाप्टर का उपयोग करता हूं (जैसा कि मैंने पहले सूची दृश्य के लिए उपयोग किया था) और इसकी getView () विधि को कॉल करें:

protected void updateChatMessages() {
  int msgCount = mChatAdapter.getCount();
  for (int i = 0; i < COMMENTS_NUMBER; i++) {
    if (msgCount <= i) {
      mChatMessages[i].setVisibility(View.GONE);
    } else {
      mChatMessages[i] = (RelativeLayout) mChatAdapter.getView(i, mChatMessages[i], null); 
      mChatMessages[i].setVisibility(View.VISIBLE);
    }   
  }
}

मैं प्रतिलिपि विचारों को कभी भी फुलाता नहीं हूं क्योंकि परिवर्तन केवल एक चीज है जो प्रत्येक पंक्ति की सामग्री है, लेआउट नहीं। इसका मतलब है कि यहां कोई प्रदर्शन जुर्माना नहीं है।

यह मूल रूप से एक सीमित दृश्य संख्या के साथ ListView का मैन्युअल कार्यान्वयन है। इस बार, हालांकि, स्क्रॉलव्यू उन्हें अच्छी तरह से फिट करने में सक्षम है और कुछ भी फिसल गया नहीं है।

पंक्तियों की एक गतिशील संख्या के लिए लेको द्वारा सुझाए गए दृष्टिकोण को प्रोग्रामेटिक रूप से तुरंत देखे जाने वाले विचारों के साथ नियोजित किया जा सकता है और स्क्रॉलव्यू के अंदर लिनियरलाइट में जोड़ा जा सकता है।


यह मेरे लिए काम करता है

<RelativeLayout                                          xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:padding="@dimen/activity_vertical_margin">

    <TextView
        android:id="@+id/tv_status"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="17sp"
        android:text="@string/text_list_devices" />

    <ListView
        android:id="@+id/lv_paired"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:cacheColorHint="#00000000"
        android:layout_above="@+id/signup_t"
        android:layout_below="@id/tv_status"
        />

    <Button

        android:id="@+id/signup_t"
        style="?android:textAppearanceSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textColor="@android:color/white"
        android:layout_alignParentBottom="true"
        android:text="Print All Records"
        android:typeface="sans"
        android:layout_marginLeft="45dp"
        android:layout_marginRight="45dp"
        android:textSize="24sp"
        android:background="@drawable/selector_for_button"
        android:textStyle="bold" />
</RelativeLayout>

स्क्रॉलव्यू के साथ मुख्य लेआउट का संसाधन यहां:

<ScrollView android:layout_height="fill_parent" android:layout_width="fill_parent">
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/parentLayout"/>
</ScrollView>

यहां आइटम डालने के लिए कोड:

parentLayout.removeAllViews();
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (int i = comments.size() - 1; i >= 0; i--) {
CommentInfo comment = comments.get(i);
View view = inflater.inflate(your_resource_id, null, false);

TextView commentsContent =(TextView)view.findViewById(R.id.commentContent);
if (commentsContent != null) {
    String data = String.format("%s (by %s, %s)",  comment.getCommentText(), comment.getUserName(),
        commentsContent.setTextSize(st.getTextSize());
    commentsContent.setText(data);

}

parentLayout.addView(view, 0);

}       






scrollview