Android BaseAdapter ListView (SD卡中文件目录显示出来)

时间:2023-03-09 22:19:12
Android BaseAdapter  ListView (SD卡中文件目录显示出来)

首先搭建activity_main.xml布局

搭建ListView中显示的布局

创建适配器

  将File数据和UI适配

MainActivity中将ListView设置适配器,并设置监听

//获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加

1、首先搭建activity_main.xml布局

  文件目录置顶,给一个不同的颜色

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:id="@+id/root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_light"
android:text="手机目录>" />
</LinearLayout> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

2、搭建ListView中显示的布局

  左边显示图片,右边也是一个LinearLayout布局,上面显示文件名称,下面显示最后修改时间

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal" > <ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/folder" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="vertical" > <TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文件名" /> <TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="时间" />
</LinearLayout> </LinearLayout>

3、创建适配器

 public class MyAdapter extends BaseAdapter {
Context context;
List<File> list; public MyAdapter(Context context, List<File> list) {
this.context = context;
this.list = list;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
//布局实例化
convertView = View.inflate(context, R.layout.item_filelayout, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 设置数据
File file = (File) getItem(position);
if (file.isDirectory()) {
viewHolder.img.setImageResource(R.drawable.folder);
} else {
if (file.getName().endsWith(".jpg")
|| file.getName().endsWith(".png")
|| file.getName().endsWith(".gif")) {
viewHolder.img.setImageResource(R.drawable.pic);
} else if (file.getName().endsWith(".txt") || file.getName().endsWith(".log")) {
viewHolder.img.setImageResource(R.drawable.text);
} else {
viewHolder.img.setImageResource(R.drawable.unknown);
}
}
viewHolder.name.setText(file.getName());
viewHolder.time.setText(new SimpleDateFormat("yy-M-d HH:mm:ss")
.format(new Date(file.lastModified()))); return convertView;
} class ViewHolder {
ImageView img;
TextView name;
TextView time; public ViewHolder(View convertView) {
img = (ImageView) convertView.findViewById(R.id.img);
name = (TextView) convertView.findViewById(R.id.name);
time = (TextView) convertView.findViewById(R.id.time);
} } }

4、MainAcitivity中给ListView设置适配器

//获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加
 public class MainActivity extends Activity implements OnItemClickListener, OnClickListener {

     LinearLayout ll_root;
TextView root;
ListView lv;
List<File> list = new ArrayList<File>(); //获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加
public static final String SDCard = Environment
.getExternalStorageDirectory().getAbsolutePath(); // 当前文件目录
public static String currDir = SDCard;
MyAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
adapter = new MyAdapter(MainActivity.this, list);
lv.setAdapter(adapter);
getAllFiles(); } private void initData() {
ll_root = (LinearLayout) findViewById(R.id.ll_root);
root = (TextView) findViewById(R.id.root);
lv = (ListView) findViewById(R.id.lv);
lv.setOnItemClickListener(this);
root.setOnClickListener(this);
} public void getAllFiles() {
list.clear();
File file = new File(currDir);
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File file2 : files) {
list.add(file2);
}
}
}
// 文件排序
sort(); // 数据改变之后刷新
// notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容,
// 可以实现动态的刷新列表的功能
adapter.notifyDataSetChanged();
} private void sort() {
//使用Collection.sort排序,给定一个比较器,使用匿名内部类实现比较器接口
Collections.sort(list, new Comparator<File>() { @Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isDirectory() || o1.isFile()
&& o2.isFile()) {
return o1.compareTo(o2);
}
//文件夹在前
return o1.isDirectory() ? -1 : 1;
}
});
} //ListView 监听
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
File file = list.get(position);
if (file.isDirectory()) {
// 下一层目录
currDir = file.getAbsolutePath();
//根目录名加上当前文件夹名
addDirText(file);
getAllFiles();
} else {
Toast.makeText(MainActivity.this, "打开" + file.getName(),
Toast.LENGTH_SHORT).show();
}
} private void addDirText(File file) {
String name = file.getName();
TextView tv = new TextView(this);
tv.setText(name+">");
ll_root.addView(tv);
//将当前的路径保存
tv.setTag(file.getAbsolutePath()); tv.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String tag = v.getTag().toString();
currDir = tag;
getAllFiles(); //将后面的所有TextView的tag移除
//从后往前删,一个一个删
for (int i = ll_root.getChildCount(); i >1; i--) {
View view = ll_root.getChildAt(i-1);
String currTag = view.getTag().toString();
if(!currTag.equals(currDir)){
ll_root.removeViewAt(i-1);
}else{
return;
}
}
}
});
} // Back键返回上一级
@Override
public void onBackPressed() {
// 如果当前目录就是系统根目录,直接调用父类
if (currDir.equals(SDCard)) {
super.onBackPressed();
} else {
// 返回上一层,显示上一层所有文件
currDir = new File(currDir).getParent();
getAllFiles(); //将当前TextView的tag移除
//总是将最后一个TextView移除
View view = ll_root.getChildAt(ll_root.getChildCount()-1);
ll_root.removeView(view); }
} //SD卡根目录TextView监听
@Override
public void onClick(View v) {
currDir = SDCard;
getAllFiles(); //移除ll_root布局中的其他所有组件
for (int i = ll_root.getChildCount(); i >1; i--) {
ll_root.removeViewAt(i-1);
} } }

运行效果如下图:

图1

Android BaseAdapter  ListView (SD卡中文件目录显示出来)

图2

Android BaseAdapter  ListView (SD卡中文件目录显示出来)