为什么ListView在滚动的时候里面的文本内容会消失

文章标签: android,android-listview
2014-12-31 13:10:31     人阅读    

我创建了一个ListView,包含Items中有一个view和一个TextView

chat_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
 android:layout_width="match_parent"
 
 android:layout_height="90dp"
 
 android:id="@+id/chat_message_wrapper"
 
 xmlns:pixlui="http://schemas.android.com/apk/com.neopixl.pixlui">
<View
 
    android:id="@+id/message_indicator"
 
    android:layout_width="10dp"
 
    android:layout_height="90dp"/>



<com.neopixl.pixlui.components.textview.TextView
 
    android:id="@+id/message"
 
    android:layout_width="wrap_content"
 
    android:layout_height="wrap_content"
 
    android:textColor="@color/midnight_blue"
 
    android:padding="14dp"
 
    android:layout_centerVertical="true"/>
</RelativeLayout>


我的 Adapter class 中的getView()方法:

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



        if (view == null) {
 
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
            view = inflater.inflate(R.layout.chat_item, null);
 
        }



        ChatMessageItem item = getItem(position);
 
        if(item != null) {
 
            TextView messageTextView = (TextView) view.findViewById(R.id.message);



            ViewGroup messageWrapper = (ViewGroup) view.findViewById(R.id.chat_message_wrapper);
 
            View messageIndicatorView = view.findViewById(R.id.message_indicator);



            if(messageTextView != null) {
 
                messageTextView.setText(String.valueOf(item.getMessage()));
 
                RelativeLayout.LayoutParams textParams = (RelativeLayout.LayoutParams)messageTextView.getLayoutParams();
 
                RelativeLayout.LayoutParams indicatorParams = new RelativeLayout.LayoutParams(10, ViewGroup.LayoutParams.MATCH_PARENT);
 
                RelativeLayout.LayoutParams messageWrapperParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 90);
 
                if(item.getSender() == ChatMessageItem.Sender.ME) {



                    textParams.addRule(RelativeLayout.LEFT_OF, R.id.message_indicator);
 
                    indicatorParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
 
                    messageIndicatorView.setBackgroundColor(getContext().getResources().getColor(R.color.light_blue));



                }
 
                else if(item.getSender() == ChatMessageItem.Sender.OTHER) {
 
                    textParams.addRule(RelativeLayout.RIGHT_OF, R.id.message);
 
                    indicatorParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
 
                    messageIndicatorView.setBackgroundColor(getContext().getResources().getColor(R.color.silver));
 
                }



                messageTextView.setLayoutParams(textParams);
 
                messageIndicatorView.setLayoutParams(indicatorParams);
 
                messageWrapper.setLayoutParams(messageWrapperParams);





            }
 
        }
 
        return view;
 
    }

我加入下面的代码来保持每个item的高度,

RelativeLayout.LayoutParams messageWrapperParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 90);


问题时当我拉动滚动条的时候,text显示的内容不可见了,滚动的越多,消失的就约到,滚动到底,所有的文本都不可见了.
   如何解决这个问题?
我知道使用ViewHolder会有更好的性能,但是我想在解决这个问题后再替换

处理方法

问题时 ListView 回收和再利用views,给RelativeLayout.LayoutParams  @id/message textView实例添加了冲突的规则
特别是在这种情况下: 当一个服务于“ME”信息的view被“其他” 信息利用,反之亦然.

RelativeLayout.LayoutParams 维护了一个规则列表(实际上是一个动作数组,所以你不能再添加)

最新的而解决方法是 每次都是用一个最新的 RelativeLayout.LayoutParams ,你可以修改如下代码

RelativeLayout.LayoutParams textParams = 
 
    (RelativeLayout.LayoutParams)messageTextView.getLayoutParams();


RelativeLayout.LayoutParams textParams = 
 
    new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);


还有其他的解决方法,比如对不同类型的ListView使用不同的layout等等


原文地址:http://www.itmmd.com/201412/421.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

试图从DCIM中获取图片时候出现的奇怪问题   上一篇
下一篇  Eclipse 在更新本身和sdk之后无法创建新的Activity和 layout文件
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!