毕业设计:HomeFragment(一)
一、主要思路
主要是通过ListView实现。
考虑到以后会添加长按修改功能,所以好几个地方都是用的FramLayout,而且CheckBox初始状态是被隐藏的。给ListView添加OnItemClickedListener,在识别点击的Item是文件夹时做出响应,把ListView的资源来源改成该文件夹。同时顶部的TextView也要修改成对应文件夹目录。
目前我没有对返回键设置监听器,所以返回上一级菜单是通过顶部的按钮实现的。在根目录下该按钮隐藏,等到进入下一级目录的时候按钮就会显示出来。
二、FileBean
FileBean是文件/文件夹的抽象类,包含文件所需的一些必要属性。
package com.example.vcloud_3_25.bean; import java.util.Date; /*
* 包含文件的通用属性和方法
*/
public class FileBean {
public static final int ROOT = 0x7fffffff;
private int id;
private int pId;
private String name;
private String type;
private String info;
private Date date; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getpId() {
return pId;
} public void setpId(int pId) {
this.pId = pId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} public FileBean(int id, int pId, String name, String type, Date date) {
super();
this.id = id;
this.pId = pId;
this.name = name;
this.type = type;
this.date = date;
} }
三、FileHelper
我是这样考虑的,要把一个目录下的所有文件加载出来,就需要设置pId-->FileBeanList的对应关系,所以最方便的就是通过Map实现。在编写过程中程序提示我可以使用SparseArray来代替HashMap,可以提升效率,所以我就使用SparseArray来实现了。至于初始数据如何得到我还没有考虑,所以就在构造函数里自定义了一些数据,这些FileBean是没有预先排好序列,也不具备我预想的pId-->FileBeanList结构,所以我在FileHelper这个类中编写了基础的排序以及结构化的函数。
package com.example.vcloud_3_25.utils; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import android.util.SparseArray; import com.example.vcloud_3_25.bean.FileBean; public class FileHelper {
private List<FileBean> mList; public FileHelper(){
FileBean f1 = new FileBean(1, FileBean.ROOT, "folder1", "folder",
new Date());
FileBean f2 = new FileBean(2, FileBean.ROOT, "avi1", "avi", new Date());
FileBean f3 = new FileBean(3, FileBean.ROOT, "folder2", "folder",
new Date());
FileBean f4 = new FileBean(4, 1, "txt1", "txt", new Date());
FileBean f5 = new FileBean(5, 1, "txt2", "txt", new Date());
FileBean f6 = new FileBean(6, 1, "txt3", "txt", new Date());
FileBean f7 = new FileBean(7, 1, "txt4", "txt", new Date());
FileBean f8 = new FileBean(8, FileBean.ROOT, "txt5", "txt", new Date());
FileBean f9 = new FileBean(9, FileBean.ROOT, "txt6", "txt", new Date()); mList = new ArrayList<FileBean>();
mList.add(f1);
mList.add(f2);
mList.add(f3);
mList.add(f4);
mList.add(f5);
mList.add(f6);
mList.add(f7);
mList.add(f8);
mList.add(f9);
}
public SparseArray<List<FileBean>> getResMap() { Collections.sort(mList, new MyComparator());
SparseArray<List<FileBean>> map = new SparseArray<List<FileBean>>(); for (FileBean f : mList) {
if (getChildren(f.getId()) != null)
map.put(f.getId(), getChildren(f.getId())); else
map.put(f.getId(), new ArrayList());
} return map;
} public List<FileBean> getChildren(int id) {
List<FileBean> list = new ArrayList<FileBean>();
for (FileBean f : mList) {
if (f.getpId() == id)
list.add(f);
}
Collections.sort(list, new MyComparator());
return list;
} class MyComparator implements Comparator<FileBean> { @Override
public int compare(FileBean f1, FileBean f2) {
if (f1.getType() == f2.getType()) {
return f1.getName().compareTo(f2.getName());
} else if (f1.getType().equals("folder")) {
return -1;
} else if (f2.getType().equals("folder")) {
return 1;
}
return f1.getType().compareTo(f2.getType());
} }
}
四、HomeFragment
这个就稍微臃肿了一点,我在考虑后期重构这段代码。
有一个需要注意的点,就是如何刷新ListView的问题。这在网络上能很容易的找到答案,就是先clear一下List,然后用addAll函数添加数据,最后使用Adapter的notifyDataSetChanged()方法更新数据。因为常用所以我把它抽取为了一个函数。
package com.example.vcloud_3_25; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.util.Log;
import android.util.SparseArray;
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.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView; import com.example.vcloud_3_25.bean.FileBean;
import com.example.vcloud_3_25.utils.FileHelper; public class HomeFragment extends Fragment { private ListView mListView = null;
private FileHelper mFileHelper = null; // Map,每一个int型id对应一个FileBean列表。用于展现文件夹包含关系。
private SparseArray<List<FileBean>> mResMap = null;
private List<Map<String, Object>> mResList;
private int recentPid;
private View view;
private SwipeRefreshLayout refresh;
private List<Integer> mDirList;
private List<String> mDirStrList;
private SimpleAdapter adapter;
private String mDirString;
private TextView mDirTextView;
private ImageButton mBackButton;
private ImageButton mAddButton; @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { initView(inflater, container);
initData();
return view;
} private void initData() {
mFileHelper = new FileHelper();
mResMap = mFileHelper.getResMap();
recentPid = FileBean.ROOT;
mResList = getResList(recentPid);
mDirList = new ArrayList<Integer>();
mDirStrList = new ArrayList<String>();
mDirList.add(FileBean.ROOT);
mDirStrList.add("root");
mDirString = "root/"; mBackButton.setVisibility(view.INVISIBLE); adapter = new SimpleAdapter(this.getActivity(), mResList,
R.layout.file_item, new String[] { "fileName", "fileDate",
"fileImag", "fileCheckBox" }, new int[] {
R.id.item_name, R.id.item_date, R.id.file_imag,
R.id.file_checkbox });
mListView.setAdapter(adapter); mListView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View item,
int position, long id) { ListView lv = (ListView) parent;
@SuppressWarnings("unchecked")
HashMap<String, Object> mMap = (HashMap<String, Object>) lv
.getItemAtPosition(position);
String type = (String) mMap.get("fileType"); // 如果点击的是文件夹,则打开该文件夹,并且修改当前目录,修改目录列表;否则不作反应。 if (type.equals("folder")) {
recentPid = (Integer) mMap.get("fileId");
mDirList.add(recentPid);
mDirStrList.add((String) mMap.get("fileName"));
setDirString();
refreshListView();
} mBackButton.setVisibility(view.VISIBLE); }
}); refresh.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
refreshListView();
refresh.setRefreshing(false);
}
}, 1000);
}
}); mBackButton.setOnClickListener(new OnClickListener() { @Override
public void onClick(View view) {
mDirStrList.remove(mDirStrList.size()-1);
mDirList.remove(mDirList.size()-1);
recentPid = mDirList.get(mDirList.size()-1);
setDirString();
refreshListView(); if(mDirList.size()==1)
mBackButton.setVisibility(view.INVISIBLE);
}
});
} private void initView(LayoutInflater inflater, ViewGroup container) {
view = inflater.inflate(R.layout.main_tab_1, container, false);
mListView = (ListView) view.findViewById(R.id.folder_content_list);
refresh = (SwipeRefreshLayout) view
.findViewById(R.id.id_refresh_layout);
mDirTextView = (TextView) view.findViewById(R.id.folder_name);
mBackButton = (ImageButton) view.findViewById(R.id.id_back_button);
mAddButton = (ImageButton) view.findViewById(R.id.upload_imag);
} // 该List用于和ListView绑定
@SuppressLint("SimpleDateFormat")
private List<Map<String, Object>> getResList(int id) {
List<Map<String, Object>> mMaps = new ArrayList<Map<String, Object>>();
Map<String, Object> map;
for (FileBean f : mFileHelper.getChildren(id)) { SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"); map = new HashMap<String, Object>();
map.put("fileName", f.getName());
map.put("fileDate", formatter.format(new Date()));
map.put("fileImag", getFileImag(f.getType()));
map.put("fileId", f.getId());
map.put("fileCheckBox", R.id.file_checkbox);
map.put("fileType", f.getType()); mMaps.add(map);
Log.d("map.put", f.getName());
}
return mMaps;
} // 根据String类型的文件类型找出对应的图片ID
private int getFileImag(String type) {
if (type.equals("avi"))
return R.drawable.avi;
else if (type.equals("doc"))
return R.drawable.doc;
else if (type.equals("exe"))
return R.drawable.exe;
else if (type.equals("fla"))
return R.drawable.fla;
else if (type.equals("folder"))
return R.drawable.folder;
else if (type.equals("html"))
return R.drawable.html;
else if (type.equals("mp3"))
return R.drawable.mp3;
else if (type.equals("mp4"))
return R.drawable.mp4;
else if (type.equals("pdf"))
return R.drawable.pdf;
else if (type.equals("png"))
return R.drawable.png;
else if (type.equals("ppt"))
return R.drawable.ppt;
else if (type.equals("xml"))
return R.drawable.xml;
else if (type.equals("zip"))
return R.drawable.zip;
return R.drawable.other;
} private void setDirString(){
String str = "";
for(String s:mDirStrList){
str = str+s+"/";
}
mDirTextView.setText(str);
}
private void refreshListView(){
mResList.clear();
mResList.addAll(getResList(recentPid));
adapter.notifyDataSetChanged();
}
}
毕业设计:HomeFragment(一)的更多相关文章
- 毕业设计:HomeFragment(二)
一.长按item时的响应 在长按item时,我希望能让CheckBox显示出来,并且呼出全选.反选.取消菜单,以及下载.删除.移动.复制操作菜单. 我在具体实现的时候发现处理item布局是一个很大的问 ...
- 毕业设计 之 二 PHP学习笔记(一)
毕业设计 之 二 PHP学习笔记(一) 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 一.环境搭建 1.XAMPP下载安装 XAMPP是PHP.MySQL ...
- 毕业设计--天气预报App
9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...
- javaweb毕业设计
javaweb毕业设计,管理系统设计,Strut2项目,Springmvc项目,javaweb项目学习. 都是可以运行的,(配数据库和论文),都能提供技术咨询,可以修改.欢迎+扣扣396058587咨 ...
- iOS仿喜马拉雅FM做的毕业设计及总结(含新手福利源码)
其实仿喜马拉雅FM很早就开始了,从我刚接触iOS开始,就开始仿做了一部分,眼尖的人都从我的github找到了那个项目.随着找到实习iOS工作,仿写就落下了,但唯一的收获就是给过去打了一个响亮的耳光,因 ...
- 毕业设计 ASP.Net+EasyUI开发 X X露天矿调度管理信息系统(二)
这是本毕业设计的雏形和框架,实现的功能在左侧的功能框导航菜单内. 做的太烂,还是把学校名字给马赛克掉吧....省的挨校友批 登陆界面.. <cookie +ispostback实现记住我功能& ...
- 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)
☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...
- 毕业设计-JSP论文盲审系统
之前做的一款jsp的论文盲审系统,ssh框架的,学生提交论文,系统管理员将论文分配给教员,教员在不知学员是谁的情况之下,对论文进行打分,然后提交给系统,最后系统发布成绩,供学员查看. 整体做的还不错, ...
- Android毕业设计-微圈
勤拂拭软件出品,必属精品 : 勤拂拭软件 去年做了一个类似于我的朋友圈的项目,主要功能就是用户可以实时发表自己的动态,好友可以评论点赞什么的,可以建群,聊天啊,拉黑啊,反正是一个不错的社交软件,包含服 ...
随机推荐
- HDU1532 Drainage Ditches —— 最大流(sap算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/ ...
- 使用JavaScript访问XML数据
在本篇文章中,我们将讲述如何在IE中使用ActiveX功能来访问并解析XML文档,由此允许网络冲浪者操纵它们.这一网页将传入并运行脚本的初始化.你一定确保order.xml文档与jsxml.html在 ...
- Opencv实现两幅图像融合
实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar() addWeighted方法: 函数原型: void addWeig ...
- IOS AutoLayout 代码实现约束—VFL
在autolayout下,尽管使用IB来拖放控件,但仍然避免不了用代码来创建控件,这是约束需要代码来实现. IOS 提供了两种添加约束的方法 第一种: +(instancetype)constrain ...
- 2.27 MapReduce Shuffle过程如何在Job中进行设置
一.shuffle过程 总的来说: *分区 partitioner *排序 sort *copy (用户无法干涉) 拷贝 *分组 group 可设置 *压缩 compress *combiner ma ...
- ccflow_003.驰骋流程引擎表单方案
003.驰骋流程引擎表单方案 设计流程主要有四个步骤 设计成型的效果图 表单的展示效果 表单方案 提供了八种表单模式 内置傻瓜表单 设计好的傻瓜表单演示 运行查看效果 内置自由表单 这是已经设计好的自 ...
- 图像分类与KNN
1 图像分类问题 1.1 什么是图像分类 所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像.虽然看起来挺简单的,但这可 ...
- bzoj 1488: [HNOI2009]图的同构【polya定理+dfs】
把连边和不连边看成黑白染色,然后就变成了 https://www.cnblogs.com/lokiii/p/10055629.html 这篇讲得好!https://blog.csdn.net/wzq_ ...
- CH 6021 走廊泼水节
描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时 ...
- 第十一篇 .NET高级技术之内置泛型委托
Func.Action 一.如果不是声明为泛型委托 委托的类型名称不能重载,也就是不能名字相同类型参数不同 二..Net中内置两个泛型委托Func.Action(在“对象浏览器”的mscorlib的S ...