首页 文章 精选 留言 我的

精选列表

搜索[宁静视图],共8558篇文章
优秀的个人博客,低调大师

第九弹 - 脚本模式与参数视图

MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外,也致力于提升SQL语言的用户体验和表达能力,提高广大ODPS开发者的生产力。 MaxCompute基于ODPS2.0新一代的SQL引擎,显著提升了SQL语言编译过程的易用性与语言的表达能力。我们在此推出MaxCompute(ODPS2.0)重装上阵系列文章 第一弹 - 善用MaxCompute编译器的错误和警告第二弹 - 新的基本数据类型与内建函数第三弹 - 复杂类型第四弹 - CTE,VALUES,SEMIJOIN第五弹 - SELECT TRANSFORM第六弹 - User Defined Type第七弹 - Grouping Set, Cu

优秀的个人博客,低调大师

[Android]ListView性能优化之视图缓存(续)

正文 一、新浪微博 1.1 截图 1.2 反编译后相关代码 HomeListActivity public ViewgetView( int paramInt,ViewparamView,ViewGroupparamViewGroup) { int i = -- paramInt; int j = - 1 ; if (i == j); for (ObjectlocalObject1 = HomeListActivity. this .getReloadView();;localObject1 = HomeListActivity. this .getLoadMoreView()) { label26: return localObject1; int k = HomeListActivity. this .mList.size(); int l = paramInt; int i1 = k; if (l != i1) break ; } boolean bool1 = true ; boolean bool2 = null ; Stringstr1; label110:ObjectlocalObject2; if (StaticInfo.mUser == null ) { ListlocalList1 = HomeListActivity. this .mList; int i2 = paramInt; str1 = ((MBlog)localList1.get(i2)).uid; ListlocalList2 = HomeListActivity. this .mList; int i3 = paramInt; Stringstr2 = ((MBlog)localList2.get(i3)).uid; Stringstr3 = str1; if ( ! str2.equals(str3)) break label271; int i4 = 1 ; label156: if (paramView != null ) break label277; HomeListActivitylocalHomeListActivity1 = HomeListActivity. this ; ListViewlocalListView1 = HomeListActivity. this .mLvHome; ListlocalList3 = HomeListActivity. this .mList; int i5 = paramInt; MBloglocalMBlog1 = (MBlog)localList3.get(i5); HomeListActivitylocalHomeListActivity2 = HomeListActivity. this ; int i6 = paramInt; boolean bool4 = localHomeListActivity2.isNewCommer(i6); int i7 = HomeListActivity. this .mReadMode; localObject2 = new MBlogListItemView(localHomeListActivity1,localListView1,localMBlog1,bool1,bool2,i4,bool4,i7); } while ( true ) { localObject1 = localObject2; break label26: str1 = StaticInfo.mUser.uid; break label110: label271: boolean bool3 = null ; break label156: label277:localObject2 = paramView; try { MainListItemViewlocalMainListItemView = (MainListItemView)localObject2; ListlocalList4 = HomeListActivity. this .mList; int i8 = paramInt; ObjectlocalObject3 = localList4.get(i8); HomeListActivitylocalHomeListActivity3 = HomeListActivity. this ; int i9 = paramInt; boolean bool5 = localHomeListActivity3.isNewCommer(i9); int i10 = HomeListActivity. this .mReadMode; boolean bool6 = bool1; boolean bool7 = bool2; localMainListItemView.update(localObject3,bool6,bool7,bool5,i10); } catch (ExceptionlocalException) { HomeListActivitylocalHomeListActivity4 = HomeListActivity. this ; ListViewlocalListView2 = HomeListActivity. this .mLvHome; ListlocalList5 = HomeListActivity. this .mList; int i11 = paramInt; MBloglocalMBlog2 = (MBlog)localList5.get(i11); HomeListActivitylocalHomeListActivity5 = HomeListActivity. this ; int i12 = paramInt; boolean bool8 = localHomeListActivity5.isNewCommer(i12); int i13 = HomeListActivity. this .mReadMode; localObject2 = new MBlogListItemView(localHomeListActivity4,localListView2,localMBlog2,bool1,bool2,bool3,bool8,i13); } } } 代码说明: 代码流程已经比较混乱,但是这里能看到并没有直接的inflate,而是自定义了继承自LinearLayout的MBlogListItemView。 MBlogListItemView public MBlogListItemView(ContextparamContext,ListViewparamListView,MBlogparamMBlog, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3, boolean paramBoolean4, int paramInt) { super (paramContext); this .context = paramContext; this .parent = paramListView; this .mBlog = paramMBlog; Stringstr1 = paramContext.getCacheDir().getAbsolutePath(); this .mCacheDir = str1; Stringstr2 = paramContext.getFilesDir().getAbsolutePath(); this .mFileDir = str2; ((LayoutInflater)paramContext.getSystemService( " layout_inflater " )).inflate( 2130903061 , this ); TextViewlocalTextView1 = (TextView)findViewById( 2131624016 ); this .mName = localTextView1; TextViewlocalTextView2 = (TextView)findViewById( 2131624041 ); this .mDate = localTextView2; TextViewlocalTextView3 = (TextView)findViewById( 2131624018 ); this .mContent = localTextView3; TextViewlocalTextView4 = (TextView)findViewById( 2131624046 ); this .mSubContent = localTextView4; ImageViewlocalImageView1 = (ImageView)findViewById( 2131624040 ); this .mIconV = localImageView1; ImageViewlocalImageView2 = (ImageView)findViewById( 2131624042 ); this .mIconPic = localImageView2; ImageViewlocalImageView3 = (ImageView)findViewById( 2131624044 ); this .mUploadPic1 = localImageView3; ImageViewlocalImageView4 = (ImageView)findViewById( 2131623979 ); this .mUploadPic2 = localImageView4; TextViewlocalTextView5 = (TextView)findViewById( 2131624047 ); this .tvForm = localTextView5; TextViewlocalTextView6 = (TextView)findViewById( 2131623989 ); this .tvComment = localTextView6; this .tvComment.setOnClickListener( this ); TextViewlocalTextView7 = (TextView)findViewById( 2131623988 ); this .tvRedirect = localTextView7; this .tvRedirect.setOnClickListener( this ); ImageViewlocalImageView5 = (ImageView)findViewById( 2131624049 ); this .imComment = localImageView5; this .imComment.setOnClickListener( this ); ImageViewlocalImageView6 = (ImageView)findViewById( 2131624048 ); this .imRedirect = localImageView6; this .imRedirect.setOnClickListener( this ); ImageViewlocalImageView7 = (ImageView)findViewById( 2131624043 ); this .imGpsIcon = localImageView7; ImageViewlocalImageView8 = (ImageView)findViewById( 2131624013 ); this .mPortrait = localImageView8; LinearLayoutlocalLinearLayout = (LinearLayout)findViewById( 2131624045 ); this .mSubLayout = localLinearLayout; this .mReadMode = paramInt; MBlogListItemViewlocalMBlogListItemView = this ; MBloglocalMBlog = paramMBlog; boolean bool1 = paramBoolean1; boolean bool2 = paramBoolean2; boolean bool3 = paramBoolean4; int i = paramInt; localMBlogListItemView.update(localMBlog,bool1,bool2,bool3,i); this .mUploadPic1.setOnClickListener( this ); this .mUploadPic2.setOnClickListener( this ); } 代码说明: a). MBlogListItemViewextendsLinearLayoutimplementsMainListItemView b). inflate( 2130903061,this)这个数字代表R.layout.itemview。 二、测试方案(方案五) 按照新浪微博类似的做法进行测试。 2.1 测试代码 @Override public ViewgetView( int position,ViewconvertView,ViewGroupparent){ // 开始计时 long startTime = System.nanoTime(); TestItemLayoutitem; if (convertView == null ){ item = new TestItemLayout(BaseAdapterActivity. this ); } else item = (TestItemLayout)convertView; item.icon1.setImageResource(R.drawable.icon); item.text1.setText(mData[position]); item.icon2.setImageResource(R.drawable.icon); item.text2.setText(mData[position]); // 停止计时 long endTime = System.nanoTime(); // 计算耗时 long val = (endTime - startTime) / 1000L ; Log.e( " Test " , " Position: " + position + " : " + val); if (count < 100 ){ if (val < 2000L ){ sum += val; count ++ ; } } else mTV.setText(String.valueOf(sum / 100L ) + " : " + nullcount); // 显示统计结果 return item; } TestItemLayout public class TestItemLayout extends LinearLayout{ public TextViewtext1; public ImageViewicon1; public TextViewtext2; public ImageViewicon2; public TestItemLayout(Contextcontext){ super (context); ((LayoutInflater)context .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate( R.layout.list_item_icon_text, this ); icon1 = (ImageView)findViewById(R.id.icon1); text1 = (TextView)findViewById(R.id.text1); icon2 = (ImageView)findViewById(R.id.icon2); text2 = (TextView)findViewById(R.id.text2); } } 2.2 测试结果 次数 4个子元素 10个子元素 第一次 347 460 第二次 310 477 第三次 324 508 第四次 339 492 第五次 341 465 三、总结 从测试结果来看与ViewHolder性能非常接近,不会出现tag图片变小的问题(关于图片变小的问题,有朋友说是TAG中的元素对大小和位置有记忆),也能有效的减少findViewById的执行次数,这里建议完全可以取代ViewHolder。 关于ListView内部Adapter的心得大家可以看一下上文的总结4.1。 四、考虑 关于静态内部类这里不是很理解,是否能应用方案五还有待验证。 五、后期维护 2011-4-29 来自Stony Wang关于Tag的解释: Stony Wang tag的用途应该是仿照delphi的来的,设置一个关联的数据。 简单的说就是,你的UI控件有时候显示的内容带源于(绑定?)某个数据或者对象实例。 当你处理一些事件的时候,不推荐从UI上来重新获取,而是从Tag里面取出来。 举一个例子是,有一个按钮,一开始显示"0",然后每按一次计数增1。 每次click的时候, 1 从btn.getText()再转回Integer 2 从tag里面把之前设好的Integer拿出来,加一,再settag? 如果觉得1和2区别不大的话,那么如果显示的内容不是"0",而是"已经点了0次"呢? 更新UI的时候,可以将关联的对象放到tag里面,在处理相关触发事件的时候,可以方便的获取原始的数据。 ListView的Tag用法也不算很错,而是用的时候没有注意设置的时候要注意“对称”。 Tag本身可以理解成放ViewHolder,那么和ViewHolder的加速只不过是存放的位置不同,加速效果基本一致。 “对称”我所指的内容是: 不管你要显示的数据的逻辑是如何的,如果你设置了某个View的宽度,那么在任何一种数据的填充UI逻辑里面,不可以有不设置这个View宽度的代码路径。 简单的例子就是,我根据某个布尔值,如果是false的话,将ImageView设置为View.INVISIBLE if ( item.isHidden()){ mImage.setVisibility(View.INVISIBLE); } 这样是错误的,因为如果这里缓存的UI控件的状态会被复用到其它item上,而这个item恰巧可能是需要显示的。 必须补上else语句 else{ mImage.setVisibility(View.VISIBLE); } 这个估计就是那位仁兄拖动图片变小的原因了。 最后说一下,ListView控件条目部分,一共产生的条目是屏幕能容纳的数目+2(还是+1?我记不清楚了),然后循环使用。 结束 优化ListView不仅仅只有对convertView的优化,还有许多这样那样的技巧,欢迎大家交流与分享 :) 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582135,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS:UIMapView地图视图控件的简单使用

可以通过设置MKMapView的mapViewType设置地图类型 MKMapTypeStandard普通地图 MKMapTypeSatellite卫星云图 MKMapTypeHybrid普通地图覆盖于卫星云图之上 @property (nonatomic) MKMapType mapType; //地图类型 @property (nonatomic) MKCoordinateRegion region; //位置区域 @property (nonatomic) CLLocationCoordinate2D centerCoordinate;//位置经纬度 //位置区域范围(0~1) typedef struct { CLLocationDegrees latitudeDelta; CLLocationDegrees longitudeDelta; } MKCoordinateSpan; //位置经纬度 typedef struct { CLLocationDegrees latitude; CLLocationDegrees longitude; } CLLocationCoordinate2D; //位置区域 typedef struct { CLLocationCoordinate2D center; MKCoordinateSpan span; } MKCoordinateRegion; //在地图上设置显示区域 - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated; - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated; MapView会将一些事件传递给它的代理(遵守MKMapViewDelegate协议),代理方法如下: mapViewWillStartLoadingMap:当地图界面将要加载时调用 mapView:viewForAnnotation:当地图上有一些动画效果展示\加载时调用 mapViewWillStartLocatingUser:当准备进行一个位置定位时调用 mapView:regionDidChangeAnimated:当显示的区域发生变化时调用 mapView:didUpdateUserLocation:当用户位置发生变化时调用 具体实例如下: 1、导入CoreLocation/Mapkit框架 2、拖入一个UIMapView控件到控制器中 3、在ViewController.m文件中导入必要的库文件 4、将MapView关联为IBOutLet属性,同时让ViewController类实现地图协议 5、代码实现功能 //显示地图 - (void)viewDidLoad { [super viewDidLoad]; //设置地图的属性 self.mapView.mapType = MKMapTypeHybrid; //设置区域的经纬度坐标 CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40, 116);//(经度、纬度) //设置经纬度范围(越小越精确) MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1); //设置地图显示的区域 self.mapView.region = MKCoordinateRegionMake(coordinate, span); //设置地图的代理 self.mapView.delegate = self; } //实现地图协议 #pragma mark -mapView的方法 #pragma mark -地图开始加载 -(void)mapViewWillStartLoadingMap:(MKMapView *)mapView { NSLog(@"开始加载地图"); } #pragma mark -地图加载完毕 -(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { NSLog(@"地图加载完毕"); } #pragma mark -地图区域将要改变 -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { MKCoordinateRegion region = mapView.region; NSLog(@"经度:%f,纬度:%f",region.center.latitude,region.center.longitude); } #pragma mark -地图区域已经改变 -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { MKCoordinateRegion region = mapView.region; NSLog(@"经度:%f,纬度:%f",region.center.latitude,region.center.longitude); } 演示结果截图: 加载调用了代理方法,输出为: 2015-10-19 21:50:19.241 05-mapkit-MapView[7278:360386] 开始加载地图 2015-10-19 21:50:19.261 05-mapkit-MapView[7278:360386] 地图加载完毕 地图显示: 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 分类: iOS高级 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4893237.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

android用户界面-组件Widget-网络视图WebView

一个WebView的简单例子 。 在开发过程中应该注意几点: 1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。 webview.getSettings().setJavaScriptEnabled(true); 3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。 mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); 4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。 public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } 下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。 看一个实例: view plaincopy to clipboardprint? public class WebViewDemo extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.webviewdemo); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); } } public class WebViewDemo extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.webviewdemo); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); } } 我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。 <html> <mce:script language="javascript"><!-- function wave() { document.getElementById("droid").src="android_waving.png"; } // --></mce:script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a> </body> </html> <html> <mce:script language="javascript"><!-- function wave() { document.getElementById("droid").src="android_waving.png"; } // --></mce:script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a> </body> </html> 这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。 这里还有几个知识点: 1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html" 2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。 总结: 1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);3、设置WebView基本信息:如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true);触摸焦点起作用requestFocus();取消滚动条this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);4、设置WevView要显示的网页:互联网用:webView.loadUrl("http://www.google.com");本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets文件中5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的urlonLoadResourceonPageStartonPageFinishonReceiveErroronReceivedHttpAuthRequest6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。 public boolean onKeyDown(int keyCoder,KeyEvent event){ if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){ webview.goBack(); //goBack()表示返回webView的上一页面 return true; } return false; } 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080680

优秀的个人博客,低调大师

android用户界面-组件Widget-列表视图ListView

ListView是比较常用的控件 程序效果是实现一个ListView,ListView里面有标题,内容和图片,并加入点击和长按响应。 列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View。 2.适配器 用来把数据映射到ListView上的中介。 3.数据 具体的将被映射的字符串,图片,或者基本组件。 根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter SimpleAdapter的例子如下: 首先在xml里面定义一个ListView 1.<?xmlversion="1.0"encoding="utf-8"?> 2.<LinearLayout 3.android:id="@+id/LinearLayout01" 4.android:layout_width="fill_parent" 5.android:layout_height="fill_parent" 6.xmlns:android="http://schemas.android.com/apk/res/android"> 7.<ListViewandroid:layout_width="wrap_content" 8.android:layout_height="wrap_content" 9.android:id="@+id/ListView01" 10./> 11.</LinearLayout> <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ListView01" /> </LinearLayout> 定义ListView每个条目的Layout,用RelativeLayout实现: 1.<?xmlversion="1.0"encoding="utf-8"?> 2.<RelativeLayout 3.android:id="@+id/RelativeLayout01" 4.android:layout_width="fill_parent" 5.xmlns:android="http://schemas.android.com/apk/res/android" 6.android:layout_height="wrap_content" 7.android:paddingBottom="4dip" 8.android:paddingLeft="12dip" 9.android:paddingRight="12dip"> 10.<ImageView 11.android:paddingTop="12dip" 12.android:layout_alignParentRight="true" 13.android:layout_width="wrap_content" 14.android:layout_height="wrap_content" 15.android:id="@+id/ItemImage" 16./> 17.<TextView 18.android:text="TextView01" 19.android:layout_height="wrap_content" 20.android:textSize="20dip" 21.android:layout_width="fill_parent" 22.android:id="@+id/ItemTitle" 23./> 24.<TextView 25.android:text="TextView02" 26.android:layout_height="wrap_content" 27.android:layout_width="fill_parent" 28.android:layout_below="@+id/ItemTitle" 29.android:id="@+id/ItemText" 30./> 31.</RelativeLayout> <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="4dip" android:paddingLeft="12dip" android:paddingRight="12dip"> <ImageView android:paddingTop="12dip" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ItemImage" /> <TextView android:text="TextView01" android:layout_height="wrap_content" android:textSize="20dip" android:layout_width="fill_parent" android:id="@+id/ItemTitle" /> <TextView android:text="TextView02" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_below="@+id/ItemTitle" android:id="@+id/ItemText" /> </RelativeLayout> 最后在Activity里面调用和加入Listener,具体见注释: 1.packagecom.ray.test; 2. 3.importjava.util.ArrayList; 4.importjava.util.HashMap; 5. 6.importandroid.app.Activity; 7.importandroid.os.Bundle; 8.importandroid.view.ContextMenu; 9.importandroid.view.MenuItem; 10.importandroid.view.View; 11.importandroid.view.ContextMenu.ContextMenuInfo; 12.importandroid.view.View.OnCreateContextMenuListener; 13.importandroid.widget.AdapterView; 14.importandroid.widget.ListView; 15.importandroid.widget.SimpleAdapter; 16.importandroid.widget.AdapterView.OnItemClickListener; 17. 18.publicclassTestListViewextendsActivity{ 19.@Override 20.publicvoidonCreate(BundlesavedInstanceState){ 21.super.onCreate(savedInstanceState); 22.setContentView(R.layout.main); 23.//绑定Layout里面的ListView 24.ListViewlist=(ListView)findViewById(R.id.ListView01); 25. 26.//生成动态数组,加入数据 27.ArrayList<HashMap<String,Object>>listItem=newArrayList<HashMap<String,Object>>(); 28.for(inti=0;i<10;i++) 29.{ 30.HashMap<String,Object>map=newHashMap<String,Object>(); 31.map.put("ItemImage",R.drawable.checked);//图像资源的ID 32.map.put("ItemTitle","Level"+i); 33.map.put("ItemText","Finishedin1Min54Secs,70Moves!"); 34.listItem.add(map); 35.} 36.//生成适配器的Item和动态数组对应的元素 37.SimpleAdapterlistItemAdapter=newSimpleAdapter(this,listItem,//数据源 38.R.layout.list_items,//ListItem的XML实现 39.//动态数组与ImageItem对应的子项 40.newString[]{"ItemImage","ItemTitle","ItemText"}, 41.//ImageItem的XML文件里面的一个ImageView,两个TextViewID 42.newint[]{R.id.ItemImage,R.id.ItemTitle,R.id.ItemText} 43.); 44. 45.//添加并且显示 46.list.setAdapter(listItemAdapter); 47. 48.//添加点击 49.list.setOnItemClickListener(newOnItemClickListener(){ 50. 51.@Override 52.publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2, 53.longarg3){ 54.setTitle("点击第"+arg2+"个项目"); 55.} 56.}); 57. 58.//添加长按点击 59.list.setOnCreateContextMenuListener(newOnCreateContextMenuListener(){ 60. 61.@Override 62.publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo){ 63.menu.setHeaderTitle("长按菜单-ContextMenu"); 64.menu.add(0,0,0,"弹出长按菜单0"); 65.menu.add(0,1,0,"弹出长按菜单1"); 66.} 67.}); 68.} 69. 70.//长按菜单响应函数 71.@Override 72.publicbooleanonContextItemSelected(MenuItemitem){ 73.setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目"); 74.returnsuper.onContextItemSelected(item); 75.} 76.} 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080693

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册