0
socket.io와 채팅하려고합니다. 같은 사용자의 메시지 사용자 이름 만 표시됩니다. 예를 들어listview에서 동일한 사용자의 두 번째 사용자 메시지 이름을 숨기는 방법은 무엇입니까?
: 코드 아래
Username | Message
item: Hans: hello (first message with name of user)
item: How are you? (second message without username)
item: Look: Thanks, good!
item: you? (second message without username)
은 때때로 잘못된 때때로 잘 작동합니다. listview를 스크롤하는 동안 동일한 사용자의 두 번째 사용자 이름이 표시되는 경우가 있으며 다른 시간은 숨겨져 있습니다. 같은 사용자의 두 번째 사용자 이름을 어떻게 숨기거나 나눌 수 있습니까?
간단한 코드 :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
mViewHolder = new MyViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
id = position > 0 ? getItem(position - 1).getID() : -1;
ListData currentListData = getItem(position);
mViewHolder.Title.setText(currentListData.getTitle());
mViewHolder.Desc.setText(currentListData.getDescription());
if (id == -1 && id != currentListData.getID()) {
mViewHolder.Title.setVisibility(View.VISIBLE);
} else {
mViewHolder.Title.setVisibility(View.GONE);
}
return convertView;
}
하는 당신은의 getView()가 당신이 때처럼 순차적 인 위치로 호출 될 것이라고 확신 할 수 없다 :
package com.example.seadog.fb_dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyBaseAdapter extends BaseAdapter {
Context context;
ArrayList<ListData> items = new ArrayList();
LayoutInflater inflater;
int id = 0;
public MyBaseAdapter(Context context, ArrayList items) {
this.context = context;
this.items = items;
inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return items.size();
}
@Override
public ListData getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
mViewHolder = new MyViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
ListData currentListData = getItem(position);
mViewHolder.Title.setText(currentListData.getTitle());
mViewHolder.Desc.setText(currentListData.getDescription());
if (id != currentListData.getID() || position == 0) {
mViewHolder.Title.setVisibility(View.VISIBLE);
}else{
mViewHolder.Title.setVisibility(View.GONE);
}
id = currentListData.getID();
return convertView;
}
private class MyViewHolder {
TextView Title, Desc;
public MyViewHolder(View item) {
Title = (TextView) item.findViewById(R.id.txtitem);
Desc = (TextView) item.findViewById(R.id.descitem);
}
}
}
'id = position> 0? getItem (position - 1) .getID() : 0;'이 문제를 해결하고'if (id! = currentListData.getID())'조건을 변경했습니다. 이제 나는 그것이 좋은 일이라는 것을 알았다. getView()가 순차적으로 호출된다는 것을 어떻게 확신 할 수 있습니까? 나는 확신해야한다. – SeaDog
'getView()'는 생성/재 작성해야하는 목록 항목에 따라 런타임에 호출됩니다. 사용자 작업 (스크롤링)에 따라 달라 지므로 순차적 위치로 호출되는 것을 보장 할 수 없습니다. 내 대답에 안전하게 코드를 사용할 수 있습니다. –
OK, 저는 솔루션을 사용하고 있습니다. 고맙습니다! – SeaDog