Android商城开发系列(十二)—— 首页推荐布局实现

  首页新品推荐的布局效果如下图:

  

  这块布局是使用LinearLayout和GridView去实现,新建recommend_item.xml,代码如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:orientation="vertical"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:background="#fff">
 8
 9     <LinearLayout
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:gravity="center_vertical"
13         android:padding="10dp">
14
15         <ImageView
16             android:layout_width="wrap_content"
17             android:layout_height="wrap_content"
18             android:src="@mipmap/home_arrow_left_new" />
19
20         <TextView
21             android:layout_width="wrap_content"
22             android:layout_height="wrap_content"
23             android:layout_marginLeft="10dp"
24             android:text="新品推荐"
25             android:textColor="#000" />
26
27         <TextView
28             android:id="@+id/tv_more_recommend"
29             android:layout_width="wrap_content"
30             android:layout_height="wrap_content"
31             android:layout_weight="1"
32             android:drawablePadding="5dp"
33             android:drawableRight="@mipmap/home_arrow_right"
34             android:gravity="end"
35             android:text="查看更多" />
36     </LinearLayout>
37
38     <GridView
39         android:id="@+id/gv_recommend"
40         android:layout_width="match_parent"
41         android:layout_height="380dp"
42         android:numColumns="3"/>
43
44 </LinearLayout>

  继续在HomeFragmentAdapter类中去添加推荐的ViewHolder,在onCreateViewHolder()方法中创建RecommendViewHolder,代码如下所示:

  1 package com.nyl.shoppingmall.home.adapter;
  2
  3 import android.content.Context;
  4 import android.os.Handler;
  5 import android.os.Message;
  6 import android.support.v4.view.PagerAdapter;
  7 import android.support.v4.view.ViewPager;
  8 import android.support.v7.widget.LinearLayoutManager;
  9 import android.support.v7.widget.RecyclerView;
 10 import android.view.LayoutInflater;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.widget.AdapterView;
 14 import android.widget.GridView;
 15 import android.widget.ImageView;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18
 19 import com.bumptech.glide.Glide;
 20 import com.nyl.shoppingmall.R;
 21 import com.nyl.shoppingmall.home.bean.ResultBeanData;
 22 import com.nyl.shoppingmall.utils.Constants;
 23 import com.youth.banner.Banner;
 24 import com.youth.banner.BannerConfig;
 25 import com.youth.banner.Transformer;
 26 import com.youth.banner.listener.OnBannerClickListener;
 27 import com.youth.banner.listener.OnLoadImageListener;
 28 import com.zhy.magicviewpager.transformer.ScaleInTransformer;
 29
 30 import java.text.SimpleDateFormat;
 31 import java.util.ArrayList;
 32 import java.util.Date;
 33 import java.util.List;
 34
 35 /**
 36  * 首页适配器
 37  */
 38
 39 public class HomeFragmentAdapter extends RecyclerView.Adapter{
 40
 41     /**
 42      * 广告幅类型
 43      */
 44     public static final int BANNER = 0;
 45
 46     /**
 47      * 频道类型
 48      */
 49     public static final int CHANNEL = 1;
 50
 51     /**
 52      * 活动类型
 53      */
 54     public static final int ACT = 2;
 55
 56     /**
 57      * 秒杀类型
 58      */
 59     public static final int SECKILL = 3;
 60
 61     /**
 62      * 推荐类型
 63      */
 64     public static final int RECOMMEND = 4;
 65
 66     /**
 67      * 热卖类型
 68      */
 69     public static final int HOT = 5;
 70
 71     /**
 72      * 初始化布局
 73      */
 74     private LayoutInflater mLayoutInflater;
 75
 76     /**
 77      * 数据
 78      */
 79     private ResultBeanData.ResultBean resultBean;
 80     private Context mContext;
 81
 82     /**
 83      * 当前类型
 84      */
 85     private int currenType = BANNER;
 86
 87     public HomeFragmentAdapter(Context mContext, ResultBeanData.ResultBean resultBean) {
 88         this.mContext = mContext;
 89         this.resultBean = resultBean;
 90         mLayoutInflater = LayoutInflater.from(mContext);
 91     }
 92
 93     /**
 94      * 相当于getView创建ViewHolder部分代码
 95      * @param parent
 96      * @param viewType 当前的类型
 97      * @return
 98      */
 99     @Override
100     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
101         //广告福
102         if (viewType == BANNER){
103             //创建BannerViewHolder,Banner里面传布局文件
104             return new BannerViewHolder(mContext,mLayoutInflater.inflate(R.layout.banner_viewpager,null));
105             //频道
106         }else if (viewType == CHANNEL){
107             return new ChannelViewHolder(mContext,mLayoutInflater.inflate(R.layout.channel_item,null));
108             //活动
109         }else if (viewType == ACT){
110             return new ActViewHolder(mContext,mLayoutInflater.inflate(R.layout.act_item,null));
111             //秒杀
112         }else if (viewType == SECKILL){
113             return new SeckillViewHolder(mContext,mLayoutInflater.inflate(R.layout.seckkill_item,null));
114             //推荐
115         }else if (viewType == RECOMMEND){
116             return new RecommendViewHolder(mContext,mLayoutInflater.inflate(R.layout.recommend_item,null));
117         }
118         return null;
119     }
120
121     /**
122      * 相当于getView中绑定数据模块
123      * @param holder
124      * @param position
125      */
126     @Override
127     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
128         //轮循广告
129         if (getItemViewType(position) == BANNER){
130             BannerViewHolder bannerViewHolder = (BannerViewHolder) holder;
131             bannerViewHolder.setData(resultBean.getBanner_info());
132             /**
133              * 频道
134              */
135         }else if (getItemViewType(position) == CHANNEL){
136             ChannelViewHolder channelViewHolder = (ChannelViewHolder) holder;
137             channelViewHolder.setData(resultBean.getChannel_info());
138             /**
139              * 活动
140              */
141         }else if (getItemViewType(position) == ACT){
142             ActViewHolder actViewHolder = (ActViewHolder) holder;
143             actViewHolder.setData(resultBean.getAct_info());
144             /**
145              * 秒杀
146              */
147         }else if (getItemViewType(position) == SECKILL){
148             SeckillViewHolder seckillViewHolder = (SeckillViewHolder) holder;
149             seckillViewHolder.setData(resultBean.getSeckill_info());
150             /**
151              * 推荐
152              */
153         }else if (getItemViewType(position) == RECOMMEND){
154             RecommendViewHolder recommendViewHolder = (RecommendViewHolder) holder;
155             recommendViewHolder.setData(resultBean.getRecommend_info());
156         }
157     }
158
159     /**
160      * 广告幅
161      */
162     class BannerViewHolder extends RecyclerView.ViewHolder{
163
164         private Context mContext;
165         private Banner banner;
166
167         public BannerViewHolder(Context mContext, View itemView) {
168             super(itemView);
169             this.mContext = mContext;
170             this.banner = (Banner) itemView.findViewById(R.id.banner);
171         }
172
173         public void setData(List<ResultBeanData.ResultBean.BannerInfoEntity> banner_info) {
174             //得到图片集合地址
175             List<String> imagesUrl = new ArrayList<>();
176             for (int i = 0;i<banner_info.size();i++){
177                 String imageUrl = banner_info.get(i).getImage();
178                 imagesUrl.add(imageUrl);
179             }
180             //设置循环指示点
181             banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);
182             //设置手风琴效果
183             banner.setBannerAnimation(Transformer.Accordion);
184             //设置Banner图片数据
185             banner.setImages(imagesUrl, new OnLoadImageListener() {
186                 @Override
187                 public void OnLoadImage(ImageView view, Object url) {
188                     //联网请求图片-Glide
189                     Glide.with(mContext).load(Constants.BASE_URL_IMAGE + url).into(view);
190                 }
191             });
192             //设置点击事件
193             banner.setOnBannerClickListener(new OnBannerClickListener() {
194                 @Override
195                 public void OnBannerClick(int position) {
196                     Toast.makeText(mContext,"position=="+position,Toast.LENGTH_SHORT).show();
197                 }
198             });
199         }
200     }
201
202     /**
203      * 频道
204      */
205     class ChannelViewHolder extends RecyclerView.ViewHolder{
206
207         private Context mContext;
208         private GridView gv_channel;
209         private ChannelAdapter adapter;
210
211         public ChannelViewHolder(Context mContext, View itemView) {
212             super(itemView);
213             this.mContext = mContext;
214             gv_channel = (GridView) itemView.findViewById(R.id.gv_channel);
215         }
216
217         public void setData(List<ResultBeanData.ResultBean.ChannelInfoBean> channel_info) {
218             //得到数据后,就设置GridView的适配器
219             adapter = new ChannelAdapter(mContext,channel_info);
220             gv_channel.setAdapter(adapter);
221
222             //设置item的点击事件
223             gv_channel.setOnItemClickListener(new AdapterView.OnItemClickListener() {
224                 @Override
225                 public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
226                     Toast.makeText(mContext,"position"+position,Toast.LENGTH_SHORT).show();
227                 }
228             });
229         }
230     }
231
232     /**
233      * 活动
234      */
235     class ActViewHolder extends RecyclerView.ViewHolder{
236
237         private Context mContext;
238         private ViewPager act_viewpager;
239
240         public ActViewHolder(Context mContext,View itemView) {
241             super(itemView);
242             this.mContext = mContext;
243             act_viewpager = (ViewPager) itemView.findViewById(R.id.act_viewpager);
244         }
245
246         public void setData(final List<ResultBeanData.ResultBean.ActInfoEntity> act_info) {
247             //设置间距
248             act_viewpager.setPageMargin(20);
249             act_viewpager.setOffscreenPageLimit(3);//>=3
250             //setPageTransformer 决定动画效果
251             act_viewpager.setPageTransformer(true, new ScaleInTransformer());
252             //有数据后,就设置数据适配器
253             act_viewpager.setAdapter(new PagerAdapter() {
254                 @Override
255                 public int getCount() {
256                     return act_info.size();
257                 }
258
259                 /**
260                  *
261                  * @param view 页面
262                  * @param object instantiateItem方法返回的值
263                  * @return
264                  */
265                 @Override
266                 public boolean isViewFromObject(View view, Object object) {
267                     return view == object;
268                 }
269
270                 /**
271                  *
272                  * @param container ViewPager
273                  * @param position 对应页面的位置
274                  * @return
275                  */
276                 @Override
277                 public Object instantiateItem(ViewGroup container, final int position) {
278                     //实例化ImageView
279                     ImageView imageView = new ImageView(mContext);
280                     //设置ImageView的拉伸
281                     imageView.setScaleType(ImageView.ScaleType.FIT_XY);
282                     //根据Glide设置图片
283                     Glide.with(mContext).load(Constants.BASE_URL_IMAGE+act_info.get(position).getIcon_url()).into(imageView);
284                     //添加到容器中
285                     container.addView(imageView);
286
287                     //设置点击事件
288                     imageView.setOnClickListener(new View.OnClickListener() {
289                         @Override
290                         public void onClick(View view) {
291                             Toast.makeText(mContext,"position=="+position,Toast.LENGTH_SHORT).show();
292                         }
293                     });
294                     return imageView;
295                 }
296
297                 @Override
298                 public void destroyItem(ViewGroup container, int position, Object object) {
299                     container.removeView((View) object);
300                 }
301             });
302         }
303     }
304
305     /**
306      * 秒杀
307      */
308     class SeckillViewHolder extends RecyclerView.ViewHolder{
309
310         private Context mContext;
311         private TextView tv_time_seckill;
312         private TextView tv_more_seckill;
313         private RecyclerView rv_seckill;
314         private SeckillRecycleViewAdapter adapter;
315
316         /**
317          * 相差多少时间-毫秒
318          */
319         private long dt = 0;
320         //不断循环
321         private Handler handler = new Handler(){
322             @Override
323             public void handleMessage(Message msg) {
324                 super.handleMessage(msg);
325                 dt = dt - 1000;
326                 //设置具体的时间
327                 SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
328                 String time = dateFormat.format(new Date(dt));
329                 tv_time_seckill.setText(time);
330
331                 handler.removeMessages(0);
332                 //发送消息,不断减时间
333                 handler.sendEmptyMessageDelayed(0,1000);
334                 if (dt <= 0){
335                     //把消息移除
336                     handler.removeCallbacksAndMessages(null);
337                 }
338             }
339         };
340
341         public SeckillViewHolder(Context mContext, View itemView) {
342             super(itemView);
343             this.mContext = mContext;
344             //初始化布局控件
345             tv_time_seckill = (TextView) itemView.findViewById(R.id.tv_time_seckill);
346             tv_more_seckill = (TextView) itemView.findViewById(R.id.tv_more_seckill);
347             rv_seckill = (RecyclerView) itemView.findViewById(R.id.rv_seckill);
348         }
349
350         public void setData(ResultBeanData.ResultBean.SeckillInfoEntity seckill_info) {
351             //得到数据后,就是设置数据(TextView和RecyclerView)的数据
352             adapter = new SeckillRecycleViewAdapter(mContext,seckill_info.getList());
353             rv_seckill.setAdapter(adapter);
354
355             //设置布局管理器
356             rv_seckill.setLayoutManager(new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false));
357             //设置item的点击事件
358             adapter.setOnSeckillRecyclerView(new SeckillRecycleViewAdapter.OnSeckillRecyclerView() {
359                 @Override
360                 public void onItemClick(int position) {
361                     Toast.makeText(mContext,"秒杀"+position,Toast.LENGTH_SHORT).show();
362                 }
363             });
364             //秒杀倒计时-毫秒
365             dt = Integer.valueOf(seckill_info.getEnd_time()) - Integer.valueOf(seckill_info.getStart_time());
366             //进入后1秒钟就去发送这个消息
367             handler.sendEmptyMessageDelayed(0,1000);
368
369         }
370     }
371
372     /**
373      * 推荐
374      */
375     class RecommendViewHolder extends RecyclerView.ViewHolder{
376
377         private final Context mContext;
378         private TextView tv_more_recommend;
379         private GridView gv_recommend;
380         private RecommendGridViewAdapter adapter;
381
382         public RecommendViewHolder(final Context mContext, View itemView) {
383             super(itemView);
384             this.mContext = mContext;
385             tv_more_recommend = (TextView) itemView.findViewById(R.id.tv_more_recommend);
386             gv_recommend = (GridView) itemView.findViewById(R.id.gv_recommend);
387
388             //设置点击事件
389             gv_recommend.setOnItemClickListener(new AdapterView.OnItemClickListener() {
390                 @Override
391                 public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
392                     Toast.makeText(mContext,"position=="+position,Toast.LENGTH_SHORT).show();
393                 }
394             });
395         }
396
397         public void setData(List<ResultBeanData.ResultBean.RecommendInfoBean> recommend_info) {
398             //有数据了之后,就设置适配器
399             adapter = new RecommendGridViewAdapter(mContext,recommend_info);
400             gv_recommend.setAdapter(adapter);
401
402         }
403     }
404
405     /**
406      * 得到不同的类型
407      * @param position
408      * @return
409      */
410     @Override
411     public int getItemViewType(int position) {
412         switch (position){
413             case BANNER: //广告幅
414                 currenType = BANNER;
415                 break;
416             case CHANNEL: //频道
417                 currenType = CHANNEL;
418                 break;
419             case ACT: //活动
420                 currenType = ACT;
421                 break;
422             case SECKILL: //秒杀
423                 currenType = SECKILL;
424                 break;
425             case RECOMMEND: //推荐
426                 currenType = RECOMMEND;
427                 break;
428             case HOT: //热卖
429                 currenType = HOT;
430                 break;
431         }
432         return currenType;
433     }
434
435     /**
436      * 总共有多少个item
437      * @return
438      */
439     @Override
440     public int getItemCount() {
441         return 5;
442     }
443 }

  有数据了之后,下一步要做的就是使用适配器将数据展示出来,先设计gridView的item的布局,新建item_recommend_grid_view.xml,代码如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:gravity="center_horizontal"
 6     android:orientation="vertical"
 7     android:padding="10dp">
 8
 9     <ImageView
10         android:id="@+id/iv_recommend"
11         android:layout_width="100dp"
12         android:layout_height="100dp"
13         android:background="@mipmap/new_img_loading_2" />
14
15     <TextView
16         android:id="@+id/tv_name"
17         android:layout_width="100dp"
18         android:layout_height="wrap_content"
19         android:layout_marginTop="10dp"
20         android:ellipsize="end"
21         android:lines="2"
22         android:text="全款预售【喵鹿酱】樱桃蜜语 毛呢绣花 小高腰半裙"
23         android:textColor="#000" />
24
25     <TextView
26         android:id="@+id/tv_price"
27         android:layout_width="wrap_content"
28         android:layout_height="wrap_content"
29         android:text="¥88.00"
30         android:textColor="#ff4242" />
31 </LinearLayout>

  新建RecommendGridViewAdapter类,代码如下:

 1 package com.nyl.shoppingmall.home.adapter;
 2
 3 import android.content.Context;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6 import android.widget.BaseAdapter;
 7 import android.widget.ImageView;
 8 import android.widget.TextView;
 9
10 import com.bumptech.glide.Glide;
11 import com.nyl.shoppingmall.R;
12 import com.nyl.shoppingmall.home.bean.ResultBeanData;
13 import com.nyl.shoppingmall.utils.Constants;
14
15 import java.util.List;
16
17 /**
18  * 推荐GridView的适配器
19  */
20
21 public class RecommendGridViewAdapter extends BaseAdapter{
22
23     private final Context mContext;
24     private final List<ResultBeanData.ResultBean.RecommendInfoBean> datas;
25
26     public RecommendGridViewAdapter(Context mContext, List<ResultBeanData.ResultBean.RecommendInfoBean> recommend_info) {
27         this.mContext = mContext;
28         this.datas = recommend_info;
29     }
30
31     @Override
32     public int getCount() {
33         return datas.size();
34     }
35
36     @Override
37     public Object getItem(int i) {
38         return null;
39     }
40
41     @Override
42     public long getItemId(int i) {
43         return 0;
44     }
45
46     @Override
47     public View getView(int position, View view, ViewGroup viewGroup) {
48         ViewHolder viewHolder;
49         if (view == null){
50             view = View.inflate(mContext, R.layout.item_recommend_grid_view,null);
51             viewHolder = new ViewHolder();
52             viewHolder.iv_recommend = (ImageView) view.findViewById(R.id.iv_recommend);
53             viewHolder.tv_name = (TextView) view.findViewById(R.id.tv_name);
54             viewHolder.tv_price = (TextView) view.findViewById(R.id.tv_price);
55             view.setTag(viewHolder);
56         }else {
57             viewHolder = (ViewHolder) view.getTag();
58         }
59         //根据位置得到对应的数据
60         ResultBeanData.ResultBean.RecommendInfoBean recommendInfoBean = datas.get(position);
61         //设置网络图片
62         Glide.with(mContext).load(Constants.BASE_URL_IMAGE+recommendInfoBean.getFigure()).into(viewHolder.iv_recommend);
63         viewHolder.tv_name.setText(recommendInfoBean.getName());
64         viewHolder.tv_price.setText("¥"+recommendInfoBean.getCover_price());
65         return view;
66     }
67     static class ViewHolder{
68         ImageView iv_recommend;
69         TextView tv_name;
70         TextView tv_price;
71     }
72 }

   关于首页推荐布局的内容就那么多!

时间: 2024-10-13 16:17:48

Android商城开发系列(十二)—— 首页推荐布局实现的相关文章

Android商城开发系列(七)—— 使用RecyclerView展示首页数据

前面我们讲到了使用OkHttp请求网络和FastJson解析数据了,接下来我们就开始把获取到的数据通过数据适配器展示在页面上了.Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,提供给用户看! 商城首页的数据是使用RecyclerView进行展示的,下面我们来讲讲如何将获取到的数据通过RecyclerView展示. 首先看一下HomeFragment的布局代码,代码如下: 1 <?xml version="1.0" encoding

Android商城开发系列(十三)—— 首页热卖商品布局实现

热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:ori

Android商城开发系列(十)—— 活动广告布局实现

在上一篇博客当中,我们讲了频道布局的实现,接下来我们讲解一下活动广告布局的实现,效果如下图: 这个是用viewpager去实现的,新建一个act_item.xml,代码如下所示: 1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android

BizTalk开发系列(十二) Schema设计之Group与Order

开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽然BizTalk提供了对于XML消息的验证功能.但是往往在BizTalk Schema设计器设计Schema的时候对于Group的用途不是很在意.今天我们来了解一下它的作用,希望对于设计灵活的Schema有点帮助. 首先,我们来了解一下Group的概念,在W3C的定义中. Group是用于定义在复杂

Android 快速开发系列 打造万能的ListView GridView 适配器

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder模式,其实大部分的代码基本都是类似的

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微

Android 自定义控件开发入门(二)

上一次我们讲了一堆实现自定义控件的理论基础,列举了View类一些可以重写的方法,我们对这些方法的重写是我们继承View类来派生自定义控件的关键 我通过一个最简单的例子给大家展示了这一个过程,无论是多么复杂的自定义控件,思路总是这样子的,但是因为我们仅仅重写了onDraw方法使得大家觉得怪怪的,作为一个控件,我们居然还要为了他的实现为其增加麻烦的监听,这就不能叫做控件了. 下面再给大家介绍一个经常重写的方法法:publicboolean onTouchEvent (MotionEvent even

SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识.