2016-08-01 95 views
0

enter image description here我在写一个简单的聊天界面。我正在使用九个补丁文件来完成这项工作。Android recyclerView项目布局参数不起作用

当我第一次使用一些模拟数据初始化适配器时,它工作正常,但如果我在运行时添加了某些内容,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方法?是不是要改变项目的路线应该是这样?

回答

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级别> = 17,一个新的方法是可用的,以消除任何现有的规则,而不是设置其为0值我们可以使用

params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); 

变得

params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
+0

太好了。我忘了删除现有的规则。感谢您的回答。 – March3April4

0

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

使用这种布局时,应该总是记住处理if else条件,也就是说,如果您使用视图在一个编码中可见,则应该为其提供其他视图以使其不可见,所以当listview或recylerview重用视图,它将始终按照条件显示正确的视图。

在这个问题中,您还添加了ALIGNT_PARENT_RIGHT和其他ALIGNT_PARENT_RIGHT项的规则,但是您忘了添加规则,不会将其显示在我的LEFT和其他RIGHT上。

所以既可以使用addRule(ALIGN_PARENT_LEFT,0)或removeRule(ALIGN_PARENT_LEFT)(API> = JELLY_BEAN_MR1,i.e17),用于矿井和addRule(ALIGN_PARENT_RIGHT,0)或removeRule(ALIGN_PARENT_RIGHT)(API> = JELLY_BEAN_MR1,即17)。