/** * @author UFreedom * @since 2014 2014-10-3 上午10:05:44 * @see www.52yummy.com * <br> * sunfreedom@sina.cn * <br> * Copyright (C) 2014 UFreedom. All Rights Reserved. */ package com.codecomb.views; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.codecomb.events.ShowNewMessageEvent; import com.codecomb.infrastructure.asynctask.DataLoader; import com.codecomb.module.contacts.Contact; import com.codecomb.module.im.Message; import com.codecomb.module.im.MessageManager; import com.codecomb.module.profile.ProfileManager; import com.codecomb.ufreedom.R; import com.codecomb.views.adapter.ChatAdapter; import de.greenrobot.event.EventBus; public class ChatFragment extends Fragment implements LoaderCallbacks<List<Message>> { private static final String TAG = ChatFragment.class.getSimpleName(); public static final String EXTRA_CHAT_CONTACT = "chat_contact"; private static final int LOAD_CHAT_RECORDS = 0; private View rootView; private static Contact contact; // private List<Message> messages; private ChatAdapter chatAdapter; private ListView lvMessageContent; private View vBack; private TextView vTitle; private View vMessageSend; private EditText vMessageContent; private LoaderManager loaderManager; private ExecutorService refreshMessageExecutorService ; public static ChatFragment newInstance(Contact contact) { Bundle bundle = new Bundle(); bundle.putSerializable(EXTRA_CHAT_CONTACT, contact); ChatFragment chatFragment = new ChatFragment(); chatFragment.setArguments(bundle); return chatFragment; } @Override public void onCreate(Bundle savedInstanceState) { EventBus.getDefault().post(this); refreshMessageExecutorService = Executors .newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { // TODO Auto-generated method stub Thread thread = new Thread(r); thread.setName("send message"); thread.setDaemon(true); return thread; } }); contact = (Contact) getArguments().getSerializable(EXTRA_CHAT_CONTACT); loaderManager = getLoaderManager(); initLoader(); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fgm_chat, null); initWidget(); initListnener(); initListView(); return rootView; } private void initLoader() { loaderManager.initLoader(LOAD_CHAT_RECORDS, null, this); } private void restartLoader() { loaderManager.restartLoader(LOAD_CHAT_RECORDS, null, this); } private void initWidget() { vBack = rootView.findViewById(R.id.vBack); vTitle = (TextView) rootView.findViewById(R.id.vTitle); vTitle.setText(contact.getNickName()); vMessageSend = rootView.findViewById(R.id.vMessageSend); vMessageContent = (EditText) rootView .findViewById(R.id.vMessageContent); } private void initListnener() { vBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { getActivity().finish(); } }); vMessageSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final String content = vMessageContent.getText().toString() .trim(); if (content.isEmpty()) { Toast.makeText(getActivity(), R.string.msg_msg_not_empty, Toast.LENGTH_SHORT).show(); } else { chatAdapter.sendMessage(content); vMessageContent.setText(""); refreshMessageExecutorService.submit(new Runnable() { @Override public void run() { Log.e(TAG, "重新加载消息"); restartLoader(); } }); } } }); } private void initListView() { lvMessageContent = (ListView) rootView.findViewById(R.id.lvMessageContent); lvMessageContent.setEmptyView(rootView.findViewById(R.id.vEmptyView)); chatAdapter = new ChatAdapter(getActivity(), lvMessageContent, ProfileManager .getInstance().getProfile(), contact); lvMessageContent.setAdapter(chatAdapter); } public static class MessageDataLoader extends DataLoader<List<Message>> { public MessageDataLoader(Context context) { super(context); } @Override public List<Message> loadInBackground() { return MessageManager.getInstance().getChatRecords( contact.getUserID()); } } @Override public Loader<List<Message>> onCreateLoader(int arg0, Bundle arg1) { return new MessageDataLoader(getActivity()); } @Override public void onLoadFinished(Loader<List<Message>> arg0, List<Message> msgs) { chatAdapter.addAll(msgs); updateUI(); } @Override public void onLoaderReset(Loader<List<Message>> msgs) { // chatAdapter.addAll(msgs.); // updateUI(); } public void updateUI() { chatAdapter.refreshAndSetListViewTobottom(); } public void onEvent(ShowNewMessageEvent event) { Log.e(TAG, "显示消息"); refreshMessageExecutorService.submit(new Runnable() { @Override public void run() { restartLoader(); } }); } }