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

채팅방 레이아웃 작업 질문이요!!

0 추천

채팅방을 구현중입니다. (카톡방처럼요)

현재 xml 하나에 리스트뷰로 해놓고 또 하나의  row xml을 만들어놨습니다. 

대화는 정상적으로 리스트뷰에 차례대로 쌓이고 있고 row xml 에 레이아웃을 나누어 송신부는 오른쪽으로 

수신부는 왼쪽으로 텍스트가 뜨게 해놓고 

if (id.equals(txt[0])) {   // 내가 입력했을때 
holder.tv_title.setText(title);
holder.tv_title.setVisibility(View.VISIBLE);
holder.tv_sand.setVisibility(View.GONE);
}else if(mUserId.equals(txt[0])){  // 상대방 입력했을때
holder.tv_sand.setText(title);
holder.tv_sand.setVisibility(View.VISIBLE);
holder.tv_title.setVisibility(View.GONE);
}

소스 일부분입니다. 내가 입력했을때 visible 로 보이게 하고 반대쪽 텍스트는 gone 으로 숨겨둡니다.

이렇게 했을때  송신부에서 혼자 입력을 했을땐 정상적으로 우측엔 내가 한말이 보이고 

수신부도 정상적으로 왼쪽으로 뜨는데 .. 문제는 수신부쪽에서 채팅을 쓰면 

위에 리스트뷰에 쌓이던것 까지 몽땅 한쪽으로 옵니다.  설명을 드리면

a:송신부 화면

===================================

                                                               a : 안녕 

                                                               a: 반가워

====================================

b:수신부 화면

===================================

a:안녕

a:반가워

======================================

 

일단 a라는 아이가 채팅을 했을때 이렇게 정상입니다. 하지만

즉 b가 채팅을 쓰면  b 화면

================================

                                              a:안녕

                                              a:반가워

                                              b:안녕

================================

//좌측에 있던 a의 말이 우측으로 붙음

a 화면

==============================

a:안녕

a:반가워

b:안녕

=============================

//우측에 있던 a의 말이 좌측으로 붙음

이렇게 리스트뷰에 쌓여있던게 전체적으로 와따가따 합니다. 

어느부분을 고쳐줘야 할지 감도 안옵니다 고수님들 도와주세요 ㅠㅠ

====================리스트뷰 소스 일부분==========================

protected void onCreate(Bundle savedInstanceState) {

viewInit();

}

private void viewInit() {
 
lv_main = (ListView) findViewById(R.id.listView1);
 
mExamItemArrayList = new ArrayList<ExamEntity>();
mMainListAdapter = new MainListAdapter(getApplicationContext(),
mExamItemArrayList, R.layout.item_row);
lv_main.setStackFromBottom(true);
lv_main.setTranscriptMode(lv_main.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv_main.setAdapter(mMainListAdapter);
}
 
 
private void setContent() {
 
ExamEntity mExamEntity = new ExamEntity();
mExamEntity.title = text;
 
mExamItemArrayList.add(mExamEntity);
 
mMainListAdapter.notifyDataSetChanged();
}
 
 
 
public class MainListAdapter extends BaseAdapter {
 
final String TAG = "MainListAdapter";
 
public Context mContext;
private ArrayList<ExamEntity> mExamItemArrayList;
private LayoutInflater mLayoutInflater;
int resource;
 
public MainListAdapter(Context context,
ArrayList<ExamEntity> mExamItemArrayList, int resource) {
mContext = context;
this.mExamItemArrayList = mExamItemArrayList;
this.mLayoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.resource = resource;
}
 
@Override
public int getCount() {
// TODO Auto-generated method stub
return mExamItemArrayList.size();
}
 
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
 
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
 
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
 
Holder holder = new Holder();
if (convertView == null) {
convertView = mLayoutInflater.inflate(resource, null);
 
// find resource
                       
holder.tv_title = (TextView) convertView
.findViewById(R.id.tv_title);
holder.tv_Utitle = (TextView) convertView
.findViewById(R.id.tv_Utitle);
convertView.setTag(holder);
 
} else {
holder = (Holder) convertView.getTag();
}
 
// set content
String title = mExamItemArrayList.get(position).title;
 
if (id.equals(txt[0])) {
holder.tv_title.setText(title);
holder.tv_title.setVisibility(View.VISIBLE);
holder.tv_Utitle.setVisibility(View.GONE);
}else if(mUserId.equals(txt[0])){
holder.tv_Utitle.setText(title);
holder.tv_Utitle.setVisibility(View.VISIBLE);
holder.tv_title.setVisibility(View.GONE);
}
// set click listener
/*holder.tv_title.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
 
Toast.makeText(mContext,
mExamItemArrayList.get(position).title,
Toast.LENGTH_SHORT).show();
}
});*/
 
 
return convertView;
}
 
private class Holder {
public TextView tv_Utitle;
public TextView tv_title;
}
 
public class ExamEntity {
 
public String title;
 
}
 
}

=========== 리스트뷰 동작 시점  =============

if (mUserId.equals(txtArr[0])) {
handler.post(new Runnable() {
public void run() {
text = txtArr[1];
setContent();
}
});
}else if(id.equals(txtArr[0])){
handler.post(new Runnable() {
public void run() {
text = txtArr[1];
setContent();
}
숀화이트 (3,310 포인트) 님이 2014년 3월 3일 질문
숀화이트님이 2014년 3월 3일 수정

1개의 답변

0 추천

이 둘에 대해서 찾아보세요

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}
aucd29 (218,390 포인트) 님이 2014년 3월 3일 답변
...