package studio.uphie.one.ui.personal; import android.graphics.drawable.BitmapDrawable; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.umeng.fb.FeedbackAgent; import com.umeng.fb.SyncListener; import com.umeng.fb.model.Conversation; import com.umeng.fb.model.Reply; import com.umeng.fb.model.UserInfo; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import butterknife.Bind; import butterknife.OnClick; import studio.uphie.one.R; import studio.uphie.one.abs.AbsBaseActivity; import studio.uphie.one.utils.SysUtil; import studio.uphie.one.utils.TimeUtil; import studio.uphie.one.widgets.ClearEditText; /** * Created by Uphie on 2015/11/5. * Email: uphie7@gmail.com */ public class FeedbackActivity extends AbsBaseActivity { @Bind(R.id.listView) PullToRefreshListView listView; @Bind(R.id.edt_feedback) ClearEditText edt_feedback; @Bind(R.id.text_send) TextView text_send; private Conversation conversation; private MessageAdapter adapter; @Override public int getLayoutId() { return R.layout.activity_feedback; } @Override public void init() { setTitle(R.string.item_feedback); conversation = new FeedbackAgent(this).getDefaultConversation(); edt_feedback.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().trim().length() > 0) { text_send.setEnabled(true); text_send.setTextColor(getResources().getColor(R.color.green)); } else { text_send.setEnabled(false); text_send.setTextColor(getResources().getColor(R.color.disable_gray)); } } @Override public void afterTextChanged(Editable s) { } }); edt_feedback.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEND) { onClick(); return true; } return false; } }); //去除按item时的效果 listView.getRefreshableView().setSelector(new BitmapDrawable()); //顶部下拉刷新 listView.setMode(PullToRefreshBase.Mode.PULL_FROM_START); listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { sync(); } }); adapter = new MessageAdapter(conversation); listView.setAdapter(adapter); if (adapter.getCount() != 0) { //滚动到底部,即显示到最新一条消息 listView.getRefreshableView().setSelection(adapter.getCount() - 1); } } @OnClick(R.id.text_send) public void onClick() { closeInputMethod(); String msg = edt_feedback.getText().toString().trim(); edt_feedback.setText(""); conversation.addUserReply(msg); adapter.notifyDataSetChanged(); sync(); } /** * 数据同步 */ private void sync() { conversation.sync(new SyncListener() { @Override public void onSendUserReply(List<Reply> replyList) { } @Override public void onReceiveDevReply(List<Reply> replyList) { // SwipeRefreshLayout停止刷新 listView.onRefreshComplete(); // 刷新ListView adapter.notifyDataSetChanged(); //滚动到底部 listView.getRefreshableView().setSelection(adapter.getCount() - 1); } }); } private class MessageAdapter extends BaseAdapter { private static final int TYPE_USER = 0; private static final int TYPE_ONE = 1; private Conversation conversation; public MessageAdapter(Conversation conversation) { this.conversation = conversation; } @Override public int getCount() { return conversation.getReplyList().size(); } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { return getItem(position).type.equals(Reply.TYPE_DEV_REPLY) ? TYPE_ONE : TYPE_USER; } @Override public Reply getItem(int position) { return conversation.getReplyList().get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Reply reply = getItem(position); ViewHolder holder; int type = getItemViewType(position); if (convertView == null) { if (type == TYPE_ONE) { convertView = View.inflate(FeedbackActivity.this, R.layout.list_item_conversion_left, null); } else { convertView = View.inflate(FeedbackActivity.this, R.layout.list_item_conversion_right, null); } holder = new ViewHolder(); holder.iv_avatar = (ImageView) convertView.findViewById(R.id.list_item_conversion_avatar); holder.iv_msg_fail = (ImageView) convertView.findViewById(R.id.list_item_conversion_fail); holder.text_msg = (TextView) convertView.findViewById(R.id.list_item_conversion_message); holder.text_time = (TextView) convertView.findViewById(R.id.list_item_conversion_time); holder.pg_msg = (ProgressBar) convertView.findViewById(R.id.list_item_conversion_prog); holder.iv_msg_fail.setOnClickListener(new OnResendListener(reply)); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } //头像 if (type == TYPE_ONE) { holder.iv_avatar.setImageResource(R.drawable.av_author); } //消息 holder.text_msg.setText(reply.content); //消息状态 switch (reply.status) { case Reply.STATUS_NOT_SENT: //发送失败 holder.pg_msg.setVisibility(View.GONE); holder.iv_msg_fail.setVisibility(View.VISIBLE); break; case Reply.STATUS_SENDING: //发送中 holder.pg_msg.setVisibility(View.VISIBLE); holder.iv_msg_fail.setVisibility(View.GONE); break; default: //发送成功 holder.pg_msg.setVisibility(View.GONE); holder.iv_msg_fail.setVisibility(View.GONE); break; } if (position != 0) { //不是第一条 Reply lastReply = getItem(position - 1); Date date = new Date(reply.created_at); if (reply.created_at - lastReply.created_at > 5 * 60 * 1000 && reply.created_at - lastReply.created_at < 24 * 60 * 60 * 1000) { //如果两条消息时间相差大于5分钟,小于一天,显示15:40形式时间 holder.text_time.setVisibility(View.VISIBLE); holder.text_time.setText(TimeUtil.toSimpleTime(date)); } else if (reply.created_at - lastReply.created_at > 24 * 60 * 60 * 1000) { //如果两条消息时间相差大于于一天,显示2015年1月27日 10:00:00形式时间 holder.text_time.setVisibility(View.VISIBLE); holder.text_time.setText(TimeUtil.toCommonTime(date)); } else { holder.text_time.setVisibility(View.GONE); } } return convertView; } private class OnResendListener implements View.OnClickListener { private Reply reply; public OnResendListener(Reply reply) { this.reply = reply; } @Override public void onClick(View v) { if (reply.type.equals(Reply.TYPE_USER_REPLY)) { //用户回复的,并且发送失败的状态 sync(); } } } private class ViewHolder { ImageView iv_avatar; TextView text_msg; TextView text_time; ProgressBar pg_msg; ImageView iv_msg_fail; } } }