[关闭]
@XQF 2016-08-03T22:45:14.000000Z 字数 6025 阅读 941

《匿名》第二十二课----消息列表界面逻辑实现3(优化了适配器)

匿名

优化后的AtyTimelineMessageAdapter.java

getTag()与getTag()我就看成是两个万能的仓库,再自己写个类封装一下数据,这里比较坑的是为什么不能直接通过这两个方法对数据进行缓存,,。,。?真是麻烦,还要写一个宿主,用来寄生

  1. package com.example.secret1.atys;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.BaseAdapter;
  9. import android.widget.TextView;
  10. import com.example.secret1.R;
  11. import com.example.secret1.net.Message;
  12. public class AtyTimelineMessageListAdapter extends BaseAdapter {
  13. private Context context;// 因此context很重要我們在類裏面可能要經常使用因此有必要進行好記錄
  14. private List<Message> dataList = new ArrayList<Message>();
  15. public Context getContext() {// 可以让它在外界可以访问到
  16. return context;
  17. }
  18. public AtyTimelineMessageListAdapter(Context context) {
  19. // TODO Auto-generated constructor stub
  20. this.context = context;
  21. }
  22. @Override
  23. public int getCount() {
  24. // TODO Auto-generated method stub
  25. return dataList.size();// 返回有多少项
  26. }
  27. @Override
  28. public Message getItem(int position) {
  29. // TODO Auto-generated method stub
  30. return dataList.get(position);// List还有这个方法???????,返回在这个位置上的一条
  31. }
  32. @Override
  33. public long getItemId(int position) {
  34. // TODO Auto-generated method stub
  35. return position;// 就是保证在list里面的每一条内容唯一就行了,position就是唯一的
  36. }
  37. @Override
  38. public View getView(int position, View convertView, ViewGroup parent) {
  39. // TODO Auto-generated method stub
  40. if (convertView == null) {// convertview专门用于缓存的,要是为空的话就说明之前美哟缓存过
  41. convertView = LayoutInflater.from(getContext()).inflate(
  42. R.layout.aty_timeline_listcell, null); // 加载我们传入的布局,相当于setContentView(),这里还是不知道root为null的意思
  43. ViewHolder viewHolder = new ViewHolder();
  44. viewHolder.tvCellLabel = (TextView) convertView
  45. .findViewById(R.id.tvCellLabel);
  46. convertView.setTag(viewHolder);
  47. }
  48. ViewHolder viewHolder = (ViewHolder) convertView.getTag();// 这里getTag()出来可能不是ViewHolder类型的对象
  49. Message msg = getItem(position);
  50. viewHolder.tvCellLabel.setText(msg.getMsg());
  51. return convertView;//放心的把列表项返回出去,我也看不出来什么时候不放心,listview会获取到这个列表项进行显示
  52. }
  53. private TextView findViewById(int tvcelllabel) {
  54. // TODO Auto-generated method stub
  55. return null;
  56. }
  57. public void addAll(List<Message> data) {// 这个是外面把数据传进来的入口
  58. dataList.addAll(data);
  59. notifyDataSetChanged();// 数据有改变,我们要更新列表,进行UI方面的刷新
  60. }
  61. public void clear() {
  62. dataList.clear();// 将数据清空,养成好习惯,有添加就必须有清空
  63. notifyDataSetChanged();
  64. }
  65. class ViewHolder {
  66. TextView tvCellLabel;
  67. }
  68. }

更新后的服务器端api.jsp

注意JSONArray的格式,原来这样才是一个JSONArray,我以前以为一条就是一个Array,其实这一条只是其中的一个元素,不难理解在解析JSONArry的时候先一个一个的JSONObject的取

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <%
  4. out.clear(); //清理一下输出的缓存
  5. String action = request.getParameter("action");//从客户端发过来的请求数据中获取action的Token,action对应的键值
  6. if (action != null) {
  7. if (action.equals("send_pass")) {//刚好就是我们前面所规定的Token
  8. out.print("{\"status\":1}");//action正确返回一个json格式的字符串
  9. }else if(action.equals("login")){
  10. out.print("{\"status\":1,\"token\":\"jifgjhhgtjr\"}");
  11. }else if(action.equals("upload_contacts")){
  12. out.print("{\"status\":1}");
  13. }else if(action.equals("timeline")){
  14. out.print("{\"status\":1,\"page\":1,\"perpage\":20,\"items\":["+
  15. //原来这样的才叫JSONArray
  16. "{\"msg\":\"Haha1\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha2\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha3\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha4\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"{\"msg\":\"Haha\",\"phone_md5\":\"fjerkgjfrjkhgtrj\",\"msgId\":\"1541\"}"+"]}");
  17. }
  18. }
  19. else {
  20. out.print("请指定action");
  21. }
  22. %>

到这里最新的AtyTimeline.java

  1. package com.example.secret1.atys;
  2. import java.util.List;
  3. import android.app.ListActivity;
  4. import android.app.ProgressDialog;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.widget.Toast;
  8. import com.example.secret1.Config;
  9. import com.example.secret1.R;
  10. import com.example.secret1.ld.MyContacts;
  11. import com.example.secret1.net.Message;
  12. import com.example.secret1.net.Timeline;
  13. import com.example.secret1.net.UploadContacts;
  14. import com.example.secret1.tools.MD5Tool;
  15. public class AtyTimeline extends ListActivity {
  16. private String phoneNum, phone_md5;// 手机自己缓存可以是手机号,只是要服务器不保存手机号就是了
  17. private String token;
  18. private AtyTimelineMessageListAdapter adapter;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. // TODO Auto-generated method stub
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.aty_timeline);
  24. adapter = new AtyTimelineMessageListAdapter(AtyTimeline.this);
  25. setListAdapter(adapter);
  26. // 呈现消息列表之前来上传联系人同步一下,因为联系人数据可能发生改变
  27. phoneNum = getIntent().getStringExtra(Config.KEY_PHONE);
  28. // System.out.println("AtyTimeline:phone "+phoneNum);
  29. token = getIntent().getStringExtra(Config.KEY_TOKEN);
  30. // System.out.println(Config.KEY_TOKEN);
  31. // System.out.println("AtyTimeline:token "+token);
  32. final ProgressDialog pd = ProgressDialog.show(AtyTimeline.this,
  33. getResources().getString(R.string.connecting), getResources()
  34. .getString(R.string.connecting_to_sever));
  35. phone_md5 = MD5Tool.getMd5(phoneNum);
  36. new UploadContacts(phone_md5, token,
  37. MyContacts.getContactsJSONString(this),
  38. new UploadContacts.SuccessCallback() {
  39. @Override
  40. public void onSuccess() {
  41. // TODO Auto-generated method stub
  42. loadMessage();
  43. pd.dismiss();
  44. }
  45. }, new UploadContacts.FailCallback() {
  46. @Override
  47. public void onFail(int ErrorCode) {
  48. pd.dismiss();
  49. // TODO Auto-generated method stub
  50. if (ErrorCode == Config.RESULT_STATUS_INVILD_TOKEN) {// 要是登陆过期,就跳转重新登陆
  51. startActivity(new Intent(AtyTimeline.this,
  52. AtyLogin.class));
  53. finish();
  54. } else {// token有效,之前已经将token的情况进行了过滤,要不是过期就只能是成功了
  55. loadMessage();
  56. }
  57. }
  58. });
  59. }
  60. public void loadMessage() {
  61. final ProgressDialog pd = ProgressDialog.show(AtyTimeline.this,
  62. getResources().getString(R.string.connecting), getResources()
  63. .getString(R.string.connecting_to_sever));
  64. new Timeline(phone_md5, token, 1, 20, new Timeline.SuccessCallback() {
  65. @Override
  66. public void onSuccess(int page, int perpage, List<Message> timeline) {
  67. // TODO Auto-generated method stub
  68. pd.dismiss();
  69. // 成功就要就將內容顯示出來就可以了
  70. adapter.addAll(timeline);
  71. }
  72. }, new Timeline.FailCallback() {
  73. @Override
  74. public void onFail() {
  75. // TODO Auto-generated method stub
  76. pd.dismiss();
  77. Toast.makeText(AtyTimeline.this,
  78. R.string.fail_to_load_timeline_data, Toast.LENGTH_SHORT)
  79. .show();
  80. }
  81. });
  82. }
  83. }

真是要大心脏,全身心的投入,自己理清项目的种种呀,像我这种跟着做的,多少有些记不清,有的时候经常忘记东西,要是自己写的话,应该能分得非常清楚,哪些地方是用的哪些参数,哪些地方要传哪些参数

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注