android自定义列表适配器重复旧项目

时间:2016-06-24 15:06:33

标签: android android-adapter

这是我的自定义适配器,我第一次使用它而不重复

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;


}

}

这是结果

enter image description here

但是当我收到新数据并且我想在执行

之后添加它
  adapter.notifyDataSetChanged();

重复第一个数据并将其添加到listView中查看结果 enter image description here

我们可以看到它重复数据它必须添加新数据我将它添加到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}

2 个答案:

答案 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();更新自己。