1. 程式人生 > >Android實戰之小說閱讀器,帶有水平翻頁,記錄上次讀取頁碼數

Android實戰之小說閱讀器,帶有水平翻頁,記錄上次讀取頁碼數

package com.example.ebook;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.TextView;
import com.example.ebook.adapter.FileAdapter;
import com.example.ebook.util.Globals;
import com.example.ebook.util.TxtDAOUtil;

public class MainActivity extends Activity {
private TextView titleText;
private ListView list;
private FileAdapter adapter;
private List<Map<String,Object>> allValues = new ArrayList<Map<String,Object>>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Globals.init(this);
setContentView(R.layout.activity_main);
//取得元件
titleText = (TextView) findViewById(R.id.title_text);
list = (ListView) findViewById(R.id.list);

//準備資料
//取得SD卡根目錄
File root = Environment.getExternalStorageDirectory();
loadFileData(root);

//建立Adapter
adapter = new FileAdapter(this, allValues);
list.setAdapter(adapter);
//加入監聽事件
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//取得當前操作的資料
Map<String,Object> map = allValues.get(arg2);
//判斷所有點的是檔案還是資料夾
boolean dirFlag = (Boolean) map.get("dirFlag");
if(dirFlag){
//資料夾
//建立該檔案的File物件
//取得絕對路勁
String fullPath = (String) map.get("fullPath");
//建立File
File dir = new File(fullPath);

//先清空原有的資料
allValues.clear();

if(!Environment.getExternalStorageDirectory()
.getAbsolutePath().equals(fullPath)){

//加入返回上一級的運算元
Map<String,Object> parent = new HashMap<String,Object>();
parent.put("fileName", "返回上一級");
parent.put("extName", "dir_open");
parent.put("dirFlag", true);
parent.put("fullPath", dir.getParent());

//儲存一個標誌
parent.put("flag", "TRUE");
//將這一行加入到資料集合中
allValues.add(parent);
}

//加入新資料
loadFileData(dir);
//使用Adapter通知介面ListView,資料已經被修改了,你也要一起改
adapter.notifyDataSetChanged();
}else{
//將該檔案儲存到文字表中
TxtDAOUtil.insertData(map.get("fullPath").toString());

//切換介面
Intent in = new Intent(MainActivity.this,DetailActivity.class);
in.putExtra("fullPath", map.get("fullPath").toString());
startActivity(in);
}
}
});
list.setOnItemLongClickListener(new OnItemLongClickListener() {

@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
final int arg2, long arg3) {
//取得資料
Map<String,Object> map = allValues.get(arg2);
final File f = new File(map.get("fullPath").toString());

if(f.isFile()){
//彈出確認框
Builder builder = new Builder(MainActivity.this);
builder.setTitle("提示");
builder.setMessage("確認要刪除該檔案(" + f.getName() + ")嗎?");
builder.setPositiveButton("確定",new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
//將SD卡中的檔案刪除
if(f.exists()){
f.delete();
}

//將列表中的資料刪除
allValues.remove(arg2);
//通知
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("取消", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

}
});
builder.create().show();
}
return false;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//根據keyCode判斷使用者按下了那個鍵
if(keyCode == KeyEvent.KEYCODE_BACK){
//判斷當前是否在SD卡根目錄下。
//取得第一行資料
Map<String,Object> map = allValues.get(0);
if("TRUE".equals(map.get("flag"))){
//裡面,需要返回上一級
list.performItemClick(list.getChildAt(0),
0, list.getChildAt(0).getId());
}else{
//彈出提示框
Builder builder = new Builder(MainActivity.this);
builder.setTitle("提示");
builder.setMessage("親,真的要離開我嗎?");
builder.setPositiveButton("真的", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

}
});
builder.create().show();
}
return false;
}

return super.onKeyDown(keyCode, event);
}

private void loadFileData(File dir) {
//列出該目錄下的所有檔案
File[] allFiles = dir.listFiles();
//設定當前位置的提示資訊
titleText.setText("當前位置:"+ dir.getAbsolutePath());

//判斷
if(allFiles != null){
//迴圈
for(int i=0;i<allFiles.length;i++){
File f = allFiles[i];
Map<String,Object> map = new HashMap<String,Object>();
map.put("fileName", f.getName());
//多儲存一個檔案的絕對路徑,方便在進行點選時使用
map.put("fullPath", f.getAbsolutePath());
//判斷是資料夾還是檔案
if(f.isDirectory()){
//是資料夾
map.put("extName", "dir_close");
map.put("dirFlag", true);
}else{
//是檔案,截取出副檔名
String extName = f.getName()
.substring(f.getName().lastIndexOf(".")+1)
.toLowerCase();
map.put("extName", extName);
map.put("dirFlag", false);
}
//只有資料夾或是文字檔案才要顯示
if(f.isDirectory() || "txt".equals(map.get("extName"))){
allValues.add(map);
}
}
}
}
}