毕业设计: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();
    }
}
时间: 2024-08-02 13:50:10

毕业设计:HomeFragment(一)的相关文章

毕业设计:HomeFragment(二)

一.长按item时的响应 在长按item时,我希望能让CheckBox显示出来,并且呼出全选.反选.取消菜单,以及下载.删除.移动.复制操作菜单. 我在具体实现的时候发现处理item布局是一个很大的问题,因为不知道怎么在Fragment里面去改变每一个item的CheckBox状态.经过考虑,我打算把这些方法都写在ListViewAdapter里,并且在这个类里设置一个Map对象,记录每一个position对应的isCheck状态.当我点击每一个CheckBox或者从Fragment里面点击全选

毕业设计准备篇一——环境搭建

毕业设计准备篇一--环境搭建 经过四年的学习和实战经验,打算做一个可以融合大多数学习的知识的毕业设计,所以就给自己的毕设取名:(分布式)桌面化多媒体网站系统.系统采用的构架如图1所示. 图1 系统架构 其中数据库集群目前采用mysql集群,为什么呢,因为目前mysql使用率还是很大的,而且mysql官方文档详细,最大的原因是因为自己笔记本配置不够高,不能搭建oracle集群.业务集群和WEB集群使用dubbo来实现远程调用及服务治理. 本篇文档的主要内容是记录毕设准备工作--环境搭建. 环境搭建

第一次毕业设计任务书

一.毕业设计安排进度 计划安排时间 计划完成内容 是否完成 2017.3.1---2017.3.7 了解系统需求 是 2017.3.8-2017.3.21 了解算法.数据库以及相关概念 待完成 2017.3.23-2017.5.9 初步毕设,以及完成毕业论文初稿 待完成 2017.5.10-5.28 完善毕业论文和毕业设计,准备答辩 待完成 二.本周研究内容 关联规则 关联规则是由 Agrawal 等人在 1993 年首次提出的,是挖掘数据之间关联知识最常用的方法.关联规则的目的在于在一个数据集

毕业设计随录-3

由于昨晚的疯狂,导致今天起床较晚,吃了个饭都一点了,然后下午去办公室帮妈妈缝补衣服到五点,回来搞搞,煲个汤打个球吃个饭都九点多了,回到房间,搞了下毕业设计,就弄好了可以继承httpservlet类,创建servlet,不过需要导个servlet包,吗的,害我搞这么久,我记得我学servlet的时候都不用导就可以直接继承httpservlet,不知道那时的httpservlet应该是自己编写的,然后继承的,应该是这样.  就这样一天又没了,时间过得真快,然而毕业设计却冰山一角未动,从明天开始计算,

2016届毕业设计(论文) 基本规范及档案袋封面填写要求

  一.论文册要求及装订顺序:(注:1-6装订成一册,7-10单独存放档案材料中) (1)论文册外封面(使用全校统一的封面,论文用毕业论文封面,设计说明书用毕业设计封面). (2)原创性声明及论文使用授权声明. (3)立题卡. (4)任务书. (5)开题报告. (6)毕业论文或毕业设计. (7)中期检查表. (8)成绩评定表. (9)中英文翻译. (10)答辩记录. 二.毕业设计材料日期填写: (1)立题卡.任务书填写时间:2016年1月15日 (2)开题报告填写时间:      2016年3月

从高级软件工程角度分析本科毕业设计

本人是15级计算机科学与技术专业的周娜,在学习<高级软件工程>这门课程的过程中,老师交代给我们的第一次任务便是从软件工程角度去分析自己的本科毕业设计. 我的本科毕业设计题目是“基于Android的移动办公系统的设计与实现”,此课题的主要背景是随着网络技术的不断发展和移动终端的不断成熟,以及这两者之间的结合,移动办公方式逐渐引起更多人的关注和使用,方便了用户的工作使用户的工作场所不再拘泥于单一的办公室中.其使用的开发平台是Android平台,应用开发工具是Eclipse,编程语言为Java. 本

从软件工程的视角,回顾本科毕业设计,探视设计中存在的不足

本科毕业设计题目:江西省宜黄县东源银多金属矿普查设计 本普查设计是针对江西省宜黄县东源银多金属矿进行的.在收集前人工作的地质资料和矿区预查成果的基础上进行地质调查,部署一定的工程用来探索含矿破碎带的形态.产状.延伸.延深.蚀变.含矿性及矿化规律. 软件工程是一门强调采用工程的概念.原理. 技术和方法来开发软件系统的科学.主要包括: 需求分析.总体设计.详细设计和系统实现几个部分.结合对软件工程的学习,我发现我的毕业设计存在以下几点不足: 一.在野外地质工作中,我们主要是通过定点投图和野外地质记录

代做毕设,代做GIS毕业设计,GIS项目,GIS二次开发

代做毕设,代做GIS毕业设计,GIS项目等: 常年从事桌面GIS,ArcGIS数据处理分析等: ArcMap插件开发(.Net,Python): QQ:624030189 您是不是还在为做GIS毕业设计苦恼? 没有思路,数据不会处理,不会编程? 软件环境不会安装? 您是不是还在为科研项目中用到GIS而头疼? 图像不会处理,不会制图? 不会写脚本(Net,Python),不会用工具箱进行批处理? 这些东西,在我们这儿,不在话下:让您从GIS中解脱出来,是我们的目标! 我们能够为您提供解决方案.技术

关于写毕业设计网页代码写后感

哎,心累! 开始      本次本着自己养活自己的原则,接了三个学姐的毕业设计,都是是把她们的设计图编写成网页.实际都是一些布局规整,页面简介的网页.虽然一份网页有15页,但其实以正常速度大约两天就可以写完.所以毫无顾虑,接了三份,时间比较赶,差不多都三天之类要(不是同时接的). 过程     第一个学姐的设计是关于美食方面的网页,十五张网页大概只有五种样式.一共是三个人做,但第一次经验不足,在分配任务时非常随意,没有按照网页样式来分配,本来里面有八张样式一样的网页,硬是我们三人一人两三张给做完