Android recyclerView项目布局参数不起作用

时间:2016-08-01 10:39:08

标签: android android-recyclerview relativelayout

enter image description here我正在编写一个简单的聊天用户界面。我正在使用九个补丁文件来完成这项工作。

当我第一次使用一些模拟数据初始化我的适配器时,它工作正常,但如果我在运行时添加一些内容,则recyclerView内的布局会中断。

它没有抛出任何错误,尽管我用来设置对齐的布局参数似乎不起作用。实际上,该对象有效,但它的大小变为match_parent而不是wrap_content。

这是我的适配器代码。

public class Adapter_Chat extends RecyclerView.Adapter<Adapter_Chat.Adapter_Chat_ViewHolder> {

private List<ChatMessageModel> data = Collections.EMPTY_LIST;

public Adapter_Chat(List<ChatMessageModel> data) {
    this.data = data;
}

@Override
public Adapter_Chat_ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new Adapter_Chat_ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rv_chat_message, parent, false));
}


public void addNewMessage(ChatMessageModel model) {
    data.add(model);
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(Adapter_Chat_ViewHolder holder, int position) {
    ChatMessageModel item = data.get(position);

    switch (item.getType()) {
        case mine: {
            holder.iv_chat_profileImage.setVisibility(View.INVISIBLE);
            holder.tv_item_chat_message_nameText.setVisibility(View.INVISIBLE);
            holder.tv_item_chat_message_contentText.setBackgroundResource(R.drawable.in_message_bg);
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.tv_item_chat_message_contentText.getLayoutParams();
            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
            params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
            params.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
            holder.tv_item_chat_message_contentText.setLayoutParams(params);

        }
        break;

        case others: {
            holder.iv_chat_profileImage.setVisibility(View.VISIBLE);
            holder.tv_item_chat_message_nameText.setVisibility(View.VISIBLE);
            holder.tv_item_chat_message_contentText.setBackgroundResource(R.drawable.out_message_bg);
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.tv_item_chat_message_contentText.getLayoutParams();
            params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
            params.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
            holder.tv_item_chat_message_contentText.setLayoutParams(params);

        }
        break;
    }


    holder.tv_item_chat_message_contentText.setText(item.getMessage().trim());
    holder.tv_item_chat_message_nameText.setText(item.getSender().trim());
}

@Override
public int getItemCount() {
    return data.size();
}

public class Adapter_Chat_ViewHolder extends RecyclerView.ViewHolder {

    public TextView tv_item_chat_message_nameText, tv_item_chat_message_contentText;
    public ImageView iv_chat_profileImage;

    public Adapter_Chat_ViewHolder(View itemView) {
        super(itemView);
        tv_item_chat_message_contentText = (TextView) itemView.findViewById(R.id.tv_item_chat_message_contentText);
        tv_item_chat_message_nameText = (TextView) itemView.findViewById(R.id.tv_item_chat_message_nameText);
        iv_chat_profileImage = (ImageView) itemView.findViewById(R.id.iv_chat_profileImage);
    }
}
}

布局是,

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

<ImageView
    android:src="@drawable/bg"
    android:scaleType="fitXY"
    android:layout_margin="16dp"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:id="@+id/iv_chat_profileImage" />

<TextView
    android:id="@+id/tv_item_chat_message_nameText"
    android:text="name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="64dp"
    android:layout_marginTop="16dp" />

<TextView
    android:layout_marginTop="32dp"
    android:layout_marginLeft="64dp"
    android:layout_marginRight="16dp"
    android:gravity="right"
    android:background="@drawable/out_message_bg"
    android:id="@+id/tv_item_chat_message_contentText"
    android:text="content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

我的onBindViewHolder方法有问题吗?是不是要改变这个项目的对齐方式?

2 个答案:

答案 0 :(得分:1)

addRule()方法会将现有规则添加到视图中。因此,动态添加规则而不删除现有规则将无法产生预期效果。

更新下面的开关案例。

switch (item.getType()) {
    case mine: {
        ---------- exisiting code ----------
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.tv_item_chat_message_contentText.getLayoutParams();
        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
        params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
        params.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
        holder.tv_item_chat_message_contentText.setLayoutParams(params);

    }
    break;

    case others: {
        ---------- exisiting code ----------          
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.tv_item_chat_message_contentText.getLayoutParams();
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
        params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
        params.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
        holder.tv_item_chat_message_contentText.setLayoutParams(params);

    }
    break;
}

对于API等级&gt; = 17 ,可以使用新方法删除任何现有规则,而不是将其值设置为0.我们可以使用

 params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);

变为

 params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);

答案 1 :(得分:0)

Android布局,如ListView,Recycler View或gridView Android重用UI对象。

在使用这种布局时,应始终记住处理if else条件,即如果您使用视图在一个编码中可见,则应该为该视图提供其他视图不可见,因此当列表视图或recylerview重用视图它将始终根据条件显示正确的视图。

在这个问题中,您还为我的ALIGNT_PARENT_RIGHT添加了规则,为其他人添加了ALIGN_PARENT_LEFT,但是您忘了添加规则,因为我没有在LEFT上显示它,而在其他地方显示RIGHT。

所以你可以使用addRule(ALIGN_PARENT_LEFT,0)或removeRule(ALIGN_PARENT_LEFT)(API&gt; = JELLY_BEAN_MR1,即17)for mine和addRule(ALIGN_PARENT_RIGHT,0)或removeRule(ALIGN_PARENT_RIGHT)(API&gt; = JELLY_BEAN_MR1 ,即17)我的。