채팅방을 구현중입니다. (카톡방처럼요)
현재 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();
}