当前位置:  编程技术>移动开发
本页文章导读:
    ▪ListView分页(带图片)展示用法案例        ListView分页(带图片)显示用法案例 ListView是Android中最为常用的列表类型控件,ListView中的选择项目中样式很多有的是纯文字的、有的还可以带有图片。它的继承关系如下:java.lang.Object  .........
    ▪ Apk资料Hack试验        Apk文件Hack试验 试验1:反编译dex文件并查看 (1)将Apk文件作为zip文件解压缩得到classes.dex (2)使用dex2jar(http://code.google.com/p/dex2jar/ )工具将dex文件转为jar文件 (3)使用jd-gui(http://java.deco.........
    ▪ 关于equals与==的差异       关于equals与==的区别   关于equals与==的区别 从以下几个方面来说: (1) 如果是基本类型比较,那么只能用==来比较,不能用equals 比如: public class TestEquals { public static void main(String[] args) {.........

[1]ListView分页(带图片)展示用法案例
    来源: 互联网  发布时间: 2014-02-18
ListView分页(带图片)显示用法案例
ListView是Android中最为常用的列表类型控件,ListView中的选择项目中样式很多有的是纯文字的、有的还可以带有图片。它的继承关系如下:
java.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.widget.AdapterView<T extends android.widget.Adapter>
         ↳ android.widget.AbsListView
           ↳ android.widget.ListView
android.widget.ListView继承了android.view.ViewGroup。
首先看一个纯文本的ListView例子,案例运行后会出现一个城市列表如图6-8所示,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。
 


图6-8 ListView
程序代码请参考代码清单6-4:
【代码清单6-4】 chapter6_3/src/com/work/ListView_1_Activity.java
public class ListView_1_Activity extends Activity {
	private ListView listview;
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_activity);
        
        listview = (ListView)findViewById(R.id.ListView01);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mStrings);
        listview.setAdapter(adapter);
		   listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        	@Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1_Activity.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
    		}
    	});
    }

    private String[] mStrings = {
            "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};
}

对于ArrayAdapter应该已经很熟悉了,其中的android.R.layout.simple_list_item_1是使用系统的布局样式。Android系统本身提供了很多的这样的布局文件,但是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是使用时需要注意的。
在这种方式下,需要在布局文件listview_activity.xml中添加ListView控件:
<ListView android:id="@+id/ListView01" android:layout_width="wrap_content"
android:layout_height="wrap_content"></ListView>
由于ListView在Android中是很常用的列表类型控件,只要是有多条信息需要显示的时候都可以考虑使用ListView展示出来,正是由于ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。
通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。同样上面案例如果使用ListActivity请参考代码清单6-5的写法:
【代码清单6-5】 chapter6_3/src/com/work/ListView_1.java
public class ListView_1 extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mStrings));
        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        	@Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
    		}
    	});
    }

    private String[] mStrings = {
            "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};
} 

查看代码不难发现这里没有使用布局文件,那就意味着不需要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代码如下:
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
	}
});}

另外一种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码如下所示。
@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT)
				.show();


再看一个自定义Adapter的例子,这是一个带有图标的ListView,程序运行结果如图6-9所示。
 


图6-9 自定义adapter
相关程序代码请参考代码清单6-6:
【代码清单6-6】 chapter6_3/src/com/work/ListViewIcon_3.java
public class ListViewIcon_3 extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new EfficientAdapter(this));
    }

    private static final String[] DATA = {
    	 "北京市", "天津市", "上海", "重庆", "哈尔滨",
         "石家庄", "秦皇岛", "济南", "青岛", "南京", 
         "三亚", "昆明", "成都", "长沙", "武汉",
         "九江", "香港", "澳门","兰州","张家口" };
… 
}

自定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请参考代码清单6-7:
【代码清单6-7】 chapter6_3/src/com/work/ListViewIcon_3.java
private static class EfficientAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Bitmap mIcon0;
        private Bitmap mIcon1;
…  … 
        public EfficientAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
            mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon);
            mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing);
…   … 
      }

        public int getCount() {
            return DATA.length;
        }

        public Object getItem(int position) {
            return DATA[position];
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.main, null);

                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.textview);
                holder.icon = (ImageView) convertView.findViewById(R.id.icon);

                convertView.setTag(holder);
            } else { 
                holder = (ViewHolder) convertView.getTag();
            }

            holder.text.setText(DATA[position]);
            switch(position)
            {
            case 0:
            	holder.icon.setImageBitmap(mIcon1);
            	break;
            case 1:
            	holder.icon.setImageBitmap(mIcon2);
            	break;
          … 
            default:
            	holder.icon.setImageBitmap(mIcon0);
            	break;
            }
            

            return convertView;
        }

        static class ViewHolder {
            TextView text;
            ImageView icon;
        }
    }

编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法:
• int getCount() 返回总数据源中总的记录数;
• Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据;
• long getItemId(int position) 根据选择的项目的位置;
• View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。
这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。
if (convertView == null) {
				convertView = mInflater.inflate(R.layout.main, null);

				holder = new ViewHolder();
				holder.text = (TextView) convertView
						.findViewById(R.id.textview);
				holder.icon = (ImageView) convertView.findViewById(R.id.icon);

				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
}

只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。
而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。
ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。
                                                       出自《Android开发案例驱动教程》第六章

    
[2] Apk资料Hack试验
    来源: 互联网  发布时间: 2014-02-18
Apk文件Hack试验

试验1:反编译dex文件并查看
(1)将Apk文件作为zip文件解压缩得到classes.dex
(2)使用dex2jar(http://code.google.com/p/dex2jar/ )工具将dex文件转为jar文件
(3)使用jd-gui(http://java.decompiler.free.fr/?q=jdgui )工具查看得到的jar包

试验2: 修改apk文件的图标或者文本
1)使用android-apktool(http://code.google.com/p/android-apktool/ )工具解包apk。
    apktool d apk文件 输出目录
(2)编辑res目录下面有图片文件以及保存有文本的xml文件
(3)编辑smali目录下的代码文件,有些文本可能是直接写到代码中的,比如文件路径。
    smali是一种汇编形式的dex代码,具体参见http://code.google.com/p/smali/
(4)重新打包生成apk
    apktool b apk文件 输入目录
(5)签名并发布
    生成签名库,生成的签名库可以重复使用。
    keytool -genkey -alias asaiAndroid.keystore -keyalg RSA -validity 20000 -keystore asaiAndroid.keystore
    -alias 后面跟的是别名这里是 asaiAndroid.store
    -keyalg 是加密方式这里是RSA
    -validity 是有效期 这里是20000
    -keystore 就是要生成的keystore的名称 这里是asiAndroid.keystore
    然后按回车键
    按回车后首先会提示你输入的密码:这个在签名时要用的,要记住
    然后会再确认你的密码。
    之后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码 (CN)等。
(6)签名
    jarsigner -verbose -keystore asaiAndroid.keystore -signedjar Lotteryonline_signed.apk LotteryOnline.apk    asaiAndroid.keystore
    -keystore: keystore的名称
    LotteryOnline_signed.apk: 签名后的APK
    LotteryOnline.apk: 签名前的APK
    asaiAndroid.keystore要使用的key条目名称,一个keystore中可能有多个key条目。如果忘记了可以用keytool -list -keysotre store的路径 来查看
    如何判断一个apk是否已经签名?
    jarsigner.exe -verify android_assistant.apk


    
[3] 关于equals与==的差异
    来源: 互联网  发布时间: 2014-02-18
关于equals与==的区别

 

关于equals与==的区别 从以下几个方面来说:

(1) 如果是基本类型比较,那么只能用==来比较,不能用equals

比如:
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}

(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。 比如:
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。

(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
(a)首先,介绍String的用法,请看下面的实例:
public class TestEquals {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
String s3 = "abc";
String s4 = new String("123");
String s5 = new String("123");
String s6 = new String("abc");

System.out.println(s1 == s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1 == s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flase

System.out.println(s4 == s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4 == s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flase

System.out.println(s1 == s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}

答案解释:s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只有一个对象,内容为123,有两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的,因而(1)处的运行结 果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是否相等,而我们知道这两个对象的内容都是字符串常量”123”,故 标记(2)处的运行结果是true。
用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3)和(4)处运行结果是false。
再 看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123),但是这两个对象是用new操作符创建处类的,是在内存中分配两块空间给 这两个对象的,因而这两个对象的内存地址不一样,故事两个不同的对象,标记(5)处的s4 == s5 运行结果为false,但是内容一样,故标记(6)处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同,内容也不 相同。故标记(7)(8)处运行结果为false。
s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同,故而对象不相同),故标记为(9)处的s1 == s4运行结果为false。

 

总结:

(1)对字符变量来说:

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同

      (  StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类, 而Object类中的equals方法是用来比较“地址”的;

       String类中定义重新定义了equals这个方法,比较的是“值”不是“地址” 。)

(2)对非字符变量来说:

  "==" 和"equals"方法的作用是相同的 ,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3