使用notifyDataSetChanged

时间:2016-01-11 09:23:14

标签: android baseadapter

我正在进行即时聊天应用程序。我的问题是,当我通过聊天应用程序发送消息时,消息显示两次而不是一次。屏幕截图如下: ScreenShot

正如您在acreenshot中看到的那样,消息hiii显示两次,但我只发送了一次。

1.Adapter_Message.java

public class Adapter_Message extends BaseAdapter {

    private Context context;
    private List<Bean_Message> messagesItems;

    public Adapter_Message(Context context, List<Bean_Message> navDrawerItems) {
        this.context = context;
        this.messagesItems = navDrawerItems;
    }

    @Override
    public int getCount() {
        return messagesItems.size();
    }

    @Override
    public Object getItem(int position) {
        return messagesItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Bean_Message m = messagesItems.get(position);
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // Identifying the message owner
        if (messagesItems.get(position).isSelf()) {
            // message belongs to you, so load the right aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_right, null);
        } else {
            // message belongs to other person, load the left aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_left, null);
        }

        TextView lblFrom = (TextView) convertView.findViewById(R.id.lblMsgFrom);
        TextView txtMsg = (TextView) convertView.findViewById(R.id.txtMsg);

        txtMsg.setText(m.getMessage());
        lblFrom.setText(m.getFromName());

        return convertView;
    }
}

2.Chat_Activity.java

public class ChatActivity extends FragmentActivity implements
        EmojiconGridFragment.OnEmojiconClickedListener, EmojiconsFragment.OnEmojiconBackspaceClickedListener {
    public static final String TAG = ChatActivity.class.getSimpleName();
    //  EditText edMessage;
    EmojiconEditText edMessage;
    Button sendMessage;
    private Socket mSocket;
    String sID, lID, md5StringRoomID, message, friendName, loggedInUser;
    String frndID;
    int smallerID, largerID;
    //AlmaChatDatabase almaChatDatabase;
    // Chat messages list adapter
    private Adapter_Message adapter;
    private List<Bean_Message> listBeanMessages;
    private ListView listViewMessages;
    boolean isSelf; // to check whether the message is owned by you or not.true means message is owned by you .
    Bean_Message msg;
    int loggedInUserID;
    private String URL_FEED_Message = "";
    APIConfiguration apiConfiguration;
    SharedPreferences preferences;

    HashMap<String, Integer> emoticons;

    // instance initialization block
    {
        try {
            mSocket = IO.socket(Constants.CHAT_SERVER_URL);
            Log.e("Socket", String.valueOf(mSocket));
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        sendMessage = (Button) findViewById(R.id.btnSendMessage);
        preferences = getApplicationContext().getSharedPreferences(Prefs_Registration.prefsName, Context.MODE_PRIVATE);

        //Handling emoticons
       /* emoticons = new HashMap<String,Integer>();
        emoticons.put(":-)",R.drawable.s1);*/


        String id = preferences.getString(Prefs_Registration.get_user_id, null);
        // Converting String id to integer
        loggedInUserID = Integer.parseInt(id);
        //loggedInUserID = almaChatDatabase.getUserID(); // Getting ID of the Logged in user from the database
        Log.e("UserID", "Id of Logged in user  " + loggedInUserID);

        listBeanMessages = new ArrayList<Bean_Message>();
        adapter = new Adapter_Message(getApplicationContext(), listBeanMessages);
        listViewMessages = (ListView) findViewById(R.id.list_view_messages);
        listViewMessages.setAdapter(adapter);

        // Getting the ID of the friend from the previous screen using getExtras
        Bundle bundle = getIntent().getExtras();
        frndID = bundle.getString("ID");
        Log.e("FriendID", frndID);
        final int friendID = Integer.parseInt(frndID);
        friendName = bundle.getString("name");
        Log.e("FriendName", friendName);
        loggedInUser = preferences.getString(Prefs_Registration.get_user_name, null);
        //loggedInUser = almaChatDatabase.getUserName(); // Name of logged in user
        Log.e("LoggedInUser", loggedInUser);
        // Converting first lowercase letter of every word in Uppercase
        final String loggedInUpper = upperCase(loggedInUser);
        //To find the current time
        Date d = new Date();
        final long time = d.getTime();
        // Comparing the loggedInUserId and friendID
        if (friendID < loggedInUserID) {
            smallerID = friendID;
            largerID = loggedInUserID;
        } else {
            smallerID = loggedInUserID;
            largerID = friendID;
        }
        sID = String.valueOf(smallerID);
        lID = String.valueOf(largerID);
        String combinedID = sID + lID;
        Log.e("combined ID", combinedID);
        md5StringRoomID = convertPassMd5(combinedID); // Encrypting the combinedID to generate Room ID
        Log.e("md5StringRoomID", md5StringRoomID);

        // Using the API for loading old chat messages
        apiConfiguration = new APIConfiguration();
        String api_message = apiConfiguration.getApi_message(); // Getting the API of messages
        URL_FEED_Message = api_message + md5StringRoomID; // md5String is the encrypted room ID here
        Log.e("URL_FEED_MESSAGE", URL_FEED_Message);

        Log.e("Network request", "Fresh Request");
        // We first check for cached request
        Cache cache = AppController.getInstance().getRequestQueue().getCache();
        Cache.Entry entry = cache.get(URL_FEED_Message);
        if (entry != null) {
            // fetch the data from cache
            try {
                String data = new String(entry.data, "UTF-8");
                try {
                    parseJsonFeed(new JSONArray(data));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        } else {

            JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(URL_FEED_Message, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray jsonArray) {
                    Log.e("JsonArray", String.valueOf(jsonArray));
                    if (jsonArray != null) {
                        parseJsonFeed(jsonArray);
                    }

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Log.e("ErrorResponse", String.valueOf(volleyError));
                }
            }
            );
            // Adding request to volley request queue
            AppController.getInstance().addToRequestQueue(jsonArrayRequest);
        }


        edMessage = (EmojiconEditText) findViewById(R.id.edtMessage);
        //Listening on Events
        mSocket.on(Socket.EVENT_CONNECT, onConnect);
        mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectionError);
        mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
        mSocket.on("send:notice", onReceive); // Listening event for receiving messages
        mSocket.connect(); // Explicitly call connect method to establish connection here
        mSocket.emit("subscribe", md5StringRoomID);

        sendMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                message = edMessage.getText().toString().trim();
                Log.e("Sending", "Sending data-----" + message);
                if (!message.equals("")) {
                    edMessage.setText(" ");
                    JSONObject jsonObject = new JSONObject();
                    try {
                        jsonObject.put("room_id", md5StringRoomID);
                        jsonObject.put("user", loggedInUpper);
                        jsonObject.put("id", friendID);
                        jsonObject.put("message", message);
                        jsonObject.put("date", time);
                        jsonObject.put("status", "sent");

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    isSelf = true; // Boolean isSelf is set to be true as sender of the message is logged in user i.e. you
                    attemptToSend(loggedInUpper, message, isSelf);
                    mSocket.emit("send", jsonObject); // owner i.e LoggedIn user is sending the message
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Please enter some text", Toast.LENGTH_LONG).show();

                        }
                    });
                }
            }

        });

        setEmojiconFragment(false);
    }

   /* public Spannable getSmiledText(String text) {
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        if (emoticons.size() > 0) {
            int index;
            for (index = 0; index < builder.length(); index++) {
                if (Character.toString(builder.charAt(index)).equals(":")) {
                    for (Map.Entry<String, Integer> entry : emoticons.entrySet()) {
                        int length = entry.getKey().length();
                        if (index + length > builder.length())
                            continue;
                        if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) {
                            builder.setSpan(new ImageSpan(getApplicationContext(), entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            index += length - 1;
                            break;
                        }
                    }
                }
            }
        }
        return builder;
    }*/


    private void setEmojiconFragment(boolean useSystemDefault) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.emojicons, EmojiconsFragment.newInstance(useSystemDefault))
                .commit();
    }

    //Adding message in the arrayList
    public void attemptToSend(String senderName, String message, boolean isSelf) {
        msg = new Bean_Message(senderName, message, isSelf);
        listBeanMessages.add(msg);
        adapter.notifyDataSetChanged();
        playBeep();
    }

    // Playing sound when the message is sent by the owner
    public void playBeep() {
        try {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // encrypting string into MD5
    public static String convertPassMd5(String pass) {
        String password = null;
        MessageDigest mdEnc;
        try {
            mdEnc = MessageDigest.getInstance("MD5");
            mdEnc.update(pass.getBytes(), 0, pass.length());
            pass = new BigInteger(1, mdEnc.digest()).toString(16);
            while (pass.length() < 32) {
                pass = "0" + pass;
            }
            password = pass;
        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        }
        return password;
    }

    // Converting first lowercase letter of every word in Uppercase
    String upperCase(String source) {
        StringBuffer res = new StringBuffer();
        String[] strArr = source.split(" ");
        for (String str : strArr) {
            char[] stringArray = str.trim().toCharArray();
            stringArray[0] = Character.toUpperCase(stringArray[0]);
            str = new String(stringArray);
            res.append(str).append(" ");
        }
        return res.toString().trim();
    }

    // Event Listeners
    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.e("Socket", "Connected");
        }
    };


    private Emitter.Listener onConnectionError = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.e("Error", "Error in connecting server");
        }
    };
    private Emitter.Listener onDisconnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.e("Disconnect", "Socket Disconnected");
        }
    };

    // Event Listener for receiving messages
    private Emitter.Listener onReceive = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            Log.e("Receive", "Bean_Message received");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    JSONObject data = (JSONObject) args[0];
                    Log.e("DATA", String.valueOf(data));
                    try {
                        JSONArray ops = data.getJSONArray("ops");
                        for (int i = 0; i < ops.length(); i++) {
                            JSONObject object = ops.getJSONObject(i);
                            String roomID = object.getString("room_id");
                            Log.e("RoomID", roomID); // Getting room ID from JSON array
                            Log.e("Md5RoomID", md5StringRoomID); // Getting room id which we have created using logged in user ID and room id of the user through which chat has to be done
                            //Comparing the room IDs
                            if (md5StringRoomID.equals(roomID)) {
                                String senderName = object.getString("user");
                                Log.e("Sender Name", senderName);
                                String senderID = object.getString("id");
                                Log.e("SenderID", senderID);
                                // JSONObject message = object.getJSONObject("message");
                                String messageReceived = object.getString("message");
                                Log.e("Bean_Message Received", messageReceived);
                                String loggedInUSerNAme = preferences.getString(Prefs_Registration.get_user_name, null);
                                //String loggedInUSerNAme = almaChatDatabase.getUserName();
                                //If the message is sent by the owner to other from webapp ,then we need to check whether the sender is the loggedinUSer in the App or not and we will right align the messages .
                                if (loggedInUSerNAme.equalsIgnoreCase(senderName)) {
                                    isSelf = true;
                                    msg = new Bean_Message(senderName, messageReceived, isSelf);
                                    listBeanMessages.add(msg);
                                    // Log.e("List Elements", String.valueOf(listBeanMessages));
                                    adapter.notifyDataSetChanged();
                                    playBeep();
                                } else {
                                    isSelf = false;
                                    msg = new Bean_Message(senderName, messageReceived, isSelf);
                                    listBeanMessages.add(msg);
                                    Log.e("List Elements", String.valueOf(listBeanMessages));
                                    adapter.notifyDataSetChanged();
                                    playBeep();
                                }
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        // Playing sound when the message is sent by other
        public void playBeep() {
            try {
                Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
                r.play();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };

    // Parsing JSon Array which corresponds to the old chat messages
    public void parseJsonFeed(JSONArray jsonArray) {
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String roomID = jsonObject.getString("room_id");
                Log.e("RoomID", roomID);
                Log.e("Md5RoomID", md5StringRoomID);
                // If Room ID(created using id of logged in user and id of friend) matches with the room id obtained from JSON String
                if (md5StringRoomID.equals(roomID)) {
                    String userName = jsonObject.getString("user");
                    Log.e("Name", userName);
                    String loggedInUSerNAme = preferences.getString(Prefs_Registration.get_user_name, null);
                    //String loggedInUSerNAme = almaChatDatabase.getUserName();
                    Log.e("LoggedInUSer", loggedInUSerNAme);
                    //If the message is sent by the owner to other from webapp ,then we need to check whether the sender is the loggedinUSer in the App or not and we will right align the messages .
                    if (loggedInUSerNAme.equalsIgnoreCase(userName)) {
                        String message = jsonObject.getString("message");
                        Log.e("message", message);
                        isSelf = true;
                        msg = new Bean_Message(userName, message, isSelf);
                        listBeanMessages.add(msg);
                        adapter.notifyDataSetChanged();
                        //playBeep();
                    } else {
                        JSONObject jsonMessage = jsonObject.getJSONObject("message");
                        String message = jsonMessage.getString("text");
                        isSelf = false;
                        msg = new Bean_Message(userName, message, isSelf);
                        listBeanMessages.add(msg);
                        adapter.notifyDataSetChanged();
                        // playBeep();
                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            // notify data changes to list adapter
            //adapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onEmojiconBackspaceClicked(View view) {
        EmojiconsFragment.backspace(edMessage);
    }

    @Override
    public void onEmojiconClicked(Emojicon emojicon) {
        EmojiconsFragment.input(edMessage, emojicon);
    }


}

3.Bean_Message.java

public class Bean_Message {
    private String fromName, message;
    private boolean isSelf; // isSelf is used to check whether the message is owned by you or not

    public Bean_Message() {
    }

    public Bean_Message(String fromName, String message, boolean isSelf) {
        this.fromName = fromName;
        this.message = message;
        this.isSelf = isSelf;
    }

    public String getFromName() {
        return fromName;
    }

    public void setFromName(String fromName) {
        this.fromName = fromName;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean isSelf() {
        return isSelf;
    }

    public void setSelf(boolean isSelf) {
        this.isSelf = isSelf;
    }

}

单击“发送消息”按钮,消息将发送到服务器,并使用以下代码:

 public void attemptToSend(String senderName, String message, boolean isSelf) {
    msg = new Bean_Message(senderName, message, isSelf);
    listBeanMessages.add(msg);
    adapter.notifyDataSetChanged();
    playBeep();
}

消息存储在Bean中,Bean添加到ArrayList中。现在我通知我的适配器使用adapter.notifyDataSetChanged()方法更新了ArrayList。但问题是List视图显示我发送的消息两次。请帮我解决这个问题。

0 个答案:

没有答案