简单仿微信的分组消息界面


基本思路:按照时间顺序获取服务器数据,判断当前条数据的数据类型,比如我这里是总共有三种,分别为0,1,2(代表不同的消息类型)。用三个类型全局变量存标记是否已经加载当前的消息类型,也就是如果某类型已经加载就不再给listview里加载同样的类型的消息了。如果消息未读,会给本分组的红点数字记数+1。

引用第三方sdk:bmob云服务器


1、布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EDF4F7"
    android:orientation="vertical" >


    <com.tc.attendancemanagement.common.MyListView
        android:id="@+id/lv_message"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="#00000000"
        android:dividerHeight="1dp" >
    </com.tc.attendancemanagement.common.MyListView>


</LinearLayout>


2、程序代码:

package com.tc.attendancemanagement.fragment;


import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


import cn.bmob.v3.BmobObject;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.listener.DeleteListener;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;


import com.bmob.BmobProFile;
import com.bmob.btp.callback.ThumbnailListener;
import com.tc.attendancemanagement.R;
import com.tc.attendancemanagement.adapter.Adapter_SelectAllMessage;
import com.tc.attendancemanagement.adapter.ViewHolder_CheckMember;
import com.tc.attendancemanagement.adapter.ViewHolder_recentMessage;
import com.tc.attendancemanagement.bean.CourseGroup;
import com.tc.attendancemanagement.bean.CourseMember;
import com.tc.attendancemanagement.bean.CourseSignIn;
import com.tc.attendancemanagement.bean.MyUser;
import com.tc.attendancemanagement.bean.UserMessage;
import com.tc.attendancemanagement.common.CustomProgressDialog;
import com.tc.attendancemanagement.common.MyException;
import com.tc.attendancemanagement.common.MyListView;
import com.tc.attendancemanagement.common.SubList;
import com.tc.attendancemanagement.common.MyListView.IReflashListener;
import com.tc.attendancemanagement.config.BmobSettings;
import com.tc.attendancemanagement.ui.CheckMemberActivity;
import com.tc.attendancemanagement.ui.DailyAttendanceActivity;
import com.tc.attendancemanagement.ui.SelectAllMessageActivity;
import com.tc.attendancemanagement.ui.ShowNotSignInStudent;
import com.tc.attendancemanagement.ui.Supplement_SelfInfoActivity;
import com.tc.attendancemanagement.ui.UpdateSelfInfo;
import com.tc.attendancemanagement.ui.CheckMemberActivity.MyListAdapter;


import android.R.integer;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.opengl.Visibility;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;


public class MessageFragment extends Fragment implements IReflashListener {


private int[] msgCount;
private List<UserMessage> list;
private MyListAdapter mAdapter;// listview适配器
private MyListView lv_message;


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 123) {
getUserMessage();// 当重新启用本界面时,刷新消息
}


super.onActivityResult(requestCode, resultCode, data);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.tab_message, container, false);
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
init();
initEvent();
getUserMessage();
}


private int type1;// 消息的三种类型·
private int type2;
private int type0;
private CustomProgressDialog mProgressDialog;


private void getUserMessage() {
type1 = 0;// 消息的三种类型·
type2 = 0;
type0 = 0;


BmobQuery<UserMessage> query = new BmobQuery<UserMessage>();
MyUser user = BmobUser.getCurrentUser(getActivity(), MyUser.class);
query.addWhereEqualTo("receiver", user);// 当前用户的消息
query.setLimit(1000); // 限制20条
query.order("-createdAt"); // 按创建时间排序
query.include("user");
query.findObjects(getActivity(), new FindListener<UserMessage>() {


@Override
public void onSuccess(List<UserMessage> arg0) {
Log.i("size", arg0.size() + "");
// Log.i("headImageName",
// arg0.get(0).getSender().getHeadImage());
if (list != null) {// 如果为空,就先清空,再加载
list.clear();
}


msgCount = new int[3];
list = new ArrayList<UserMessage>();
Log.i("arg0.size()", arg0.size() + "");
for (int i = 0; i < arg0.size(); i++) {
// 当在对应的类型时,统计该类型的最新消息条数
if (type0 == 0 && arg0.get(i).getMessageType().equals("0")) {
type0++;
list.add(arg0.get(i));
Log.i("type0", type0 + "");


}


if (type1 == 0 && arg0.get(i).getMessageType().equals("1")) {
type1++;
list.add(arg0.get(i));
Log.i("type1", type1 + "");
}


if (type2 == 0 && arg0.get(i).getMessageType().equals("2")) {
type2++;
list.add(arg0.get(i));
Log.i("type2", type2 + "");
}
// 计算未读消息的数量
if (arg0.get(i).getMessageType().equals("0")
&& arg0.get(i).getReadStatus().equals("0")) {
msgCount[0]++;
}
if (arg0.get(i).getMessageType().equals("1")
&& arg0.get(i).getReadStatus().equals("0")) {
msgCount[1]++;
}
if (arg0.get(i).getMessageType().equals("2")
&& arg0.get(i).getReadStatus().equals("0")) {
msgCount[2]++;
}


}
mAdapter = new MyListAdapter(getActivity(), list, msgCount);
lv_message.setAdapter(mAdapter);
}


@Override
public void onError(int code, String msg) {
new MyException(getActivity()).showException(msg);
}
});
}


public static class MyListAdapter extends BaseAdapter {
private List<UserMessage> mlist;
private LayoutInflater mInflater;
private Context mcontext;
private int[] msgCount = new int[3];


public MyListAdapter(Context context, List<UserMessage> list,
int[] msgCount) {
mlist = list;
mcontext = context;
mInflater = LayoutInflater.from(context);
this.msgCount = msgCount;
}


public void onDateChange(List<UserMessage> list) {
mlist = list;
this.notifyDataSetChanged();
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return mlist.size();
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mlist.get(position);
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}


@Override
public View getView(final int position, View convertView,
ViewGroup parent) {


ViewHolder_recentMessage viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder_recentMessage();
convertView = mInflater.inflate(
R.layout.listitem_recentmessage, null);


viewHolder.tv_title = (TextView) convertView
.findViewById(R.id.tv_title);
viewHolder.tv_content = (TextView) convertView
.findViewById(R.id.tv_content);
viewHolder.tv_createTime = (TextView) convertView
.findViewById(R.id.tv_createTime);
viewHolder.img_headImage = (ImageView) convertView
.findViewById(R.id.img_headImage);
viewHolder.img_circle = (ImageView) convertView
.findViewById(R.id.img_circle);
viewHolder.tv_msgCount = (TextView) convertView
.findViewById(R.id.tv_msgCount);


convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder_recentMessage) convertView.getTag();
}
UserMessage message = mlist.get(position);


Log.i("----position", message.getReadStatus() + "--" + position);
viewHolder.tv_title.setText(message.getTitle());
viewHolder.tv_content.setText(message.getContent());
viewHolder.tv_createTime.setText(message.getCreatedAt());
if (message.getMessageType().equals("0")) {// 当在对应的类型时,统计该类型的最新消息条数并且显示
viewHolder.tv_msgCount.setText(String.valueOf(msgCount[0]));
viewHolder.img_headImage
.setImageResource(R.drawable.system_logo);
} else if (message.getMessageType().equals("1")) {
viewHolder.tv_msgCount.setText(String.valueOf(msgCount[1]));
viewHolder.img_headImage
.setImageResource(R.drawable.course_info);
} else if (message.getMessageType().equals("2")) {
viewHolder.tv_msgCount.setText(String.valueOf(msgCount[2]));
viewHolder.img_headImage
.setImageResource(R.drawable.course_info);


}
if (message.getReadStatus().equals("0") == true) {// 如果消息未读,就显示红点
Log.i("position--getReadStatus", message.getReadStatus() + "--"
+ message.getCreatedAt() + "--position:" + position);
viewHolder.img_circle.setVisibility(View.VISIBLE);
viewHolder.img_circle
.setBackgroundResource(R.drawable.redcircle);
viewHolder.tv_msgCount.setVisibility(View.VISIBLE);


} else {
viewHolder.img_circle.setVisibility(View.GONE);
viewHolder.tv_msgCount.setVisibility(View.GONE);
}


return convertView;
}


}


@Override
public void onReflash() {


Handler handler = new Handler();
handler.postDelayed(new Runnable() {


@Override
public void run() {
// 获取最新数据
// 通知界面更新
mAdapter = null;// 刷新前清空
getUserMessage();
// //通知listview 刷新数据完毕;
lv_message.reflashComplete();
}
}, 2000);


}


private void init() {


lv_message = (MyListView) getView().findViewById(R.id.lv_message);
lv_message.setInterface(this);// 设置滑动刷新的事件
}


private void queryMessageBymessageType(String messageType) {
showProgress("正在删除...");
BmobQuery<UserMessage> query = new BmobQuery<UserMessage>();
query.order("-createdAt");
MyUser user = BmobUser.getCurrentUser(getActivity(), MyUser.class);
query.addWhereEqualTo("receiver", user);
query.addWhereEqualTo("messageType", messageType);
query.include("user");
query.findObjects(getActivity(), new FindListener<UserMessage>() {


@Override
public void onSuccess(List<UserMessage> arg0) {
deleteMessage(arg0);
}


@Override
public void onError(int arg0, String arg1) {
mProgressDialog.dismiss();
new MyException(getActivity()).showException(arg1);
}
});


}


// 删除该消息
private int isCloseSuccess;


private void deleteMessage(List<UserMessage> msg) {
List<BmobObject> userMessages = new ArrayList<BmobObject>();
for (int i = 0; i < msg.size(); i++) {
UserMessage userMessage = new UserMessage();
userMessage.setObjectId(msg.get(i).getObjectId());


userMessages.add(userMessage);
}
final List<List<BmobObject>> lists = SubList.cutList(userMessages);
isCloseSuccess = 0;
for (int i = 0; i < lists.size(); i++) {
new BmobObject().deleteBatch(getActivity(), lists.get(i),
new DeleteListener() {
@Override
public void onSuccess() {
isCloseSuccess++;
if (isCloseSuccess == lists.size()) {
mAdapter = null;// 刷新前清空
getUserMessage();
Toast.makeText(getActivity(), "删除成功!",
Toast.LENGTH_LONG).show();
mProgressDialog.dismiss();
}


}


@Override
public void onFailure(int code, String msg) {
mProgressDialog.dismiss();
new MyException(getActivity()).showException(msg);
}
});
}
}


// 实例化自定义进度条,显示进度条,关闭需要在相应位置调用mProgressDialog.dismiss();
public void showProgress(String msg) {
if (mProgressDialog != null) {
mProgressDialog.cancel();
}
mProgressDialog = new CustomProgressDialog(getActivity(), msg);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}


private void updateReadStatus(String messageType) {


BmobQuery<UserMessage> query = new BmobQuery<UserMessage>();
query.order("-createdAt");
MyUser user = BmobUser.getCurrentUser(getActivity(), MyUser.class);
query.addWhereEqualTo("receiver", user);
query.addWhereEqualTo("messageType", messageType);
query.findObjects(getActivity(), new FindListener<UserMessage>() {


@Override
public void onSuccess(List<UserMessage> arg0) {
List<BmobObject> userMessages = new ArrayList<BmobObject>();
for (int i = 0; i < arg0.size(); i++) {
UserMessage userMessage = new UserMessage();
userMessage.setObjectId(arg0.get(i).getObjectId());
userMessage.setReadStatus("1");


userMessages.add(userMessage);


}


List<List<BmobObject>> lists = SubList.cutList(userMessages);
for (int i = 0; i < lists.size(); i++) {
// 分批次更新,每次最多50条
new BmobObject().updateBatch(getActivity(), lists.get(i),
new UpdateListener() {
@Override
public void onSuccess() {


}


@Override
public void onFailure(int code, String msg) {
new MyException(getActivity())
.showException(msg);
}
});
}


}


@Override
public void onError(int arg0, String arg1) {
new MyException(getActivity()).showException(arg1);
}
});


}


private boolean isDelete = false;// 长按的标记


private void initEvent() {
lv_message.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
isDelete = false;
final int position = arg2;
new AlertDialog.Builder(getActivity()).setTitle("确定要删除该消息吗?")


.setPositiveButton("确认", new DialogInterface.OnClickListener() {


@Override
public void onClick(DialogInterface arg0, int arg1) {
// position要-1才能删除对应位置
queryMessageBymessageType(list.get(position - 1).getMessageType());
isDelete = true;
}
}).setNegativeButton("取消", null).show();
return isDelete;
}
});
lv_message.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
updateReadStatus(list.get(arg2 - 1).getMessageType());// 更新被点击的分组的阅读状态
Intent intent = new Intent(getActivity(),
SelectAllMessageActivity.class);
intent.putExtra("messageType", list.get(arg2 - 1)
.getMessageType());
startActivityForResult(intent, 1235);
}


});
}
}


3、viewholder

package com.tc.attendancemanagement.adapter;


import android.widget.ImageView;
import android.widget.TextView;


public class ViewHolder_recentMessage {
public TextView tv_title;
public TextView tv_content;
public TextView tv_createTime;
public ImageView img_headImage;
public ImageView img_circle;
public TextView tv_msgCount;
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值