匿名项目连载(三)--->说说列表
2015-08-24 14:32
357 查看
AtyTimeline(联系人说说的列表)
package com.jikexueyuan.secret.atys; import java.util.List; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.Toast; import com.jikexueyuan.secret.Config; import com.jikexueyuan.secret.R; import com.jikexueyuan.secret.ld.MyContacts; import com.jikexueyuan.secret.net.Message; import com.jikexueyuan.secret.net.Timeline; import com.jikexueyuan.secret.net.UploadContacts; import com.jikexueyuan.secret.tools.MD5Tool; public class AtyTimeline extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.aty_timeline); adapter = new AtyTimelineMessageListAdapter(this); setListAdapter(adapter); /**获取intent值*/ phone_num = getIntent().getStringExtra(Config.KEY_PHONE_NUM); token = getIntent().getStringExtra(Config.KEY_TOKEN); phone_md5 = MD5Tool.md5(phone_num); /*** * 提示进度条 */ final ProgressDialog pd = ProgressDialog.show(this, getResources().getString(R.string.connecting), getResources().getString(R.string.connecting_to_server)); /** * 上传联系人jsonArr字符串到服务器 */ new UploadContacts(phone_md5, token, MyContacts.getContactsJSONString(this), new UploadContacts.SuccessCallback() { /** * 上传成功后的回调方法 */ @Override public void onSuccess() { loadMessage(); pd.dismiss(); } }, new UploadContacts.FailCallback() { @Override public void onFail(int errorCode) { pd.dismiss(); //这个demo,只返回了1成功的状态值,真是的开发中还有失败,或许还有失效的Token if (errorCode==Config.RESULT_STATUS_INVALID_TOKEN) { startActivity(new Intent(AtyTimeline.this, AtyLogin.class)); finish(); }else{ loadMessage(); } } }); } /** * 从服务器下载联系人联系人的消息数据 */ private void loadMessage(){ final ProgressDialog pd = ProgressDialog.show(this, getResources().getString(R.string.connecting), getResources().getString(R.string.connecting_to_server)); new Timeline(phone_md5, token, 1, 20, new Timeline.SuccessCallback() { @Override public void onSuccess(int page, int perpage, List<Message> timeline) { pd.dismiss(); adapter.clear(); adapter.addAll(timeline); } }, new Timeline.FailCallback() { @Override public void onFail(int errorCode) { pd.dismiss(); if (errorCode==Config.RESULT_STATUS_INVALID_TOKEN) { startActivity(new Intent(AtyTimeline.this, AtyLogin.class)); finish(); }else{ Toast.makeText(AtyTimeline.this, R.string.fail_to_load_timeline_data, Toast.LENGTH_LONG).show(); } } }); } /** * 点击每一条item */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Message msg = adapter.getItem(position); Intent i = new Intent(this, AtyMessage.class); i.putExtra(Config.KEY_MSG, msg.getMsg()); i.putExtra(Config.KEY_MSG_ID, msg.getMsgId()); i.putExtra(Config.KEY_PHONE_MD5, msg.getPhone_md5()); i.putExtra(Config.KEY_TOKEN, token); startActivity(i); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_aty_timeline, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuShowAtyPublish: Intent i = new Intent(AtyTimeline.this, AtyPublish.class); i.putExtra(Config.KEY_PHONE_MD5, phone_md5); i.putExtra(Config.KEY_TOKEN, token); startActivityForResult(i, 0); break; default: break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case Config.ACTIVITY_RESULT_NEED_REFRESH: //发布说说后,从新冲服务区获取说说 loadMessage(); break; default: break; } } private String phone_num,token,phone_md5; private AtyTimelineMessageListAdapter adapter=null; }
AtyTimeline里面的MyContacts.getContactsJSONString(this)(将联系人列表封装Json数组)
package com.jikexueyuan.secret.ld; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.jikexueyuan.secret.Config; import com.jikexueyuan.secret.tools.MD5Tool; import android.content.Context; import android.database.Cursor; import android.provider.ContactsContract.CommonDataKinds.Phone; public class MyContacts { /** * 将手机联系人转为一个jsonArr字符串 * @param context * @return */ public static String getContactsJSONString(Context context){ Cursor c = context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); String phoneNum; JSONArray jsonArr = new JSONArray(); JSONObject jsonObj; while(c.moveToNext()){ phoneNum = c.getString(c.getColumnIndex(Phone.NUMBER)); if (phoneNum.charAt(0)=='+'&& phoneNum.charAt(1)=='8'&& phoneNum.charAt(2)=='6') { phoneNum = phoneNum.substring(3); } jsonObj = new JSONObject(); try { jsonObj.put(Config.KEY_PHONE_MD5, MD5Tool.md5(phoneNum)); } catch (JSONException e) { e.printStackTrace(); } jsonArr.put(jsonObj); } return jsonArr.toString(); } }
AtyTimeline里面的new UploadContacts(phone_md5, token, contacts, successCallback, failCallback)实现类如下
package com.jikexueyuan.secret.net; import org.json.JSONException; import org.json.JSONObject; import com.jikexueyuan.secret.Config; public class UploadContacts { /** * 上传联系人列表到服务器的实现类 * * @param phone_md5 * @param token * @param contacts * @param successCallback * @param failCallback */ public UploadContacts(String phone_md5, String token, String contacts, final SuccessCallback successCallback, final FailCallback failCallback) { new NetConnection( Config.SERVER_URL, HttpMethod.POST, new NetConnection.SuccessCallback() { @Override public void onSuccess(String result) { try { // 将返回的结果进行解析{\"status\":1} 这里服务器不支持只是返回状态码 JSONObject obj = new JSONObject(result); switch (obj.getInt(Config.KEY_STATUS)) { case Config.RESULT_STATUS_SUCCESS: if (successCallback != null) { successCallback.onSuccess(); } break; case Config.RESULT_STATUS_INVALID_TOKEN: if (failCallback != null) { failCallback .onFail(Config.RESULT_STATUS_INVALID_TOKEN); } break; default: if (failCallback != null) { failCallback .onFail(Config.RESULT_STATUS_FAIL); } break; } } catch (JSONException e) { e.printStackTrace(); if (failCallback != null) { failCallback.onFail(Config.RESULT_STATUS_FAIL); } } } }, new NetConnection.FailCallback() { @Override public void onFail() { if (failCallback != null) { failCallback.onFail(Config.RESULT_STATUS_FAIL); } } }, Config.KEY_ACTION, Config.ACTION_UPLOAD_CONTACTS, Config.KEY_PHONE_MD5, phone_md5, Config.KEY_TOKEN, token, Config.KEY_CONTACTS, contacts); /* http://10.127.0.11:8090/NiMingServer/api.jsp?action=upload_contacts &phone_md5=96e79218965eb72c92a549dd5a330112&token=asdasdasdsadasd &contatcs=[{"phone_md5":"38af69663d2eaaa1e15df03f319eddd2"},{"phone_md5":"b217eadca0937ce7f18f14fed1552d38"}]*/ } public static interface SuccessCallback { void onSuccess(); } public static interface FailCallback { void onFail(int errorCode); } }
页面加载进行的服务器下载说说的操作
Message
package com.jikexueyuan.secret.net; public class Message { public Message(String msgId,String msg,String phone_md5) { this.msg = msg; this.msgId = msgId; this.phone_md5 = phone_md5; } private String msgId=null,msg=null,phone_md5=null; public String getMsg() { return msg; } public String getMsgId() { return msgId; } public String getPhone_md5() { return phone_md5; } }
new Timeline(phone_md5, token, page, perpage, successCallback, failCallback)实现类如下
package com.jikexueyuan.secret.net; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.jikexueyuan.secret.Config; public class Timeline { /** * 进行服务器联系人数据的下载 * @param phone_md5 * @param token * @param page * @param perpage * @param successCallback * @param failCallback */ public Timeline(String phone_md5,String token,int page,int perpage,final SuccessCallback successCallback,final FailCallback failCallback) { new NetConnection(Config.SERVER_URL , HttpMethod.POST, new NetConnection.SuccessCallback() { /** * 下载成功的回调方法 */ @Override public void onSuccess(String result) { try { JSONObject obj = new JSONObject(result); switch (obj.getInt(Config.KEY_STATUS)) { case Config.RESULT_STATUS_SUCCESS: if (successCallback!=null) { // Message(String msgId,String msg,String phone_md5) List<Message> msgs = new ArrayList<Message>(); /** * out.print("{\"status\":1,\"page\":1,\"perpage\":20,\"timeline\":[" + "{\"msg\":\"Haha1\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha2\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha3\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha4\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha5\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha6\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha7\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}," + "{\"msg\":\"Haha8\",\"phone_md5\":\"dasdasdbkas\",\"msgId\":\"1231234\"}" + "]}"); */ JSONArray msgJsonArray = obj.getJSONArray(Config.KEY_TIMELINE); JSONObject msgObj; for (int i = 0; i <msgJsonArray.length(); i++) { msgObj = msgJsonArray.getJSONObject(i); msgs.add(new Message( msgObj.getString(Config.KEY_MSG_ID), msgObj.getString(Config.KEY_MSG), msgObj.getString(Config.KEY_PHONE_MD5) )); } successCallback.onSuccess(obj.getInt(Config.KEY_PAGE), obj.getInt(Config.KEY_PERPAGE), msgs); // successCallback.onSuccess(1, 20, msgs); } break; case Config.RESULT_STATUS_INVALID_TOKEN: if (failCallback!=null) { failCallback.onFail(Config.RESULT_STATUS_INVALID_TOKEN); } break; default: if (failCallback!=null) { failCallback.onFail(Config.RESULT_STATUS_FAIL); } break; } } catch (JSONException e) { e.printStackTrace(); if (failCallback!=null) { failCallback.onFail(Config.RESULT_STATUS_FAIL); } } } }, new NetConnection.FailCallback() { @Override public void onFail() { if (failCallback!=null) { failCallback.onFail(Config.RESULT_STATUS_FAIL); } } }, Config.KEY_ACTION,Config.ACTION_TIMELINE, Config.KEY_PHONE_MD5,phone_md5, Config.KEY_TOKEN,token, Config.KEY_PAGE,page+"", Config.KEY_PERPAGE,perpage+""); } public static interface SuccessCallback{ void onSuccess(int page,int perpage,List<Message> timeline); } public static interface FailCallback{ void onFail(int errorCode); } }
说说数据请求完毕,进行页面填充
adapter.addAll(timeline);实现方法如下
AtyTimelineMessageListAdapter
package com.jikexueyuan.secret.atys; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.jikexueyuan.secret.R; import com.jikexueyuan.secret.net.Message; public class AtyTimelineMessageListAdapter extends BaseAdapter{ public AtyTimelineMessageListAdapter(Context context) { this.context = context; } @Override public int getCount() { return data.size(); } @Override public Message getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView==null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.aty_timeline_list_cell, null); convertView.setTag(new ListCell((TextView) convertView.findViewById(R.id.tvCellLabel))); } ListCell lc = (ListCell) convertView.getTag(); Message msg = getItem(position); lc.getTvCellLabel().setText(msg.getMsg()); return convertView; } public Context getContext() { return context; } public void addAll(List<Message> data){ this.data.addAll(data); notifyDataSetChanged(); } public void clear(){ data.clear(); notifyDataSetChanged(); } private List<Message> data = new ArrayList<Message>(); private Context context=null; private static class ListCell{ public ListCell(TextView tvCellLabel) { this.tvCellLabel = tvCellLabel; } private TextView tvCellLabel; public TextView getTvCellLabel() { return tvCellLabel; } } }
相关文章推荐
- 黑马程序员_IO流之异常处理机制与File类
- 转载LoadRunner的常用Java API
- Linux关机及重启指令对比
- IOS具体的学习方法
- ListView优化
- 实现顶部轮播,下部listview经典布局的两种方式
- 2015-08-24 part2 bootloader前期准备
- bzoj-2693 jzptab
- C语言strlen函数和sizeof操作符
- 实现顶部轮播,下部listview经典布局的两种方式
- C#面向对象基础
- 最小费用最大流 【模板】
- 计算机应用——DOS命令下的网络管理和诊断-终
- 计算机应用——DOS命令下的网络管理和诊断-续
- 计算机应用记录
- 排序算法(四)插入排序
- webview 与 js交互
- github使用总结
- Spring整合JPA
- WampServer中Apache使用FastCGI模式跑PHP5.3nts版