Android 在视图保持架模式中设置视图参数的问题

Android 在视图保持架模式中设置视图参数的问题,android,android-layout,android-listview,android-linearlayout,android-relativelayout,Android,Android Layout,Android Listview,Android Linearlayout,Android Relativelayout,我正在将ArrayAdpater与ListView一起使用。我用自己的布局定制了每个项目,其中包括从顶层视图层次结构,一个RelativeLayout->LinearLayout->其他内部视图 我正在循环使用视图,并使用视图持有者模式。适配器中我的getView()是: @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView =

我正在将ArrayAdpater与ListView一起使用。我用自己的布局定制了每个项目,其中包括从顶层视图层次结构,一个
RelativeLayout
->
LinearLayout
->其他内部视图

我正在循环使用视图,并使用视图持有者模式。适配器中我的
getView()
是:

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

        if(rowView == null){
            LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);            
            rowView = inflater.inflate(R.layout.custom_row, parent, false);

            holder = new ViewHolder();
            holder.tvMessage = (TextView)rowView.findViewById(R.id.chat_text_message);
            holder.tvUser = (TextView)rowView.findViewById(R.id.user);
            holder.llMessageBubble = (LinearLayout)rowView.findViewById(R.id.message_bubble);

            rowView.setTag(holder);
        }else {

            holder = (ViewHolder) rowView.getTag();
        }
            setRow(holder, messageList.get(position).getUser(),messageList.get(position).getTextMessage());

        return rowView;
    }
在哪里

public static class ViewHolder{
     TextView tvMessage;
     TextView tvUser;
     LinearLayout llMessageBubble;
}
setRow方法定义为:

    private void setRow(ViewHolder holder, String user, String message){
        if(user.equals("Me")){

            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)holder.llMessageBubble.getLayoutParams();
            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

            holder.llMessageBubble.setLayoutParams(params);
        }else{

            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)holder.llMessageBubble.getLayoutParams();
            params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

            holder.llMessageBubble.setLayoutParams(params);
        }
        holder.tvMessage.setText(message);
        holder.tvUser.setText(user);
    }
第一次显示ListView时,一切正常,因此我可以看到LinearLayout(内部RelativeLayout)根据字符串用户向左或向右对齐。
但是,当我上下滚动一段时间时,出现了一些问题:经过一段时间后,所有的
LinearLayout
s都在父级中向右对齐。似乎回收过程中出现了问题。

您似乎一直在向视图中添加规则。与此相反:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)holder.llMessageBubble.getLayoutParams();
尝试以下方法(或任何适合您需要的构造函数):

希望能有帮助

问候
Steffen Vangsgaard

没有视图固定器模式它能工作吗?我刚刚试过,不,没有视图固定器模式我不能工作你是对的@Steffen。我没有注意到左右对齐的分配不是相互排斥的,因此我可以将这两个参数都设置为TRUE,但很明显,系统只应用其中一个参数(右应该是默认值)。非常感谢。
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);