这是我的自定义适配器,我第一次使用它而不重复
public class MessageAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<MessageList> MessageList;
private final Context context;
public MessageAdapter(Activity activity, List<MessageList> MessageList, Context c) {
this.activity = activity;
this.MessageList = MessageList;
this.context = c;
}
@Override
public int getCount() {
return MessageList.size();
}
@Override
public Object getItem(int location) {
return MessageList.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder mHolder;
final MessageList m = MessageList.get(position);
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
if (m.getDir().equals("left")) {
convertView = inflater.inflate(R.layout.left_message, null);
} else if (m.getDir().equals("right")) {
convertView = inflater.inflate(R.layout.right_message, null);
}
mHolder = new ViewHolder();
mHolder.message = (LinearLayout) convertView.findViewById(R.id.messages);
convertView.setTag(mHolder);
for(String message : m.getMessageList()){
TextView text = new MyTextView(activity);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
p.setMargins(0, 0, 0, 2);
text.setLayoutParams(p);
text.setText(message);
text.setPadding(8,8,8,8);
text.setTextSize(14f);
}
}
else {
mHolder = (ViewHolder) convertView.getTag();
}
Log.d("ffffffffffffffffff",""+m.getMessageList().size());
return convertView;
}
private class ViewHolder {
private LinearLayout message;
}
}
这是结果
但是当我收到新数据并且我想在执行
之后添加它 adapter.notifyDataSetChanged();
我们可以看到它重复数据它必须添加新数据我将它添加到arrayList不重复旧项目我确定我的ArrayList正确
最后让我们看看我添加新数据 首先,它的工作没有问题
private List<MessageList> Message_List = new ArrayList<MessageList>();
adapter = new MessageAdapter(this, Message_List, getApplicationContext());
message_list.setAdapter(adapter);
现在我将首次添加数据
try {
JSONArray jsonarray = new JSONArray(data);
for (int i = 0; i < jsonarray.length(); i++) {
try {
JSONObject jsonobject = jsonarray.getJSONObject(i);
MessageList messageList = new MessageList();
String fname = jsonobject.getString("Fname");
int user_id = jsonobject.getInt("user_id");
String message = jsonobject.getString("message");
String date = jsonobject.getString("date");
String direction = jsonobject.getString("direction");
JSONArray MessageArry = jsonobject.getJSONArray("message");
ArrayList<String> ListMessage = new ArrayList<String>();
for (int j = 0; j < MessageArry.length(); j++) {
ListMessage.add((String) MessageArry.get(j));
}
messageList.setUser_id(user_id);
messageList.setMessage(message);
messageList.setDate(date);
messageList.setFname(fname);
messageList.setDir(direction);
messageList.setMessageList(ListMessage);
Message_List.add(messageList);
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
adapter.notifyDataSetChanged();
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
数据使用了它的
String data = "[ { \"direction\": \"left\",\"user_id\": \"50\",\"Fname\": \"Mohamed Mohamed\", \"status\": \"online\" , \"m_status\": \"sent\", \"date\": \"9:20\", \"message\": [\"hello\",\"hahhahah ok ok say hello\",\"-_-\",\"where are \",\"u ?\"] }, { \"direction\": \"right\",\"user_id\": \"50\",\"Fname\": \"Mustafa Naser\", \"status\": \"online\" , \"m_status\": \"sent\", \"date\": \"10:20\", \"message\": [\"hello\",\"what u want :/\",\"xD\"] }]";
当我获得新数据并且我想要追加它时,我添加了这样的数据
try {
JSONObject jsonobject1 = new JSONObject(json);
MessageList messageList = new MessageList();
String fname = jsonobject1.getString("name");
int user_id = jsonobject1.getInt("id");
String message = jsonobject1.getString("message");
String date = jsonobject1.getString("date");
String direction = jsonobject1.getString("direction");
ArrayList<String> ListMessage = new ArrayList<String>();
for (int j = 0; j < 1; j++) {
ListMessage.add(message);
}
messageList.setUser_id(user_id);
messageList.setMessage(message);
messageList.setDate(date);
messageList.setFname(fname);
messageList.setDir(direction);
messageList.setMessageList(ListMessage);
Message_List.add(messageList);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
adapter.notifyDataSetChanged();
数据使用了它的
{"message":"qqqqqqqq","id":50,"date":"2016-06-24 04:44:06","name":"medo medo","direction":"left","mode":0}
答案 0 :(得分:0)
每次创建视图时,无论您是否已经显示过它们,都会将所有消息放入其中。
问题在于以下循环:
for(String message : m.getMessageList()) {
// add a text view for each message
}
您需要找到一种方法来检查消息是否已经显示,并且只有在消息不存在时才将其添加到布局中。
答案 1 :(得分:0)
我建议你这样做: 在您的adapterclass中添加以下方法:
public void updateList(List<MessageList> ){
this.MessageList = l;
notifyDataSetChanged();
}
并且,在您获取新列表后,请调用adapter.updateList(newList)
方法!它将使用方法内部的notifyDataSetChanged();
更新自己。