package com.wise.wawc; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.wise.list.XListView; import com.wise.list.XListView.IXListViewListener; import com.wise.pubclas.Constant; import com.wise.pubclas.GetSystem; import com.wise.pubclas.NetThread; import com.wise.pubclas.Variable; import com.wise.sql.DBExcute; import com.wise.sql.DBHelper; import android.app.Activity; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; /** * 爱车故障 * @author honesty */ public class CarFaultActivity extends Activity implements IXListViewListener{ private final String TAG = "CarFaultActivity"; private final int get_data = 1; private final int refresh_data = 2; XListView lv_activity_car_fault; List<FaultData> faultDatas = new ArrayList<FaultData>(); FaultAdapter faultAdapter; DBExcute dbExcute = new DBExcute(); String device_id = "3"; boolean isGetDB = true; //上拉是否继续读取数据库 int Toal = 0; //从那条记录读起 int pageSize = 5 ; //每次读取的记录数目 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_car_fault); ImageView iv_activity_car_fault_back = (ImageView)findViewById(R.id.iv_activity_car_fault_back); iv_activity_car_fault_back.setOnClickListener(onClickListener); lv_activity_car_fault = (XListView)findViewById(R.id.lv_activity_car_fault); lv_activity_car_fault.setXListViewListener(this); faultAdapter = new FaultAdapter(CarFaultActivity.this,faultDatas); lv_activity_car_fault.setAdapter(faultAdapter); boolean isUrl = isGetDataUrl(device_id); if(isUrl){ isGetDB = false; getFaultFromUrl(); }else{ isGetDB = true; faultDatas.addAll(getFaultDatas(Toal, pageSize)); faultAdapter.notifyDataSetChanged(); } } OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_activity_car_fault_back: finish(); break; default: break; } } }; Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case get_data: faultDatas.addAll(jsonData(msg.obj.toString())); faultAdapter.notifyDataSetChanged(); onLoad(); break; case refresh_data: faultDatas.addAll(0, jsonData(msg.obj.toString())); faultAdapter.notifyDataSetChanged(); onLoad(); break; } } }; /** * 判断本地是否有记录 * @param device_id * @return */ private boolean isGetDataUrl(String device_id){ String sql = "select * from " + Constant.TB_Faults + " where DeviceID=?"; int Total = dbExcute.getTotalCount(getApplicationContext(), sql, new String[]{device_id}); if(Total == 0){ return true; }else{ return false; } } /** * 从服务器获取数据 */ private void getFaultFromUrl(){ String url = Constant.BaseUrl + "device/" + device_id + "/fault?auth_code=" + Variable.auth_code; new Thread(new NetThread.GetDataThread(handler, url, get_data)).start(); } String Data = ""; /** * 解析返回list数据 * @param result * @return */ private List<FaultData> jsonData(String result){ List<FaultData> Datas = new ArrayList<FaultData>(); try { JSONArray jsonArray = new JSONArray(result); for(int i = 0 ; i < jsonArray.length() ; i++){ JSONObject jsonObject = jsonArray.getJSONObject(i); String create_time = jsonObject.getString("create_time"); String fault_code = jsonObject.getString("fault_code"); String fault_desc = jsonObject.getString("fault_desc"); int fault_id = jsonObject.getInt("fault_id"); create_time = create_time.substring(0, create_time.length() - 8).replace("T", " "); String[] str = GetSystem.formatDateTime(create_time); FaultData faultData = new FaultData(); faultData.setData(str[2]); faultData.setTime(str[1]); if(Data.equals(str[0])){ faultData.setDataFrist(false); }else{ faultData.setDataFrist(true); } Data = str[0]; faultData.setFault_id(fault_id); faultData.setFaultCode("故障码:" + fault_code); faultData.setFaultInfo("故障描述:" + fault_desc); Datas.add(faultData); ContentValues values = new ContentValues(); values.put("DeviceID", device_id); values.put("fault_id", fault_id); values.put("fault_code", fault_code); values.put("fault_desc", fault_desc); values.put("create_time", create_time); dbExcute.InsertDB(CarFaultActivity.this, values, Constant.TB_Faults); } } catch (JSONException e) { e.printStackTrace(); } return Datas; } private List<FaultData> getFaultDatas(int start,int pageSize) { System.out.println("start = " + start); List<FaultData> datas = getPageDatas(CarFaultActivity.this, "select * from " + Constant.TB_Faults + " where DeviceID=? order by fault_id desc limit ?,?", new String[]{device_id,String.valueOf(start),String.valueOf(pageSize)}); Toal += datas.size();//记录位置 if(datas.size() == pageSize){ //继续读取数据库 }else{ //数据库读取完毕 isGetDB = false; } return datas; } public List<FaultData> getPageDatas(Context context,String sql,String[] whereClause){ DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, whereClause); List<FaultData> Datas = new ArrayList<FaultData>(); while(cursor.moveToNext()){ FaultData faultData = new FaultData(); String create_time = cursor.getString(cursor.getColumnIndex("create_time")); String fault_code = cursor.getString(cursor.getColumnIndex("fault_code")); String fault_desc = cursor.getString(cursor.getColumnIndex("fault_desc")); int fault_id = cursor.getInt(cursor.getColumnIndex("fault_id")); String[] str = GetSystem.formatDateTime(create_time); faultData.setData(str[2]); faultData.setTime(str[1]); if(Data.equals(str[0])){ faultData.setDataFrist(false); }else{ faultData.setDataFrist(true); } Data = str[0]; faultData.setFault_id(fault_id); faultData.setFaultCode("故障码:" + fault_code); faultData.setFaultInfo("故障描述:" + fault_desc); Datas.add(faultData); } cursor.close(); db.close(); return Datas; } private class FaultAdapter extends BaseAdapter{ LayoutInflater mInflater; List<FaultData> faultDatas; private FaultAdapter(Context mContext,List<FaultData> faultDatas){ mInflater = LayoutInflater.from(mContext); this.faultDatas = faultDatas; } @Override public int getCount() { return faultDatas.size(); } @Override public Object getItem(int position) { return faultDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_car_fault, null); holder = new ViewHolder(); holder.tv_item_car_fault_data = (TextView) convertView.findViewById(R.id.tv_item_car_fault_data); holder.tv_item_car_fault_code = (TextView)convertView.findViewById(R.id.tv_item_car_fault_code); holder.tv_item_car_fault_info = (TextView)convertView.findViewById(R.id.tv_item_car_fault_info); holder.tv_time = (TextView)convertView.findViewById(R.id.tv_time); holder.iv_item_car_fault_share = (ImageView)convertView.findViewById(R.id.iv_item_car_fault_share); holder.ll_item_car_fault = (LinearLayout)convertView.findViewById(R.id.ll_item_car_fault); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final FaultData faultData = faultDatas.get(position); holder.tv_item_car_fault_data.setText(faultData.getData()); holder.tv_item_car_fault_code.setText(faultData.getFaultCode()); holder.tv_item_car_fault_info.setText(faultData.getFaultInfo()); holder.tv_time.setText(faultData.getTime()); holder.iv_item_car_fault_share.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { StringBuffer sb = new StringBuffer(); sb.append("【故障】 "); sb.append(faultData.getTime().substring(5, 16)); sb.append("," + faultData.getFaultCode()); sb.append("," + faultData.getFaultInfo()); GetSystem.share(CarFaultActivity.this, sb.toString(), "",0,0,"故障",""); } }); if(faultData.isDataFrist){ holder.ll_item_car_fault.setVisibility(View.VISIBLE); holder.tv_item_car_fault_data.setVisibility(View.VISIBLE); }else{ holder.tv_item_car_fault_data.setVisibility(View.INVISIBLE); holder.ll_item_car_fault.setVisibility(View.GONE); } return convertView; } private class ViewHolder { TextView tv_item_car_fault_data,tv_item_car_fault_code,tv_item_car_fault_info,tv_time; ImageView iv_item_car_fault_share; LinearLayout ll_item_car_fault; } } private class FaultData{ int Fault_id; String Data; String Time; String FaultCode; String FaultInfo; boolean isDataFrist; public int getFault_id() { return Fault_id; } public void setFault_id(int fault_id) { Fault_id = fault_id; } public String getData() { return Data; } public void setData(String data) { Data = data; } public String getTime() { return Time; } public void setTime(String time) { Time = time; } public String getFaultCode() { return FaultCode; } public void setFaultCode(String faultCode) { FaultCode = faultCode; } public String getFaultInfo() { return FaultInfo; } public void setFaultInfo(String faultInfo) { FaultInfo = faultInfo; } public boolean isDataFrist() { return isDataFrist; } public void setDataFrist(boolean isDataFrist) { this.isDataFrist = isDataFrist; } @Override public String toString() { return "FaultData [Fault_id=" + Fault_id + ", Data=" + Data + ", Time=" + Time + ", FaultCode=" + FaultCode + ", FaultInfo=" + FaultInfo + ", isDataFrist=" + isDataFrist + "]"; } } @Override public void onRefresh() { String url = Constant.BaseUrl + "device/" + device_id + "/fault?auth_code=" + Variable.auth_code + "&max_id=" + faultDatas.get(0).getFault_id(); System.out.println("onREfresh"); new Thread(new NetThread.GetDataThread(handler, url, refresh_data)).start(); } @Override public void onLoadMore() { if(isGetDB){ faultDatas.addAll(getFaultDatas(Toal, pageSize)); faultAdapter.notifyDataSetChanged(); }else{ int min_id = faultDatas.get(faultDatas.size() - 1).getFault_id(); String url = Constant.BaseUrl + "device/" + device_id + "/fault?auth_code=" + Variable.auth_code + "&min_id=" + min_id;; new Thread(new NetThread.GetDataThread(handler, url, get_data)).start(); } } private void onLoad() { lv_activity_car_fault.stopRefresh(); lv_activity_car_fault.stopLoadMore(); } }