使用自定义的BaseAdapter列出本地文件与文件夹,确定按钮将被选中文件装入列表传到其他Activity,利用一个布尔量数组记录选择框状态,简单解决adapter重构时选择框状态混乱问题。好了代码能用,但还没有认认真真测试,希望谅解啊。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class SDFileExplorer extends Activity
{
ListView listView;
TextView textView;
boolean[] isCheck;
// 记录当前的父文件夹
File currentParent;
// 记录当前路径下的所有文件的文件数组
File[] currentFiles;
List<Map<String, Object>> listItems =
new ArrayList<Map<String, Object>>();
ArrayList<Map<String, String>> selectItems =
new ArrayList<Map<String,String>>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.file_explorer);
// 获取列出全部文件的ListView
listView = (ListView) findViewById(R.id.list);
textView = (TextView) findViewById(R.id.path);
// 获取系统的SD卡的目录
File root = new File("/mnt/");//sdcard/
// 如果存储空间存在
if (root.exists())
{
currentParent = root;
currentFiles = root.listFiles();
// 使用当前目录下的全部文件、文件夹来填充ListView
inflateListView(currentFiles);
}
// 为ListView的列表项的单击事件绑定监听器
listView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
// 用户单击了文件,直接返回,不做任何处理
if (currentFiles[position].isFile()) return;
// 获取用户点击的文件夹下的所有文件
File[] tmp = currentFiles[position].listFiles();
if (tmp == null || tmp.length == 0)
{
Toast.makeText(SDFileExplorer.this
, "当前路径不可访问或该路径下没有文件",
Toast.LENGTH_SHORT).show();
}
else
{
// 获取用户单击的列表项对应的文件夹,设为当前的父文件夹
currentParent = currentFiles[position]; //②
// 保存当前的父文件夹内的全部文件和文件夹
currentFiles = tmp;
// 再次更新ListView
inflateListView(currentFiles);
}
}
});
/////////返回选择文件的按钮///////////////////////////////////
Button select = (Button) findViewById(R.id.select);
select.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO 自动生成的方法存根
for(int i=0;i<isCheck.length;i++)
{
if(isCheck[i])
{
Map<String, String> selectItem=new HashMap<String,String>();
selectItem.put("file_name", listItems.get(i).get("fileName").toString());
try {
selectItem.put("path", currentParent.getCanonicalPath());
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
selectItems.add(selectItem);
}
}
if(selectItems.isEmpty())
{
Toast.makeText(SDFileExplorer.this
, "您未选中任何文件",
Toast.LENGTH_SHORT).show();
}
else
{
Bundle data=new Bundle();
data.putSerializable("data",selectItems);
Intent intent=new Intent(SDFileExplorer.this,MusicPlayer.class);
intent.putExtras(data);
startActivity(intent);
selectItems.clear();
finish();
}
}});
///// 获取上一级目录的按钮//////////////////////
Button parent = (Button) findViewById(R.id.parent);
parent.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
try
{
if (!currentParent.getCanonicalPath()
.equals("/mnt"))
{
// 获取上一级目录
currentParent = currentParent.getParentFile();
// 列出当前目录下所有文件
currentFiles = currentParent.listFiles();
// 再次更新ListView
inflateListView(currentFiles);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
}
//////////控制文件与文件夹的图标,并显示在指定列表中///////////////////////////////
private void inflateListView(File[] files) //①
{
// 显示前先清空之前存储的项
listItems.clear();
selectItems.clear();
isCheck=new boolean[files.length];
for (int i = 0; i < files.length; i++)
{
isCheck[i]=false;
Map<String, Object> listItem =
new HashMap<String, Object>();
// 如果当前File是文件夹,使用folder图标;否则使用file图标
if (files[i].isDirectory())
{
listItem.put("icon", R.drawable.folder);
}
else
{
listItem.put("icon", R.drawable.file);
}
listItem.put("fileName", files[i].getName());
// 添加List项
listItems.add(listItem);
}
BaseAdapter MyAdapter=new BaseAdapter()
{
@Override
public int getCount()
{
return listItems.size();
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return null;
}
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO 自动生成的方法存根
int icon;
final int index = position;
String fileName;
ViewHolder holder = null;
if(convertView==null)
{
holder=new ViewHolder();
convertView = LayoutInflater.from(SDFileExplorer.this).inflate(R.layout.line, null);
holder.image=(ImageView)convertView.findViewById(R.id.icon);
holder.text=(TextView)convertView.findViewById(R.id.file_name);
holder.checkBox=(CheckBox)convertView.findViewById(R.id.check_box);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
icon=Integer.parseInt(listItems.get(position).get("icon").toString());
holder.image.setImageResource(icon);
fileName=listItems.get(position).get("fileName").toString();
holder.text.setText(fileName);
holder.checkBox.setChecked(isCheck[index]);
if(icon==R.drawable.folder)
{
holder.checkBox.setVisibility(View.GONE);
}
else holder.checkBox.setVisibility(0);
/////////选择框的监听,保存其状态////////////////
holder.checkBox.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
isCheck[index]=!isCheck[index];
}
});
return convertView;
}
};
// 为ListView设置Adapter
listView.setAdapter(MyAdapter);
try
{
textView.setText("当前路径为:"
+ currentParent.getCanonicalPath());
}
catch (IOException e)
{
e.printStackTrace();
}
}
static class ViewHolder
{
public ImageView image;
public TextView text;
public CheckBox checkBox;
}
}