0

ListView와 함께 ArrayAdpater를 사용하고 있습니다. 최상위 뷰 계층 구조 인 RelativeLayout ->LinearLayout -> 다른 내부보기를 포함하는 자체 레이아웃으로 각 항목을 사용자 정의했습니다.문제 설정보기 홀더 패턴의 매개 변수보기

보기를 재사용 중이며보기 홀더 패턴을 사용하고 있습니다. 내 getView() 어댑터는 내부 :

public static class ViewHolder{ 
    TextView tvMessage; 
    TextView tvUser; 
    LinearLayout llMessageBubble; 
} 

및 setRow 방법은 다음과 같이 정의된다

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

: ListView에가 처음으로 표시됩니다

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

은, 모든 좋은 작품, 그래서 LinearLayout (RelativeLayout 내부)이 문자열 사용자를 기준으로 왼쪽 또는 오른쪽으로 정렬 된 것을 볼 수 있습니다. 잠시 위아래로 스크롤하면 뭔가 잘못 될 수 있습니다. 특정 기간이 지나면 LinearLayout은 모두 부모의 오른쪽에 정렬됩니다. 재활용에 문제가있는 것 같습니다.

+0

그것은보기 홀더 패턴없이 작동합니까? – pskink

+0

방금 ​​시도했지만 NO,보기없이 작동하지 않습니다 홀더 패턴 – GVillani82

답변

1

보기에 규칙을 계속 추가하는 것 같습니다. 대신이의 :

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 

는 희망이 도움이 :

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

이 (당신의 요구에 맞는 또는 중 생성자)를보십시오.

감사 스테 Vangsgaard

+0

바로 @Steffen입니다. 오른쪽과 왼쪽 정렬의 할당이 상호 배타적이지 않으므로 두 매개 변수를 모두 TRUE로 설정할 수 있지만 분명히 시스템은이 중 하나만 적용합니다 (RIGHT가 기본값이어야 함). 고맙습니다! – GVillani82

+0

문제 없습니다. 나는 그것이 당신을 위해 일했기 때문에 기쁘다 :) –