마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카카오톡 채팅 UI 에관한 질문입니다.

0 추천

카카오톡과 비슷한 채팅UI를 만드는중에 안되는 부분이 있어서 질문합니다..

기존 소스

public class AwesomeAdapter extends BaseAdapter{
 private Context mContext;
 private ArrayList<Message> mMessages;

 

 public AwesomeAdapter(Context context, ArrayList<Message> messages) {
  super();
  this.mContext = context;
  this.mMessages = messages;
 }
 @Override
 public int getCount() {
  return mMessages.size();
 }
 @Override
 public Object getItem(int position) {  
  return mMessages.get(position);
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  Message message = (Message) this.getItem(position);

  ViewHolder holder;
  if(convertView == null)
  {
   holder = new ViewHolder();
   convertView = LayoutInflater.from(mContext).inflate(R.layout.sms_row, parent, false);
   holder.message = (TextView) convertView.findViewById(R.id.message_text);
   convertView.setTag(holder);
  }
  else
   holder = (ViewHolder) convertView.getTag();
  
  holder.message.setText(message.getMessage());
  
  LayoutParams lp = (LayoutParams) holder.message.getLayoutParams();
  //check if it is a status message then remove background, and change text color.
  if(message.isStatusMessage())
  {
   holder.message.setBackgroundDrawable(null);
   lp.gravity = Gravity.LEFT;
   holder.message.setTextColor(R.color.textFieldColor);
  }
  else
  {  
   //Check whether message is mine to show green background and align to right
   if(message.isMine())
   {
    holder.message.setBackgroundResource(R.drawable.speech_bubble_green);
    lp.gravity = Gravity.RIGHT;
   }
   //If not mine then it is from sender to show orange background and align to left
   else
   {
    holder.message.setBackgroundResource(R.drawable.speech_bubble_orange);
    lp.gravity = Gravity.LEFT;
   }
   holder.message.setLayoutParams(lp);
   holder.message.setTextColor(R.color.textColor); 
  }
  return convertView;
 }
 private static class ViewHolder
 {
  TextView message;
 }

 @Override
 public long getItemId(int position) {
  //Unimplemented, because we aren't using Sqlite.
  return position;
 }

}

( 수정중인 소스)

public class AwesomeAdapter extends BaseAdapter {
 private Context mContext;
 private ArrayList<Message> mMessages;

 public AwesomeAdapter(Context context, ArrayList<Message> messages) {
  super();
  this.mContext = context;
  this.mMessages = messages;
 }

 @Override
 public int getCount() {
  return mMessages.size();
 }

 @Override
 public Object getItem(int position) {
  return mMessages.get(position);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  
  LinearLayout linear = new LinearLayout(this.mContext);
  LinearLayout sublinear = new LinearLayout(this.mContext);
  
  
  TextView m_text = new TextView(this.mContext);
  m_text.setTag("textView");
  m_text.setTextSize(20);
  
  linear.addView(sublinear, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  sublinear.setPadding(5, 5, 5, 5);
  sublinear.addView(m_text, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) );
  
  Message message = (Message) this.getItem(position);
  ViewHolder holder;
  
  if (convertView == null) {
   holder = new ViewHolder();
   convertView = LayoutInflater.from(mContext).inflate(R.layout.sms_row, parent, false);
   holder.message = (TextView) convertView.findViewById(R.id.message_text);
//   convertView = (View) linear;
//   holder.message = (TextView) convertView.findViewWithTag("textView");

   convertView.setTag(holder);
  } else
   holder = (ViewHolder) convertView.getTag();

  holder.message.setText(message.getMessage());

  LayoutParams lp = (LayoutParams) holder.message.getLayoutParams();

  if (message.isStatusMessage()) {
   holder.message.setBackgroundDrawable(null);
   lp.gravity = Gravity.LEFT;
   holder.message.setTextColor(Color.BLACK);
  } else {
   if (message.isMine()) {
    if (message.isDateTime()) {}
    else
     holder.message
       .setBackgroundResource(R.drawable.speech_bubble_green);

    lp.gravity = Gravity.RIGHT;
   } else {
    if (message.isDateTime()) {
    } else
     holder.message
       .setBackgroundResource(R.drawable.speech_bubble_orange);
    lp.gravity = Gravity.LEFT;
   }
   holder.message.setLayoutParams(lp);
   holder.message.setTextColor(Color.BLACK);
  }
  return convertView;
 }

 private static class ViewHolder {
  TextView message;
 }

 @Override
 public long getItemId(int position) {
  return position;
 }
}

이처럼 바꾸었는데 기존의 XML을 사용할 경우엔 직접보내기한 내용은 우측정렬로 나오고 미리 설정해놓은 내용은 좌측 정렬이 되는데, 바꾸면서 전부 좌측정렬로 되네요... 어딜 수정해야할지..

sms_row.xml부분

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/message_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"
        android:textSize="20sp" />

</LinearLayout>

입니다...

motive463 (230 포인트) 님이 2015년 9월 16일 질문
motive463님이 2015년 9월 16일 수정

2개의 답변

0 추천
자바코드상에서 동적으로 붙여넣어주면 될것 같네요..
익명사용자 님이 2015년 9월 16일 답변
0 추천
내가 보낸 메세지인지, 타인이 보낸 메세지인지 상태값에 따라 뷰를 정의하시면 됩니다.

 

즉, 2개의 sms_row가 존재해야겠죠.

sms_row_me.xml (우측정렬)

sms_row_others.xml (좌측정렬)
개발자초심 (21,220 포인트) 님이 2015년 9월 16일 답변
아...질문이 잘못되었네요.. 위에 수정전 소스는 이상없이 잘돌아가는 것이고 아래 커스텀으로 xml을 사용없이 하는 부분에서 나는 오류 수정을 하고 싶은 것이에요 ㅎㅎ
...