???? 上一章,我实验了关于UI的基本效果,虽然还有很多控件需要二次开发和实验,不过至少说明是可以使用的。有些空间用代码生成确实十分的麻烦。比如,我花了一个晚上才研究明白,ViewList怎么能够用纯代码显示页面。
???? 首先,我们需要声明ListView控件,设置布局和数据源
ListView lv = new ListView(context); lv.setId(12347); lv.setDrawSelectorOnTop(false); lv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 200)); lv.setBackgroundColor(Color.BLACK); File f = new File("/"); File[] files = f.listFiles(); ArrayList<HashMap<String, String>> fileInfos = new ArrayList<HashMap<String, String>>(); for (File file : files) { HashMap<String, String> fileInfo = new HashMap<String, String>(); fileInfo.put("FILE_NAME", file.getName()); fileInfos.add(fileInfo); } MyAdapter adapter = new MyAdapter(context, fileInfos,// 数据来源 new String[] { "FILE_NAME" }); lv.setAdapter(adapter); layout.addView(lv);
??? ?需要注意的是LayoutParams和MyAdapter 两个地方
???? LayoutParams:当用eclipse开发自动生成时,你会发现,有好多同名类,一定要选择正确的,这里需要选择的是:android.widget.LinearLayout,因为ListView 所属容器是LinearLayout类型。
???? MyAdapter:则是一处需要自行开发的了,虽然Android库中带了好多已实现的Adapter,但是我测试的好多,实现方式都是从资源文件中读取布局信息,这样让之前的努力都白费了,随意这是,只好自己实现了。
???? 由于是测试,方法并没有全部正常的实现,也没有异常处理,仅作为示例使用:
public class MyAdapter extends BaseAdapter { Context context; ArrayList<HashMap<String, String>> data; String[] from; public MyAdapter(Context context, ArrayList<HashMap<String, String>> data, String[] from) { this.context = context; this.data = data; this.from = from; } public int getCount() { return data.size(); } public Object getItem(int position) { return data.get(position); } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { TableLayout lay = null; if (null == convertView) { TableRow tr = new TableRow(context); TextView tv_l = new TextView(context); TextView tv_l2 = new TextView(context); tv_l.setText("* "); tv_l2.setText(data.get(position).get(from[0])); tv_l2.setGravity(Gravity.LEFT); tv_l2.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); tr.addView(tv_l); tr.addView(tv_l2, new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); lay = new TableLayout(context); lay.addView(tr); } else { lay = (TableLayout) convertView; } lay.setColumnStretchable(1, true); return lay; } }
?
????? 这里自动构建了每一行是一个TableLayout,并包含一个TableRow,TableRow 中才是需要显示的内容,这样可以方便以后的各种布局。
????? 展现效果:
?????
????? 另外提一点的是:Android由于实现了一部分JAVA类库,所以文件访问和Java程序是基本类似的,虽然还没有测试细节的API,但是从读取根目录来看,是完全正常的。