上个周末写的创新班作业,主要可复用地方有FileSelector的实现,通过重写返回键事件来响应用户返回上一级的命令,而且储存了用户上一级目录的selected position,更加人性化,有兴趣的朋友可以看看,另外就是jxl库的调用,还有插入联系人,多线程(伪)更新UI等,更新ui这里以前一直以为handler是用于多线程的,但前晚才发现还有Thread这个类,果然多线程不可能没有互斥体,原子操作等这些东西,有兴趣修改的朋友修改下用Thread和handler来实现真多线程吧...(源码下载在最后)
其中主要的fileselector代码放出:
package com.fp.homework3;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.KeyEvent;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class FileSelectAcitvity extends Activity{
public ListView fileslistview;
public TextView nowpathtextview;
private String rootPath;
private class FileData{
public String name;
public String path;
public int type; //文件类型:0.目录 1.普通文件 2.XLS文件
public FileData(String _name,String _path,int _type){
name = _name; path = _path; type = _type;
}
};
private List<FileData> items;
private List<Integer> list_fatherPathPositions;
public boolean doexit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fileselect);
rootPath = getString(R.string.rootpath);
fileslistview = (ListView)findViewById(R.id.listView1);
nowpathtextview = (TextView)findViewById(R.id.textView1);
items = new ArrayList<FileData>();
list_fatherPathPositions = new ArrayList<Integer>();
listFiles(rootPath);
Toast.makeText(this,"请选择要导入的excel文档.",Toast.LENGTH_SHORT).show();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 如果有上一级目录则返回上一级目录,否则调用父类默认函数(退出程序)
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
if(items.get(0).name.toString().equals("..")){
listFiles(items.get(0).path.toString());
int lastitem = list_fatherPathPositions.size()-1;
fileslistview.setSelection(list_fatherPathPositions.get(lastitem));
list_fatherPathPositions.remove(lastitem);
return false;
}
new AlertDialog.Builder(this)
.setIcon(R.drawable.exit)
.setTitle("提示")
.setMessage("你确定要退出本程序吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.create().show();
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_fileselect, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
finish();
return false;
}
public void openExcel(String filepath) {
Bundle bd = new Bundle();
bd.putString("path", filepath);
Intent intent = new Intent(FileSelectAcitvity.this, MainActivity.class);
intent.putExtra("data", bd);
startActivity(intent);
}
public void listFiles(String filePath){
items.clear();
File f=new File(filePath);
nowpathtextview.setText(filePath);
if(f.exists() && f.canRead()){
File[] files=f.listFiles();
if((!filePath.equals(rootPath))&&(!filePath.equals("/"))) {
items.add(new FileData("..",f.getParent(),0));
}
List<FileData> tmp_items = new ArrayList<FileData>();
for(int i=0;i<files.length;i++){
File file=files[i];
String name = file.getName(), path = file.getPath();
if(file.isDirectory()){
items.add(new FileData(name,path,0));
}
else{
if( !name.substring(name.length()-4,name.length()).equals(".xls") )
tmp_items.add(new FileData(name,path,1));
else
tmp_items.add(new FileData(name,path,2));
}
}
items.addAll(tmp_items);
fileslistview.setAdapter(new FileRowAdapter());
fileslistview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
FileData fd = items.get(position);
if(fd.name.toString().equals("..")){
//打开父目录,并返回储存入链表中的前一次打开目录前ListView中第一个item的位置
listFiles(fd.path.toString());
int lastitem = list_fatherPathPositions.size()-1;
fileslistview.setSelection(list_fatherPathPositions.get(lastitem));
list_fatherPathPositions.remove(lastitem);
}else{
File file=new File(fd.path.toString());
if(file.canRead()){
if (file.isDirectory()){
//将当前ListView中第一个item的位置保存,以便返回父目录时可以定位到之前的地方
list_fatherPathPositions.add(fileslistview.getFirstVisiblePosition());
listFiles(fd.path.toString());
}
else{
if(fd.type==2)
openExcel(fd.path.toString());
}
}else{
Toast.makeText(FileSelectAcitvity.this, "此文件不可读",Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
//自定义配适器
public class FileRowAdapter extends BaseAdapter {
public FileRowAdapter() {}
public int getCount() {
return items.size();
}
public Object getItem(int position) {
return items.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
FileData fd = items.get(position);
if(convertView==null) {
holder = new ViewHolder();
holder.icon = new ImageView(FileSelectAcitvity.this);
holder.text = new TextView(FileSelectAcitvity.this);
holder.text.setTextColor(0xFFFFFFFF);
LinearLayout ll = new LinearLayout(FileSelectAcitvity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setVerticalGravity(Gravity.CENTER);
ll.addView(holder.icon);
ll.addView(holder.text);
ll.setTag(holder);
convertView = ll;
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(fd.name);
if(fd.type==0)
holder.icon.setImageResource(R.drawable.folder);
else if(fd.type==1)
holder.icon.setImageResource(R.drawable.default2);
else
holder.icon.setImageResource(R.drawable.notes);
return convertView;
}
public final class ViewHolder {
public ImageView icon;
public TextView text;
}//*/
View item[];
}
}
代码下载:http://dl.vmall.com/c0bgzvn7ym