2016-08-01 1 views
0

enter image description here 간단한 채팅 UI를 작성하고 있습니다. 나는이 작품에 9 패치 파일을 사용하고 있습니다.Android recycler보기 항목 레이아웃 매개 변수가 작동하지 않습니다.

일부 모의 데이터로 어댑터를 처음 초기화 할 때 제대로 작동하지만 런타임 중에 무언가를 추가하면 recyclerView 내의 레이아웃이 손상됩니다.

정렬을 설정하는 데 사용한 레이아웃 매개 변수가 작동하지 않지만 오류는 발생하지 않습니다. 사실 aligment는 작동하지만 크기는 wrap_content보다는 match_parent가됩니다.

내 어댑터 코드는 다음과 같습니다.

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() 메서드는 기존 규칙을 뷰에 유지합니다. 따라서 기존 규칙을 제거하지 않고 규칙을 동적으로 추가하면 원하는 효과가 나타나지 않습니다.

다음과 같은 스위치 케이스를 업데이트하십시오. API 레벨

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

> = 17, 새로운 방법은 기존의 규칙을 제거하기보다는 0으로 자신의 값을 설정 할 수 있습니다 우리는

params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); 

params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
을하게 사용할 수 있습니다
+0

좋습니다. 기존 규칙을 삭제하는 것을 잊었습니다. 귀하의 답변에 감사드립니다. – March3April4

0

ListView, Recycler View 또는 gridView Android 재사용 UI 객체와 같은 Android 레이아웃.

이러한 종류의 레이아웃을 사용하는 동안 if else 조건을 처리하기 위해 항상 기억해야합니다. 즉, 한 코드에서 볼 수있는 뷰를 사용하는 경우 해당 뷰를 보이지 않게하려면 다른 코드를 제공해야합니다. 따라서 listview 또는 recylerview 재사용 뷰는 항상 조건에 따라 올바른 뷰를 표시합니다.

이 질문에서 항목에 대한 항목을 추가하려면 ALIGNT_PARENT_RIGHT, 추가 항목에는 ALIGN_PARENT_LEFT을 추가했으나이를 LEFT에 표시하지 않도록 규칙을 추가하지 않았습니다.

그래서 당신은, 또는 removeRule (ALIGN_PARENT_LEFT) (API> = JELLY_BEAN_MR1, i.e17) 광산 및 addRule (ALIGN_PARENT_RIGHT, 0) 또는 removeRule (ALIGN_PARENT_RIGHT) (API> = JELLY_BEAN_MR1에 대한 addRule (0 ALIGN_PARENT_LEFT를) 사용할 수 있습니다 즉 17).