@XQF
2016-08-03T22:45:14.000000Z
字数 6025
阅读 941
匿名
getTag()与getTag()我就看成是两个万能的仓库,再自己写个类封装一下数据,这里比较坑的是为什么不能直接通过这两个方法对数据进行缓存,,。,。?真是麻烦,还要写一个宿主,用来寄生
package com.example.secret1.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.example.secret1.R;
import com.example.secret1.net.Message;
public class AtyTimelineMessageListAdapter extends BaseAdapter {
private Context context;// 因此context很重要我們在類裏面可能要經常使用因此有必要進行好記錄
private List<Message> dataList = new ArrayList<Message>();
public Context getContext() {// 可以让它在外界可以访问到
return context;
}
public AtyTimelineMessageListAdapter(Context context) {
// TODO Auto-generated constructor stub
this.context = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList.size();// 返回有多少项
}
@Override
public Message getItem(int position) {
// TODO Auto-generated method stub
return dataList.get(position);// List还有这个方法???????,返回在这个位置上的一条
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;// 就是保证在list里面的每一条内容唯一就行了,position就是唯一的
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {// convertview专门用于缓存的,要是为空的话就说明之前美哟缓存过
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.aty_timeline_listcell, null); // 加载我们传入的布局,相当于setContentView(),这里还是不知道root为null的意思
ViewHolder viewHolder = new ViewHolder();
viewHolder.tvCellLabel = (TextView) convertView
.findViewById(R.id.tvCellLabel);
convertView.setTag(viewHolder);
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();// 这里getTag()出来可能不是ViewHolder类型的对象
Message msg = getItem(position);
viewHolder.tvCellLabel.setText(msg.getMsg());
return convertView;//放心的把列表项返回出去,我也看不出来什么时候不放心,listview会获取到这个列表项进行显示
}
private TextView findViewById(int tvcelllabel) {
// TODO Auto-generated method stub
return null;
}
public void addAll(List<Message> data) {// 这个是外面把数据传进来的入口
dataList.addAll(data);
notifyDataSetChanged();// 数据有改变,我们要更新列表,进行UI方面的刷新
}
public void clear() {
dataList.clear();// 将数据清空,养成好习惯,有添加就必须有清空
notifyDataSetChanged();
}
class ViewHolder {
TextView tvCellLabel;
}
}
注意JSONArray的格式,原来这样才是一个JSONArray,我以前以为一条就是一个Array,其实这一条只是其中的一个元素,不难理解在解析JSONArry的时候先一个一个的JSONObject的取
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
out.clear(); //清理一下输出的缓存
String action = request.getParameter("action");//从客户端发过来的请求数据中获取action的Token,action对应的键值
if (action != null) {
if (action.equals("send_pass")) {//刚好就是我们前面所规定的Token
out.print("{\"status\":1}");//action正确返回一个json格式的字符串
}else if(action.equals("login")){
out.print("{\"status\":1,\"token\":\"jifgjhhgtjr\"}");
}else if(action.equals("upload_contacts")){
out.print("{\"status\":1}");
}else if(action.equals("timeline")){
out.print("{\"status\":1,\"page\":1,\"perpage\":20,\"items\":["+
//原来这样的才叫JSONArray
"{\"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\"}"+"]}");
}
}
else {
out.print("请指定action");
}
%>
package com.example.secret1.atys;
import java.util.List;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import com.example.secret1.Config;
import com.example.secret1.R;
import com.example.secret1.ld.MyContacts;
import com.example.secret1.net.Message;
import com.example.secret1.net.Timeline;
import com.example.secret1.net.UploadContacts;
import com.example.secret1.tools.MD5Tool;
public class AtyTimeline extends ListActivity {
private String phoneNum, phone_md5;// 手机自己缓存可以是手机号,只是要服务器不保存手机号就是了
private String token;
private AtyTimelineMessageListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.aty_timeline);
adapter = new AtyTimelineMessageListAdapter(AtyTimeline.this);
setListAdapter(adapter);
// 呈现消息列表之前来上传联系人同步一下,因为联系人数据可能发生改变
phoneNum = getIntent().getStringExtra(Config.KEY_PHONE);
// System.out.println("AtyTimeline:phone "+phoneNum);
token = getIntent().getStringExtra(Config.KEY_TOKEN);
// System.out.println(Config.KEY_TOKEN);
// System.out.println("AtyTimeline:token "+token);
final ProgressDialog pd = ProgressDialog.show(AtyTimeline.this,
getResources().getString(R.string.connecting), getResources()
.getString(R.string.connecting_to_sever));
phone_md5 = MD5Tool.getMd5(phoneNum);
new UploadContacts(phone_md5, token,
MyContacts.getContactsJSONString(this),
new UploadContacts.SuccessCallback() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
loadMessage();
pd.dismiss();
}
}, new UploadContacts.FailCallback() {
@Override
public void onFail(int ErrorCode) {
pd.dismiss();
// TODO Auto-generated method stub
if (ErrorCode == Config.RESULT_STATUS_INVILD_TOKEN) {// 要是登陆过期,就跳转重新登陆
startActivity(new Intent(AtyTimeline.this,
AtyLogin.class));
finish();
} else {// token有效,之前已经将token的情况进行了过滤,要不是过期就只能是成功了
loadMessage();
}
}
});
}
public void loadMessage() {
final ProgressDialog pd = ProgressDialog.show(AtyTimeline.this,
getResources().getString(R.string.connecting), getResources()
.getString(R.string.connecting_to_sever));
new Timeline(phone_md5, token, 1, 20, new Timeline.SuccessCallback() {
@Override
public void onSuccess(int page, int perpage, List<Message> timeline) {
// TODO Auto-generated method stub
pd.dismiss();
// 成功就要就將內容顯示出來就可以了
adapter.addAll(timeline);
}
}, new Timeline.FailCallback() {
@Override
public void onFail() {
// TODO Auto-generated method stub
pd.dismiss();
Toast.makeText(AtyTimeline.this,
R.string.fail_to_load_timeline_data, Toast.LENGTH_SHORT)
.show();
}
});
}
}