滚动型的Android的ListView行不能完全显示 - 剪辑(Android ListView

2019-06-24 16:26发布

嵌入滚动型内一个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;
        }
    }

不幸的是,在情况下,当TextView的内部的文本被包裹,即使在多个行,由getMeasuredHeight()方法返回的行元件的高度是恒定的。 另外,getLineCount()称为上行元素中的TextView的返回1即使文本被包裹。

在另一方面,如果ListView控件嵌入在LinearLayout中,一切工作正常,并显示没有剪辑的完整列表。

你有任何建议,什么可能是错在这里? 我真的不喜欢手动测量列表元素的高度想法,它显然不工作,但为什么不能很好的android伸展滚动型内ListView控件,以适应它都在那里呢?

修剪的列表:

Answer 1:

这是一个不好的做法,封装ListView一个内ScrollView ,因为ListView控件本身包含滚动功能。 您应该实现不包含这种意见层次的解决方案,我希望它会做魔术:)



Answer 2:

使用通过创建此方法https://stackoverflow.com/users/205192/dougw

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


Answer 3:

与滚动型主要布局的这里的资源:

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

}       


Answer 4:

我在我的project.You同样的问题,需要建立内部滚动型简单的LinearLayout。 之后,你需要创建一个使用LayoutInflater 您的列表视图项XML 的新景观 。 创建后把所有的数据在新的视图,并添加到LinearLayout中为子视图

linearLayot.addView(newView, position_you_need).

希望它会帮助你!



Answer 5:

我把不使用滚动型内一个ListView元素心脏的建议,并决定使用稍微蛮力的方法来实现我需要什么。 由于存在需要显示我删除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" />

在活动类,我宣布这些意见5个占位符:

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

然后,每当接收到新的消息我使用ChatAdapter(I用于为ListView先前一样),并调用其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);
    }   
  }
}

我自认为唯一改变的是每一行的内容,而不是布局不以后再膨胀pariculat意见。 这意味着这里没有性能损失。

这基本上是一个手工执行一个ListView的与元件的有限最大数目。 然而这一次,滚动型是能很好地适应他们,并没有被剪掉。

对于由Layko建议的方法可与被编程实例化并加入到滚动型内的LinearLayout视图中采用的行的动态数。



Answer 6:

我能看到的ListView是ViewPager内; 另外一个简单的方法来解决这个问题是添加app:layout_behavior="@string/appbar_scrolling_view_behavior"到ViewPager在布局XML,如下图所示。

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

这是来晚了,但我希望它能帮助任何其他人。



Answer 7:

试试吧..创建所有视图后,在屏幕上添加波纹线了滚动位置(X,Y)

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

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


Answer 8:

我有一个类似的问题。 我有一个

RelativeLayout
  listView
  includeLayout  

在那里我有这个列表视图下一些底部导航

<include
    android:id="@+id/includeLayout"
    layout="@layout/bottom_nav_bar"

和我的ListView被截断 - 不采取头部和底部的导航之间提供完整的高度。 我想在这方面和其他线程提出了各种XML设置,但什么工作对我来说是增加

android:layout_alignBottom="@+id/includeLayout"

我的ListView。 这似乎拉列表视图下到谷底资产净值的顶部,这样的ListView现在使用的全部可用高度(和它滚动根据需要)。



Answer 9:

这对我的作品

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


文章来源: Android ListView rows in ScrollView not fully displayed - clipped