Android切近实战(七)

简介:

边看世界杯,边写博客。记得小时候,去山上玩,翻了两座山,到了一个叫克劳的地方。那里每到六月份,桃子,杏多的很,有时候你坐在树上吃一下午都不会有人来,自然了,那里也就人烟稀少。我当时渴急了,在玉米地边上的牛踩出的蹄窝里喝了一口水,那水真是甘甜哪,忽然觉得脚底下什么在动,抬脚一看,一只螃蟹被我踩到了泥土中。那时候吃野枣,自制枪打野鸡,用套套野兔,在河里捉螃蟹,钓鱼,在洪水中游泳,上山挖药,在山上烤红薯,烤玉米,到了冬天,可以点荒,一盒火柴去见识燎原,这都是经常的事。不知道现在我再去那地方还能不能可以去做这些事情,下周准备回去玩玩,看这些地方是否依然还是那么美丽。


OK,今天我们来看一下如下这个消息管理界面

wKioL1OdEoLyBmqiAAHsoBL72HM964.jpg

先上图,看一下android版本的,先登录,登陆界面美化之后还像这么回事

wKioL1OdEx6CjQtsAAGC-Gl14oI082.jpg

我们看一下短消息管理界面

wKiom1OdE8-wfA_9AAHGCzE8e5s273.jpg


在这里我们还是要首先看一下WebService端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  class  MessageMng : System.Web.Services.WebService
     {
         [WebMethod]
         public  List<MessageEntity> GetMessageEntity( string  sendUser,  string  receiveUser,  string  title,  string  messageType,  string  startDate,  string  endDate)
         {
             try
             {
                 return  MessageMngBiz.GetInstance().GetMessageEntity(sendUser, receiveUser, title, messageType, startDate, endDate);
             }
             catch
             {
                 return  new  List<MessageEntity>();
             }
 
         }
     }

我们再看一下Biz层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public  class  MessageMngBiz
     {
         static  MessageMngBiz messageMngBiz =  new  MessageMngBiz();
         private  MessageMngBiz()
         { }
 
         public  static  MessageMngBiz GetInstance()
         {
             return  messageMngBiz;
         }
 
         public  List<MessageEntity> GetMessageEntity( string  sendUser,  string  receiveUser,  string  title,  string  messageType,  string  startDateStr,  string  endDateStr)
         {
             DateTime startDate = DateTime.MinValue;
             DateTime endDate = DateTime.MinValue;
             if  (! string .IsNullOrWhiteSpace(startDateStr))
             {
                 DateTime.TryParse(startDateStr.Trim(),  out  startDate);
             }
 
             if  (! string .IsNullOrWhiteSpace(endDateStr))
             {
                 DateTime.TryParse(endDateStr.Trim(),  out  endDate);
             }
 
             return  MessageMngDAL.GetInstance().GetMessageEntity(sendUser, receiveUser, title, messageType, startDate == DateTime.MinValue ?  null  : (DateTime?)startDate, endDate == DateTime.MinValue ?  null  : (DateTime?)endDate);
         }
     }

再看一下DAL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  public  class  MessageMngDAL
     {
         static  MessageMngDAL messageMngDAL =  new  MessageMngDAL();
         private  MessageMngDAL()
         { }
 
         public  static  MessageMngDAL GetInstance()
         {
             return  messageMngDAL;
         }
 
         /// <summary>
         ///获取短信息
         /// </summary>
         /// <param name="sendUser">发送者</param>
         /// <param name="receiveUser">接收者</param>
         /// <param name="title">标题</param>
         /// <param name="messageType">类型(未读/已读,已删)</param>
         /// <param name="startDate">开始时间</param>
         /// <param name="endDate">结束时间</param>
         /// <returns></returns>
         public  List<MessageEntity> GetMessageEntity( string  sendUser,  string  receiveUser,  string  title,  string  messageType, DateTime? startDate, DateTime? endDate)
         {
             bool  isDateSearch = startDate.HasValue && endDate.HasValue;
 
             DirectSpecification<Message> commonSpecification =  new  DirectSpecification<Message>(msg =>
               ( string .IsNullOrEmpty(sendUser) ?  true  : msg.CerateUser == sendUser)
               && ( string .IsNullOrEmpty(title) ?  true  : msg.Title.Contains(title))
               && (isDateSearch ? (msg.CreateDate >= startDate && msg.CreateDate <= endDate) :  true )
               && msg.ReceiveUser.Equals(receiveUser));
 
             MessageType messageTypeEnum =  new  MessageTypeIndexes()[messageType];
 
             using  (BonusEntities bonusEntities =  new  BonusEntities())
             {
                 if  (messageTypeEnum == MessageType.READ)
                 {
                     DirectSpecification<Message> readMsgSpec =  new  DirectSpecification<Message>(msg => msg.IsDel ==  false );
                     AndSpecification<Message> andSpecification =  new  AndSpecification<Message>(commonSpecification, readMsgSpec);
 
                     IEnumerable<Message> messageList = bonusEntities.Message.Where(andSpecification.SatisfiedBy());
 
                     return  messageList.AsEnumerable().Select(msg =>
                     new  MessageEntity()
                     {
                         TransactionNumber = msg.TransactionNumber,
                         Title = msg.Title,
                         MessageContent = msg.MessageContent.Length>50? msg.MessageContent.Substring(0, 50):msg.MessageContent,
                         CreateUser = msg.UserCreate.UerInfo !=  null  ? msg.UserCreate.UerInfo.FirstOrDefault().Name : msg.UserCreate.UseNo,
                         CreateDate = msg.CreateDate.ToString(),
                         IsRead = msg.IsRead
                     }).ToList();
                 }
 
                 if  (messageTypeEnum == MessageType.DELETE)
                 {
                     DirectSpecification<Message> delMsgSpec =  new  DirectSpecification<Message>(msg => msg.IsDel ==  true
                     && msg.IsDestroy ==  false );
                     AndSpecification<Message> andSpecification =  new  AndSpecification<Message>(commonSpecification, delMsgSpec);
 
                     IQueryable<Message> messageList = bonusEntities.Message.Where(andSpecification.SatisfiedBy());
 
                     return  messageList.AsEnumerable().Select(msg =>
                     new  MessageEntity()
                     {
                         TransactionNumber = msg.TransactionNumber,
                         Title = msg.Title,
                         MessageContent = msg.MessageContent.Substring(0, 50),
                         CreateUser = msg.UserCreate.UerInfo !=  null  ? msg.UserCreate.UerInfo.FirstOrDefault().Name : msg.UserCreate.UseNo,
                         CreateDate = msg.CreateDate.ToString(),
                         DelDate = msg.DelDate.HasValue? msg.DelDate.ToString(): string .Empty
                     }).ToList();
                 }
 
                 return  new  List<MessageEntity>();
             }
         }
     }
 
     public  enum  MessageType
     {
         READ = 1,
         DELETE = 2
     }
 
     public  class  MessageTypeIndexes
     {
         public  Array MessageTypeEnumArray
         {
             get
             {
                 return  Enum.GetValues( typeof (MessageType));
             }
         }
 
         public  MessageType  this [ string  msgType]
         {
             get
             {
                 int  messageType =  int .Parse(msgType);
                 return  (MessageType)MessageTypeEnumArray.GetValue(--messageType);
             }
         }
     }

好了,都是些查询,没什么可说的。


OK,我们现在就来看一下android的实现,我们先看一下前台布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<? xml  version = "1.0"  encoding = "utf-8" ?>
< ScrollView  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:layout_width = "fill_parent"  android:layout_height = "fill_parent"
     android:scrollbars = "vertical"  android:fadingEdge = "none" >
     < LinearLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
         android:layout_width = "fill_parent"  android:layout_height = "fill_parent"
         android:orientation = "vertical"  android:background = "@color/red1" >
         < LinearLayout  android:layout_height = "wrap_content"
             android:layout_width = "fill_parent"  android:orientation = "vertical"
             android:background = "@color/teal1"  android:layout_margin = "1dp" >
             < TableLayout  android:layout_height = "wrap_content"
                 android:layout_width = "wrap_content"  android:shrinkColumns = "1"
                 android:stretchColumns = "1"  android:background = "@color/teal"
                 android:layout_margin = "2dp" >
                 < TableRow >
                     < TextView  android:text = "@string/labSendUser"
                         android:textSize = "8pt"  android:gravity = "right"  android:textColor = "@color/white" >
                     </ TextView >
                     < EditText  android:id = "@+id/txtSendUser"
                         android:drawableLeft = "@drawable/userhint"  android:singleLine = "true"
                         android:maxLength = "30"  android:textSize = "7pt" ></ EditText >
                 </ TableRow >
                 < TableRow >
                     < TextView  android:text = "@string/labTitle"  android:gravity = "right"
                         android:textSize = "8pt"  android:layout_marginLeft = "10pt"
                         android:textColor = "@color/white" >
                     </ TextView >
                     < EditText  android:id = "@+id/txtTitle"  android:drawableLeft = "@drawable/pencil"
                         android:singleLine = "true"  android:maxLength = "50" ></ EditText >
                 </ TableRow >
                 < TableRow >
                     < CheckBox  android:id = "@+id/chkIsDateCheck"  android:text = "@string/chkSendDate"
                         android:textSize = "8pt"  android:gravity = "center_vertical"
                         android:layout_gravity = "center_vertical"  android:layout_span = "2" ></ CheckBox >
                 </ TableRow >
                 < TableRow >
                     < TextView  android:text = "@string/chkBeginDate"
                         android:textSize = "8pt"  android:textColor = "@color/white" ></ TextView >
                     < EditText  android:id = "@+id/txtStartDate"
                         android:singleLine = "true"  android:editable = "false"
                         android:drawableRight = "@drawable/calander" ></ EditText >
                 </ TableRow >
                 < TableRow >
                     < TextView  android:text = "@string/chkEndDate"
                         android:textSize = "8pt"  android:textColor = "@color/white" ></ TextView >
                     < EditText  android:id = "@+id/txtEndDate"  android:singleLine = "true"
                         android:editable = "false"  android:drawableRight = "@drawable/calander" ></ EditText >
                 </ TableRow >
             </ TableLayout >
             < LinearLayout  android:orientation = "horizontal"
                 android:layout_width = "fill_parent"  android:layout_height = "wrap_content" >
                 < ImageButton  android:id = "@+id/imgBtnSearch"  android:src = "@drawable/search"
                     android:layout_weight = "1"  android:layout_width = "wrap_content"
                     android:layout_height = "60dp"  android:scaleType = "centerInside"
                     android:layout_marginLeft = "5dp"  android:layout_marginBottom = "1dp" ></ ImageButton >
                 < ImageButton  android:id = "@+id/imgBtnReset"
                     android:layout_gravity = "center_horizontal"  android:layout_weight = "1"
                     android:src = "@drawable/undo"  android:layout_width = "wrap_content"
                     android:layout_height = "60dp"  android:scaleType = "centerInside"
                     android:layout_marginLeft = "10dp"  android:layout_marginRight = "5dp"
                     android:layout_marginBottom = "1dp" ></ ImageButton >
             </ LinearLayout >
         </ LinearLayout >
         < TabHost  android:id = "@+id/tabhost"  android:layout_width = "fill_parent"
             android:layout_height = "wrap_content" >
             < LinearLayout  android:orientation = "vertical"
                 android:layout_width = "fill_parent"  android:layout_height = "fill_parent" >
                 < TabWidget  android:id = "@android:id/tabs"
                     android:orientation = "horizontal"  android:layout_width = "fill_parent"
                     android:layout_height = "wrap_content"  />
                 < FrameLayout  android:id = "@android:id/tabcontent"
                     android:layout_width = "fill_parent"  android:layout_height = "fill_parent" >
                     < HorizontalScrollView  android:layout_height = "fill_parent"
                         android:layout_width = "fill_parent"
                         android:scrollbarAlwaysDrawHorizontalTrack = "false" >
                         < TableLayout  android:layout_width = "fill_parent"
                             android:layout_height = "fill_parent"
                             android:stretchColumns = "0" >
                             < TableRow >
                                 < bruce.controls.CustomScrollViewer
                                     android:id = "@+id/gvMessageInfo" 
                                     android:layout_width = "fill_parent"
                                     android:layout_height = "fill_parent" >
                                 </ bruce.controls.CustomScrollViewer >
                             </ TableRow >
                         </ TableLayout >
                     </ HorizontalScrollView >
                 </ FrameLayout >
             </ LinearLayout >
         </ TabHost >
     </ LinearLayout >
</ ScrollView >

还是使用嵌套布局,在最后我们发现了一个tabHost,是的,这个就是来实现tab页的。我们看到tab页中有一个一行一列的table,里面放了一个bruce.controls.CustomScrollViewer。这个东西其实是我从网上粘出来的一个用于显示表格的自定义控件,这个写的里面还是有些问题,我对其进行了一些修改。


wKioL1OdFyXjXosjAAE_0A252kI921.jpg


今天主要不是针对这个,所以这个东西等下次我在讲查看短消息功能的时候再说吧。

OK,我们先看一下查询条件,发送人和标题就不看了,时间查询的话,如果勾选了,就必须选择日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private  Boolean CheckSearchCriteria(String startDateStr, String endDateStr)
             throws  ParseException {
         if  ( this .chkIsDateCheck.isChecked()) {
             if  (startDateStr.length() ==  0 ) {
                 this .ShowToast( "请选择开始日期!" );
                 return  false ;
             }
 
             if  (endDateStr.length() ==  0 ) {
                 this .ShowToast( "请选择开始日期!" );
                 return  false ;
             }
 
             SimpleDateFormat dateFormat =  new  SimpleDateFormat(
                     "yyyy-MM-dd HH:mm:ss" );
             Date startDate = dateFormat.parse(startDateStr +  " 00:00:01" );
             Date endDate = dateFormat.parse(endDateStr +  " 23:59:59" );
 
             if  (startDate.after(endDate)) {
                 this .ShowToast( "开始日期不能大于结束日期!" );
                 return  false ;
             }
         }
 
         return  true ;
     }

以前我们提示的时候都是使用Alert,现在的话,都是使用toast

1
2
3
4
5
6
7
8
9
10
11
12
13
private  void  ShowToast(String content) {
         Toast toast = Toast.makeText(getApplicationContext(), content,
                 Toast.LENGTH_LONG);
         toast.setGravity(Gravity.CENTER,  0 0 );
 
         LinearLayout toastContentView = (LinearLayout) toast.getView();
         ImageView imgToast =  new  ImageView(getApplicationContext());
         imgToast.setAdjustViewBounds( true );
         imgToast.setImageResource(R.drawable.alert);
 
         toastContentView.addView(imgToast,  0 );
         toast.show();
     }

上次的时候我们选择日期是使用Click事件,这次我们使用长按事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
txtStartDate.setOnLongClickListener( new  OnLongClickListener() {
             public  boolean  onLongClick(android.view.View view) {
                 if  (chkIsDateCheck.isChecked()) {
                     owner.ShowDatePicker(view);
                 }
                 return  true ;
             }
         });
 
         txtEndDate.setOnLongClickListener( new  OnLongClickListener() {
             public  boolean  onLongClick(android.view.View view) {
 
                 if  (chkIsDateCheck.isChecked()) {
                     owner.ShowDatePicker(view);
                 }
                 return  true ;
             }
         });

如下是ShowDatePicker的代码,这次将这个方法写成公用的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private  void  ShowDatePicker( final  View view) {
     Calendar calendar = Calendar.getInstance();
     DatePickerDialog dialog =  new  DatePickerDialog(owner,
             new  DatePickerDialog.OnDateSetListener() {
                 public  void  onDateSet(DatePicker dp,  int  year,  int  month,
                         int  dayOfMonth) {
 
                     if  (view  instanceof  EditText) {
                         ((EditText) view).setText(year +  "-"  + month +  "-"
                                 + dayOfMonth);
                     }
                 }
             }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
             calendar.get(Calendar.DAY_OF_MONTH));
 
     dialog.show();
}

OK,以上是查询部分,接下来我们看一下查询结果部分,先是构造tab页。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private  void  InitTabHost() {
         tabHost = (TabHost)  this .findViewById(R.id.tabhost);
         tabHost.setup();
 
         TabSpec specMessageNew = tabHost.newTabSpec( "tabMessageNew" );
         specMessageNew.setContent(R.id.gvMessageInfo);
         specMessageNew.setIndicator( "已读/未读" this .getResources().getDrawable(
                 R.drawable.emailread));
 
         TabSpec specMessageOld = tabHost.newTabSpec( "tabMessageOld" );
         specMessageOld.setContent(R.id.gvMessageInfo);
 
         specMessageOld.setIndicator( "已删消息" this .getResources().getDrawable(
                 R.drawable.emaildel));
 
         tabHost.addTab(specMessageNew);
         tabHost.addTab(specMessageOld);
     }

在这里,我们加了两个tab,setIndicator第一个参数是设置tab标题,第二个参数是设置tab图标。

wKiom1OdGbrj4aFPAABUJr4ZXcM047.jpg

setContent是设置tab页的内容,这里我们设置的是刚才上面介绍的自定义控件。


好的,我们最后看一下查询部分,调用WebService代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private  void  SearchMessage()  throws  ParseException {
 
         String startDateStr =  this .txtStartDate.getText().toString().trim();
         String endDateStr =  this .txtEndDate.getText().toString().trim();
 
         if  (! this .CheckSearchCriteria(startDateStr, endDateStr))
             return ;
 
         String title = txtTitle.getText().toString().trim();
         String sendUser = txtSendUser.getText().toString().trim();
 
         if  ( this .chkIsDateCheck.isChecked()) {
             SimpleDateFormat dateFormat =  new  SimpleDateFormat(
                     "yyyy-MM-dd HH:mm:ss" );
 
             startDateStr = startDateStr +  " 00:00:01" ;
             endDateStr = endDateStr +  " 23:59:59" ;
         }
 
         SoapObject response =  this .GetMessageEntityList(title, sendUser,
                 startDateStr, endDateStr, (String.valueOf(tabHost
                         .getCurrentTab() +  1 )));
 
         HashMap<String, Object> map =  null ;
         ArrayList<HashMap<String, Object>> mapList =  new  ArrayList<HashMap<String, Object>>();
 
         for  ( int  i =  0 ; i < response.getPropertyCount(); i++) {
             SoapObject soapObj = (SoapObject) response.getProperty(i);
 
             map =  new  HashMap<String, Object>();
             map.put( "Title" , soapObj.getProperty( "Title" ).toString());
             map.put( "MessageContent" , soapObj.getProperty( "MessageContent" )
                     .toString());
             map.put( "CreateUser" , soapObj.getProperty( "CreateUser" ).toString());
             map.put( "CreateDate" , soapObj.getProperty( "CreateDate" ).toString());
 
             Object isReadObj = soapObj.getProperty( "IsRead" );
             Boolean isRead = Boolean.valueOf(isReadObj.toString());
 
             map.put( "IsOpen" , isRead ? R.drawable.folderopen
                     : R.drawable.ckffolder);
             mapList.add(map);
         }
 
         this .BinData(mapList);
     }

在这里我们拿到了webservice返回的数据,调用代码如下

1
2
3
4
final  static  String NAMESPACE =  "http://tempuri.org/" ;
     final  static  String METHOD_NAME =  "GetMessageEntity" ;
     final  static  String SOAP_ACTION =  "http://tempuri.org/GetMessageEntity" ;
     final  static  String URL = main.baseIP +  "/MessageMng.asmx?wsdl" ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
private  SoapObject GetMessageEntityList(String title, String sendUser,
             String startDate, String endDate, String messageType) {
         SoapObject request =  new  SoapObject(NAMESPACE, METHOD_NAME);
         PropertyInfo pi =  new  PropertyInfo();
         pi.setName( "sendUser" );
         pi.setType(String. class );
         pi.setValue(sendUser);
         request.addProperty(pi);
 
         pi =  new  PropertyInfo();
         pi.setName( "receiveUser" );
         pi.setType(String. class );
         pi.setValue(userNo);
         request.addProperty(pi);
 
         pi =  new  PropertyInfo();
         pi.setName( "title" );
         pi.setType(String. class );
         pi.setValue(title);
         request.addProperty(pi);
 
         pi =  new  PropertyInfo();
         pi.setName( "messageType" );
         pi.setType(String. class );
         pi.setValue(messageType);
         request.addProperty(pi);
 
         pi =  new  PropertyInfo();
         pi.setName( "startDate" );
         pi.setType(String. class );
         pi.setValue(startDate);
         request.addProperty(pi);
 
         pi =  new  PropertyInfo();
         pi.setName( "endDate" );
         pi.setType(String. class );
         pi.setValue(endDate);
         request.addProperty(pi);
 
         SoapSerializationEnvelope soapEnvelope =  new  SoapSerializationEnvelope(
                 SoapEnvelope.VER11);
         soapEnvelope.dotNet =  true ;
         HttpTransportSE httpTS =  new  HttpTransportSE(URL);
         soapEnvelope.bodyOut = httpTS;
         soapEnvelope.setOutputSoapObject(request); // 设置请求参数
         // new MarshalDate().register(soapEnvelope);
 
         try  {
             httpTS.call(SOAP_ACTION, soapEnvelope);
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         catch  (XmlPullParserException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
         SoapObject result =  null ;
         try  {
             result = (SoapObject) soapEnvelope.getResponse();
         catch  (SoapFault e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
         return  result;
     }

OK,这些代码都是以前讲过的,在这里就不多说了。我们主要看BinData这个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private  void  BinData(ArrayList<HashMap<String, Object>> mapList) {
         String[] headers =  new  String[] {};
 
         if  (mapList.size() >  0 ) {
             headers = mapList.get( 0 ).keySet().toArray(headers);
         }
         
         gvMessage.setTableHeaders( this .TransferHeader(headers));
         gvMessage.setTableCellMaxEms( 5 );
 
         int [] imgColums = { 1 };
         gvMessage.setTableheadColor(R.color.teal);
         for  (HashMap<String, Object> hm : mapList) {
             gvMessage.addNewRow(hm.values().toArray(), imgColums); 
         }
     }

第一步先拿出列头,再转成汉字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private  String[] TransferHeader(String[] headers) {
     String[] header= new  String[]{};
     List<String> convertHeaderList =  new  ArrayList<String>();
 
     for  ( int  i =  0 ; i < headers.length; i++) {
         if  (headers[i] ==  "CreateUser" ) {
             convertHeaderList.add( "发送人" );
         }
         
         if  (headers[i] ==  "Title" ) {
             convertHeaderList.add( "标题" );
         }
 
         if  (headers[i] ==  "IsOpen" ) {
             convertHeaderList.add( "已读/未读" );
         }
         
         if  (headers[i] ==  "CreateDate" ) {
             convertHeaderList.add( "发送日期" );
         }
         
         if  (headers[i] ==  "MessageContent" ) {
             convertHeaderList.add( "消息内容" );
         }
     }
     
     return  convertHeaderList.toArray(header);
}

然后再循环设置行内容

1
2
3
for  (HashMap<String, Object> hm : mapList) {
             gvMessage.addNewRow(hm.values().toArray(), imgColums); 
         }

这里我们循环ArrayList<HashMap<String,Object>>,然后往表格控件中加数据,第一个参数是内容,第二个参数是图片内容所在的列的数组。OK,运行一下,查询试试

wKioL1OdHD2Cpt3lAAHDlWWh3JM705.jpg

通过查询check之后,我们看看结果

wKiom1OdHWmg5-fFAAJHu4ZndZE618.jpg

还行吧,OK,今天就到这里,下节我将给大家介绍这个自定义控件和实现

wKioL1OdHcTzbdOlAAF721w6y9M120.jpg



本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/1426543,如需转载请自行联系原作者


相关文章
|
2月前
Android4.1.0实战教程---自动阅读小说
Android4.1.0实战教程---自动阅读小说
69 1
|
2月前
|
存储 缓存 Java
安卓应用性能优化实战
【5月更文挑战第29天】随着智能手机的普及,移动应用已成为人们日常生活中不可或缺的一部分。在众多操作系统中,安卓系统以其开放性和灵活性占据了大量的市场份额。然而,应用的性能问题却时常影响着用户体验。本文将深入探讨针对安卓平台进行应用性能优化的策略与实践,从内存管理到多线程处理,再到布局渲染,旨在为开发者提供全面的优化指导,以期打造出更流畅、高效的安卓应用。
|
2月前
|
缓存 监控 API
安卓应用性能优化实战
【5月更文挑战第25天】本文将深入探讨如何提升安卓应用的性能。我们将从内存管理,电池使用效率,网络请求以及UI渲染等方面进行深度剖析,并提供相应的优化策略和实践方法。无论你是初学者还是有经验的开发者,都能从中学到一些有用的技巧来提升你的安卓应用性能。
|
2月前
|
Android开发
Android高级开发面试题以及笞案整理,实战解析
Android高级开发面试题以及笞案整理,实战解析
|
2月前
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
|
2月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
2月前
|
编解码 缓存 监控
安卓应用性能优化实战
【5月更文挑战第14天】 在当今移动应用竞争激烈的市场中,一款应用的性能直接影响用户体验和留存率。特别是对于安卓平台,由于设备多样性和应用生态环境的复杂性,性能优化显得尤为重要。本文将深入探讨安卓应用的性能瓶颈,分析影响性能的关键因素,并通过具体的代码实践和工具使用,展示如何有效提升安卓应用的响应速度和流畅度。内容覆盖从UI渲染优化、内存管理到电池使用效率的多个方面,旨在为开发者提供一套实用的性能优化策略。
|
2月前
|
移动开发 API Android开发
Android应用性能优化实战
【4月更文挑战第28天】在移动开发领域,一个流畅的用户体验是至关重要的。对于Android开发者而言,应用的性能优化是一项既挑战性也极其重要的工作。本文将深入探讨Android应用性能优化的多个方面,包括内存管理、UI渲染、多线程处理以及电池效率等,旨在为开发者提供实用的性能提升策略和具体的实施步骤。通过分析常见的性能瓶颈,并结合最新的Android系统特性和工具,我们的目标是帮助读者打造更加高效、响应迅速的Android应用。
|
2月前
|
缓存 监控 Android开发
Android 应用性能优化实战
【4月更文挑战第27天】 在竞争激烈的移动应用市场中,性能优越的应用更能吸引和保留用户。针对Android平台,本文将深入探讨影响应用性能的关键因素,并提供一系列实用的优化策略。我们将从内存管理、UI渲染、多线程处理以及电池使用效率等方面入手,通过具体案例分析如何诊断常见问题,并给出相应的解决方案。文中所提技巧旨在帮助开发者构建更加流畅、高效的Android应用。
35 2
|
2月前
|
缓存 移动开发 Android开发
构建高效Android应用:内存优化实战指南
【4月更文挑战第25天】 在移动开发领域,应用程序的性能至关重要。特别是对于Android设备,由于硬件配置的多样性,合理的内存管理与优化是提升应用流畅度、减少卡顿和崩溃的关键。本文将深入探讨Android应用的内存优化技巧,通过分析内存泄漏的原因、诊断工具的运用以及实际代码层面的改进措施,帮助开发者构建更加高效的Android应用。