当前位置:  编程技术>移动开发
本页文章导读:
    ▪利用Java兑现压缩与解压缩(zip、gzip)支持中文路径        利用Java实现压缩与解压缩(zip、gzip)支持中文路径 zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案.........
    ▪ StatusBar上拉Notification宽度满屏解决办法        StatusBar下拉Notification宽度满屏解决方法 我的是800x600的屏,在Android 的Notifications没有达到满屏幕宽度 原以为就是xml布局文件的问题,直接找到确定其布局的文件status_bar_expanded.xml,发现并无.........
    ▪ listView 多值展示       listView 多值显示 <ListView android:id="@+id/SCHEDULE" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ListView> <?xml version="1.0" encoding="utf-8"?> <!-- row.xml --> <LinearLayout xm.........

[1]利用Java兑现压缩与解压缩(zip、gzip)支持中文路径
    来源: 互联网  发布时间: 2014-02-18
利用Java实现压缩与解压缩(zip、gzip)支持中文路径
zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。

Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。

相关类与接口:
Checksum 接口:被类Adler32和CRC32实现的接口
Adler32 :使用Alder32算法来计算Checksum数目
CRC32 :使用CRC32算法来计算Checksum数目


CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性
CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性


DeflaterOutputStream :压缩类的基类。
ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。
GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式


InflaterInputStream :解压缩类的基类
ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据
GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据


ZipEntry 类:表示 ZIP 文件条目
ZipFile 类:此类用于从 ZIP 文件读取条目



用GZIP进行对单个文件压缩
GZIP的接口比较简单,因此如果你只需对一个流进行压缩的话,可以使用它。当然它可以压缩字符流,与可以压缩字节流,下面是一个对GBK编码格式的文本文件进行压缩的。
压缩类的用法非常简单;只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。剩下的都是些普通的I/O操作。


import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZIPcompress {
	public static void main(String[] args) throws IOException {
		//做准备压缩一个字符文件,注,这里的字符文件要是GBK编码方式的
		BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(
				"e:/tmp/source.txt"), "GBK"));
		//使用GZIPOutputStream包装OutputStream流,使其具体压缩特性,最后会生成test.txt.gz压缩包
		//并且里面有一个名为test.txt的文件
		BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(
				new FileOutputStream("test.txt.gz")));
		System.out.println("开始写压缩文件...");
		int c;
		while ((c = in.read()) != -1) {

			/* 
			 * 注,这里是压缩一个字符文件,前面是以字符流来读的,不能直接存入c,因为c已是Unicode
			 * 码,这样会丢掉信息的(当然本身编码格式就不对),所以这里要以GBK来解后再存入。
			 */
			out.write(String.valueOf((char) c).getBytes("GBK"));
		}
		in.close();
		out.close();
		System.out.println("开始读压缩文件...");
		//使用GZIPInputStream包装InputStream流,使其具有解压特性
		BufferedReader in2 = new BufferedReader(new InputStreamReader(
				new GZIPInputStream(new FileInputStream("test.txt.gz")), "GBK"));
		String s;
		//读取压缩文件里的内容
		while ((s = in2.readLine()) != null) {
			System.out.println(s);
		}
		in2.close();
	}
}



使用Zip进行多个文件压缩
Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

ZipOutputStream类有设置压缩方法以及在压缩方式下使用的压缩级别,zipOutputStream.setMethod(int method)设置用于条目的默认压缩方法。只要没有为单个 ZIP 文件条目指定压缩方法,就使用ZipOutputStream所设置的压缩方法来存储,默认值为 ZipOutputStream.DEFLATED(表示进行压缩存储),还可以设置成STORED(表示仅打包归档存储)。ZipOutputStream在设置了压缩方法为DEFLATED后,我们还可以进一步使用setLevel(int level)方法来设置压缩级别,压缩级别值为0-9共10个级别(值越大,表示压缩越利害),默认为Deflater.DEFAULT_COMPRESSION=-1。当然我们也可以通过条目ZipEntry的setMethod方法为单个条件设置压缩方法。

类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用来读取ZIP文件,ZipOutputStream来写入ZIP文件的。有以下这些有用的方法:getName()返回条目名称、isDirectory()如果为目录条目,则返回 true(目录条目定义为其名称以 '/' 结尾的条目)、setMethod(int method) 设置条目的压缩方法,可以为 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。




下面实例我们使用了apache的zip工具包(所在包为ant.jar ),因为java类型自带的不支持中文路径,不过两者使用的方式是一样的,只是apache压缩工具多了设置编码方式的接口,其他基本上是一样的。另外,如果使用org.apache.tools.zip.ZipOutputStream来压缩的话,我们只能使用org.apache.tools.zip.ZipEntry来解压,而不能使用java.util.zip.ZipInputStream来解压读取了,当然apache并未提供ZipInputStream类。


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.Deflater;
import java.util.zip.ZipException;
import java.util.zip.ZipInputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * 
 * 提供对单个文件与目录的压缩,并支持是否需要创建压缩源目录、中文路径
 * 
 * @author jzj
 */
public class ZipCompress {

	private static boolean isCreateSrcDir = true;//是否创建源目录

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String src = "m:/新建文本文档.txt";//指定压缩源,可以是目录或文件
		String decompressDir = "e:/tmp/decompress";//解压路径
		String archive = "e:/tmp/test.zip";//压缩包路径
		String comment = "Java Zip 测试.";//压缩包注释

		//----压缩文件或目录
		writeByApacheZipOutputStream(src, archive, comment);

		/*
		 * 读压缩文件,注释掉,因为使用的是apache的压缩类,所以使用java类库中
		 * 解压类时出错,这里不能运行
		 */
		//readByZipInputStream();
		//----使用apace ZipFile读取压缩文件
		readByApacheZipFile(archive, decompressDir);
	}

	public static void writeByApacheZipOutputStream(String src, String archive,
			String comment) throws FileNotFoundException, IOException {
		//----压缩文件:
		FileOutputStream f = new FileOutputStream(archive);
		//使用指定校验和创建输出流
		CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());

		ZipOutputStream zos = new ZipOutputStream(csum);
		//支持中文
		zos.setEncoding("GBK");
		BufferedOutputStream out = new BufferedOutputStream(zos);
		//设置压缩包注释
		zos.setComment(comment);
		//启用压缩
		zos.setMethod(ZipOutputStream.DEFLATED);
		//压缩级别为最强压缩,但时间要花得多一点
		zos.setLevel(Deflater.BEST_COMPRESSION);

		File srcFile = new File(src);

		if (!srcFile.exists() || (srcFile.isDirectory() && srcFile.list().length == 0)) {
			throw new FileNotFoundException(
					"File must exist and  ZIP file must have at least one entry.");
		}
		//获取压缩源所在父目录
		src = src.replaceAll("\\\\", "/");
		String prefixDir = null;
		if (srcFile.isFile()) {
			prefixDir = src.substring(0, src.lastIndexOf("/") + 1);
		} else {
			prefixDir = (src.replaceAll("/$", "") + "/");
		}

		//如果不是根目录
		if (prefixDir.indexOf("/") != (prefixDir.length() - 1) && isCreateSrcDir) {
			prefixDir = prefixDir.replaceAll("[^/]+/$", "");
		}

		//开始压缩
		writeRecursive(zos, out, srcFile, prefixDir);

		out.close();
		// 注:校验和要在流关闭后才准备,一定要放在流被关闭后使用
		System.out.println("Checksum: " + csum.getChecksum().getValue());
		BufferedInputStream bi;
	}

	/**
	 * 使用 org.apache.tools.zip.ZipFile 解压文件,它与 java 类库中的
	 * java.util.zip.ZipFile 使用方式是一新的,只不过多了设置编码方式的
	 * 接口。
	 * 
	 * 注,apache 没有提供 ZipInputStream 类,所以只能使用它提供的ZipFile
	 * 来读取压缩文件。
	 * @param archive 压缩包路径
	 * @param decompressDir 解压路径
	 * @throws IOException
	 * @throws FileNotFoundException
	 * @throws ZipException
	 */
	public static void readByApacheZipFile(String archive, String decompressDir)
			throws IOException, FileNotFoundException, ZipException {
		BufferedInputStream bi;

		ZipFile zf = new ZipFile(archive, "GBK");//支持中文

		Enumeration e = zf.getEntries();
		while (e.hasMoreElements()) {
			ZipEntry ze2 = (ZipEntry) e.nextElement();
			String entryName = ze2.getName();
			String path = decompressDir + "/" + entryName;
			if (ze2.isDirectory()) {
				System.out.println("正在创建解压目录 - " + entryName);
				File decompressDirFile = new File(path);
				if (!decompressDirFile.exists()) {
					decompressDirFile.mkdirs();
				}
			} else {
				System.out.println("正在创建解压文件 - " + entryName);
				String fileDir = path.substring(0, path.lastIndexOf("/"));
				File fileDirFile = new File(fileDir);
				if (!fileDirFile.exists()) {
					fileDirFile.mkdirs();
				}
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
						decompressDir + "/" + entryName));

				bi = new BufferedInputStream(zf.getInputStream(ze2));
				byte[] readContent = new byte[1024];
				int readCount = bi.read(readContent);
				while (readCount != -1) {
					bos.write(readContent, 0, readCount);
					readCount = bi.read(readContent);
				}
				bos.close();
			}
		}
		zf.close();
	}

	/**
	 * 使用 java api 中的 ZipInputStream 类解压文件,但如果压缩时采用了
	 * org.apache.tools.zip.ZipOutputStream时,而不是 java 类库中的
	 * java.util.zip.ZipOutputStream时,该方法不能使用,原因就是编码方
	 * 式不一致导致,运行时会抛如下异常:
	 * java.lang.IllegalArgumentException
	 * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:290)
	 * 
	 * 当然,如果压缩包使用的是java类库的java.util.zip.ZipOutputStream
	 * 压缩而成是不会有问题的,但它不支持中文
	 * 
	 * @param archive 压缩包路径
	 * @param decompressDir 解压路径
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void readByZipInputStream(String archive, String decompressDir)
			throws FileNotFoundException, IOException {
		BufferedInputStream bi;
		//----解压文件(ZIP文件的解压缩实质上就是从输入流中读取数据):
		System.out.println("开始读压缩文件");

		FileInputStream fi = new FileInputStream(archive);
		CheckedInputStream csumi = new CheckedInputStream(fi, new CRC32());
		ZipInputStream in2 = new ZipInputStream(csumi);
		bi = new BufferedInputStream(in2);
		java.util.zip.ZipEntry ze;//压缩文件条目
		//遍历压缩包中的文件条目
		while ((ze = in2.getNextEntry()) != null) {
			String entryName = ze.getName();
			if (ze.isDirectory()) {
				System.out.println("正在创建解压目录 - " + entryName);
				File decompressDirFile = new File(decompressDir + "/" + entryName);
				if (!decompressDirFile.exists()) {
					decompressDirFile.mkdirs();
				}
			} else {
				System.out.println("正在创建解压文件 - " + entryName);
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
						decompressDir + "/" + entryName));
				byte[] buffer = new byte[1024];
				int readCount = bi.read(buffer);

				while (readCount != -1) {
					bos.write(buffer, 0, readCount);
					readCount = bi.read(buffer);
				}
				bos.close();
			}
		}
		bi.close();
		System.out.println("Checksum: " + csumi.getChecksum().getValue());
	}

	/**
	 * 递归压缩
	 * 
	 * 使用 org.apache.tools.zip.ZipOutputStream 类进行压缩,它的好处就是支持中文路径,
	 * 而Java类库中的 java.util.zip.ZipOutputStream 压缩中文文件名时压缩包会出现乱码。
	 * 使用 apache 中的这个类与 java 类库中的用法是一新的,只是能设置编码方式了。
	 *  
	 * @param zos
	 * @param bo
	 * @param srcFile
	 * @param prefixDir
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	private static void writeRecursive(ZipOutputStream zos, BufferedOutputStream bo,
			File srcFile, String prefixDir) throws IOException, FileNotFoundException {
		ZipEntry zipEntry;

		String filePath = srcFile.getAbsolutePath().replaceAll("\\\\", "/").replaceAll(
				"//", "/");
		if (srcFile.isDirectory()) {
			filePath = filePath.replaceAll("/$", "") + "/";
		}
		String entryName = filePath.replace(prefixDir, "").replaceAll("/$", "");
		if (srcFile.isDirectory()) {
			if (!"".equals(entryName)) {
				System.out.println("正在创建目录 - " + srcFile.getAbsolutePath()
						+ "  entryName=" + entryName);

				//如果是目录,则需要在写目录后面加上 / 
				zipEntry = new ZipEntry(entryName + "/");
				zos.putNextEntry(zipEntry);
			}

			File srcFiles[] = srcFile.listFiles();
			for (int i = 0; i < srcFiles.length; i++) {
				writeRecursive(zos, bo, srcFiles[i], prefixDir);
			}
		} else {
			System.out.println("正在写文件 - " + srcFile.getAbsolutePath() + "  entryName="
					+ entryName);
			BufferedInputStream bi = new BufferedInputStream(new FileInputStream(srcFile));

			//开始写入新的ZIP文件条目并将流定位到条目数据的开始处
			zipEntry = new ZipEntry(entryName);
			zos.putNextEntry(zipEntry);
			byte[] buffer = new byte[1024];
			int readCount = bi.read(buffer);

			while (readCount != -1) {
				bo.write(buffer, 0, readCount);
				readCount = bi.read(buffer);
			}
			//注,在使用缓冲流写压缩文件时,一个条件完后一定要刷新一把,不
			//然可能有的内容就会存入到后面条目中去了
			bo.flush();
			//文件读完后关闭
			bi.close();
		}
	}
}


要想把文件加入压缩包,你必须将ZipEntry对象传给putNextEntry( )。ZipEntry是一个接口很复杂的对象,它能让你设置和读取Zip文件里的某条记录的信息,这些信息包括:文件名,压缩前和压缩后的大小,日期,CRC校验码,附加字段,注释,压缩方法,是否是目录。虽然标准的Zip格式是支持口令的,但是Java的Zip类库却不支持。而且ZipEntry却只提供了CRC的接口,而CheckedInputStream和CheckedOutputStream却支持Adler32和CRC32两种校验码。虽然这是底层的Zip格式的限制,但却妨碍了你使用更快的Adler32了。

要想提取文件,可以用ZipInputStream的getNextEntry( )方法。只要压缩包里还有ZipEntry,它就会把它提取出来。此外还有一个更简洁的办法,你可以用ZipFile对象去读文件。ZipFile有一个entries()方法,它可以返回ZipEntries的Enumeration。然后通过zipFile. getInputStream(ZipEntry entry)获取压缩流就可以读取相应条目了。





要想读取校验码,必须先获取Checksum对象。我们这里用的是CheckedOutputStream和CheckedInputStream,不过你也可以使用Checksum。java.util.zip包中比较重要校验算法类是Adler32和CRC32,它们实现了java.util.zip.Checksum接口,并估算了压缩数据的校验和(checksum)。在运算速度方面,Adler32算法比CRC32算法要有一定的优势;但在数据可信度方面,CRC32算法则要更胜一筹。GetValue方法可以用来获得当前的checksum值,reset方法能够重新设置checksum为其缺省的值。

校验和一般用来校验文件和信息是否正确的传送。举个例子,假设你想创建一个ZIP文件,然后将其传送到远程计算机上。当到达远程计算机后,你就可以使用checksum检验在传输过程中文件是否发生错误,有点像下载文件后我们可以使用哈希值来校验文件下载过程是否出错了。


Zip类里还有一个让人莫名其妙的setComment( )方法。如ZipCompress.java所示,写文件的时候,你可以加注释,但是读文件的时候,ZipInputSream却不提供接口。看来它的注释功能完全是针对条目的,是用ZipEntry实现的。

当然,GZIP和Zip不光能用来压缩文件——它还能压缩任何东西,包括要通过网络传输的数据。






    
[2] StatusBar上拉Notification宽度满屏解决办法
    来源: 互联网  发布时间: 2014-02-18
StatusBar下拉Notification宽度满屏解决方法

我的是800x600的屏,在Android 的Notifications没有达到满屏幕宽度

原以为就是xml布局文件的问题,直接找到确定其布局的文件status_bar_expanded.xml,发现并无异样,也就是并非是此问题导 致。由于经常使用emulator,一个偶尔的机会发现,我自己建立的avd设备也没有达到宽度满屏,但官方内置的几个skins却是可以。看来这里面肯 定有差别。在进入到sdk的skins的目录。发现有一硬件配置文件:hardware.ini,里面记载着hw.lcd.density=240,如下

回头看看我自定义的avd设备,density为160。尝试性的,我把自定义的density改为240。果然发现,Notifications竟然也能满屏了。density究竟是何物。在官方的网站上有如下定义:

Density

Based on the screen resolution, the spread of pixels across the physical width and height of the screen.

A screen with lower density has fewer available pixels spread across the screen width and height, where a screen with higher density has more — sometimes significantly more — pixels spread across the same area. The density of a screen is important because, other things being equal, a UI element (such as a button) whose height and width are defined in terms of screen pixels will appear larger on the lower density screen and smaller on the higher density screen.

For simplicity, Android collapses all actual screen densities into three generalized densities: high, medium, and low. Applications can provide custom resources for each of these three densities — the platform handles the scaling of the resources up or down to meet the actual screen density.

再来到相关的源码部分,看系统式如何设置density的。

Density获取的部分在DisplayMetrics.java这个类里面,如果SDK文档中所说的,系统定义了3个等级的density,分别是low-120,medium-160,high-240。

1  public   class   DisplayMetrics   {
2          /* *
3            *   Standard   quantized   DPI   for   low-density   screens.
4            */
5          public   static   final   int   DENSITY_LOW   =   120 ;

7          /* *
8            *   Standard   quantized   DPI   for   medium-density   screens.
9            */
10         public   static   final   int   DENSITY_MEDIUM   =   160 ;
11
12         /* *
13           *   Standard   quantized   DPI   for   high-density   screens.
14           */
15         public   static   final   int   DENSITY_HIGH   =   240 ;
16
17         /* *
18           *   The   reference   density   used   throughout   the   system.
19           */
20         public   static   final   int   DENSITY_DEFAULT   =   DENSITY_MEDIUM;
21        
22         . . . .

同时,代码中把160的Density设置为默认的Density,也就是当前,机器中的Density。那如何设置这个Density。同样在这个类最下面,找到系统获取Density的方法:

1 private   static   int   getDeviceDensity()   {
2                 //   qemu.sf.lcd_density   can   be   used   to   override   ro.sf.lcd_density
3                 //   when   running   in   the   emulator,   allowing   for   dynamic   configurations.
4                 //   The   reason   for   this   is   that   ro.sf.lcd_density   is   write-once   and   is
5                 //   set   by   the   init   process   when   it   parses   build.prop   before   anything   else.
6                 return   SystemProperties . getInt( " qemu.sf.lcd_density " ,
7                                 SystemProperties . getInt( " ro.sf.lcd_density " ,   DENSITY_DEFAULT));
8         }

从这个方法中可以看到,系统会去读系统的属性。先去读ro.sf..lcd_density,若存在,那么设置这个属性记录的density的值。 否则,则取默认值也就是160。看来我源码的属性中并没有设置这一density的值。这个值在源码中的system.prop中修改

由于我不想重新编译系统。所以,我直接在编译好的build.prop中加上

ro.sf.lcd_density=240

重启测试,发现果然,屏幕的分辨率发生了变化,且Notification也全屏了。

觉得240的图标都太大了,我重新设置到200。(试验过在我的800x600的屏上,低于200,都不能使之满屏)

此方法也使用于当你机器玩游戏不满屏的情况。把这个density设置低一点,那么就能满屏玩了。

对于手机用户,使用adb shell连接到手机,取得root权限后修改ro.sf.lcd_density的值就能达到效果

另一种方法:

当然,如果你想保证你的Density不变,那可以只修改CompatibilityInfo.java这个文件,把DEFAULT分辨率的值改成当前的屏幕分辨率,我的是800x600的,于是改成:

1          /* *
2            *   The   default   width   of   the   screen   in   portrait   mode.  
3            */
4  //         public   static   final   int   DEFAULT_PORTRAIT_WIDTH   =   320;
5          public   static   final   int   DEFAULT_PORTRAIT_WIDTH   =   600 ;
6          /* *
7            *   The   default   height   of   the   screen   in   portrait   mode.  
8            */        
9  //         public   static   final   int   DEFAULT_PORTRAIT_HEIGHT   =   480;
10         public   static   final   int   DEFAULT_PORTRAIT_HEIGHT   =   800 ;


    
[3] listView 多值展示
    来源: 互联网  发布时间: 2014-02-18
listView 多值显示

<ListView android:id="@+id/SCHEDULE" android:layout_width="wrap_content" android:layout_height="wrap_content">
</ListView>

<?xml version="1.0" encoding="utf-8"?>
<!-- row.xml -->
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
 
     <TextView android:id="@+id/TRAIN_CELL"
         android:layout_width="50dip"
         android:layout_height="wrap_content"/>
 
     <TextView android:id="@+id/FROM_CELL"
         android:layout_width="70dip"
         android:layout_height="wrap_content" android:layout_weight="1"/>
 
     <TextView android:id="@+id/TO_CELL"
         android:layout_width="60dip"
         android:layout_height="wrap_content"  android:layout_weight="1"/>
</LinearLayout>

ListView list = (ListView) findViewById(R.id.SCHEDULE);
 
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();
map.put("train", "101");
map.put("from", "6:30 AM");
map.put("to", "7:40 AM");
mylist.add(map);
map = new HashMap<String, String>();
map.put("train", "103(x)");
map.put("from", "6:35 AM");
map.put("to", "7:45 AM");
mylist.add(map);
// ...
mSchedule = new SimpleAdapter(this, mylist, R.layout.row,
            new String[] {"train", "from", "to"}, new int[] {R.id.TRAIN_CELL, R.id.FROM_CELL, R.id.TO_CELL});
list.setAdapter(mSchedule);


    
最新技术文章:
▪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