首页 > 代码库 > 毕业设计:HomeFragment(一)
毕业设计: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(一)