实例介绍
【实例简介】
【实例截图】




【核心代码】
package com.lguipeng.notes.ui;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import com.lguipeng.notes.R;
import com.lguipeng.notes.adpater.BaseRecyclerViewAdapter;
import com.lguipeng.notes.adpater.DrawerListAdapter;
import com.lguipeng.notes.adpater.NotesAdapter;
import com.lguipeng.notes.adpater.SimpleListAdapter;
import com.lguipeng.notes.listener.bmob.FindListenerImpl;
import com.lguipeng.notes.listener.bmob.SaveListenerImpl;
import com.lguipeng.notes.listener.bmob.UpdateListenerImpl;
import com.lguipeng.notes.model.CloudNote;
import com.lguipeng.notes.model.Note;
import com.lguipeng.notes.model.NoteOperateLog;
import com.lguipeng.notes.model.NoteType;
import com.lguipeng.notes.module.DataModule;
import com.lguipeng.notes.utils.AccountUtils;
import com.lguipeng.notes.utils.JsonUtils;
import com.lguipeng.notes.utils.NoteConfig;
import com.lguipeng.notes.utils.PreferenceUtils;
import com.lguipeng.notes.utils.SnackbarUtils;
import com.melnykov.fab.FloatingActionButton;
import com.melnykov.fab.ScrollDirectionListener;
import com.pnikosis.materialishprogress.ProgressWheel;
import net.tsz.afinal.FinalDb;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import butterknife.InjectView;
import cn.bmob.v3.BmobQuery;
import de.greenrobot.event.EventBus;
/**
* Created by lgp on 2015/5/24.
*/
public class MainActivity extends BaseActivity implements SwipeRefreshLayout.OnRefreshListener{
@InjectView(R.id.toolbar)
Toolbar toolbar;
@InjectView(R.id.refresher)
SwipeRefreshLayout refreshLayout;
@InjectView(R.id.recyclerView)
RecyclerView recyclerView;
@InjectView(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
@InjectView(R.id.edit_note_type)
Button editNoteTypeButton;
@InjectView(R.id.left_drawer_listview)
ListView mDrawerMenuListView;
@InjectView(R.id.left_drawer)
View drawerRootView;
@InjectView(R.id.fab)
FloatingActionButton fab;
@InjectView(R.id.progress_wheel)
ProgressWheel progressWheel;
@Inject
FinalDb finalDb;
private ActionBarDrawerToggle mDrawerToggle;
private SearchView searchView;
private NotesAdapter recyclerAdapter;
private int mCurrentNoteType;
private boolean rightHandOn = false;
private boolean cardLayout = true;
private boolean hasUpdateNote = false;
private PreferenceUtils mPreferenceUtils;
private boolean hasEditClick = false;
private List<String> noteTypelist;
private boolean hasSyncing = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPreferenceUtils = PreferenceUtils.getInstance(getApplicationContext());
initToolbar();
initDrawerView();
initRecyclerView();
EventBus.getDefault().register(this);
}
@Override
public void onStart() {
super.onStart();
if (rightHandOn != preferenceUtils.getBooleanParam(getString(R.string.right_hand_mode_key))){
rightHandOn = !rightHandOn;
if (rightHandOn){
setMenuListViewGravity(Gravity.END);
}else{
setMenuListViewGravity(Gravity.START);
}
}
}
@Override
protected void onResume() {
super.onResume();
if (hasUpdateNote){
changeToSelectNoteType(mCurrentNoteType);
hasUpdateNote = false;
}
if (cardLayout != preferenceUtils.getBooleanParam(getString(R.string.card_note_item_layout_key), true)){
changeItemLayout(!cardLayout);
}
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
public void onEvent(Integer event){
switch (event){
case NoteConfig.NOTE_UPDATE_EVENT:
hasUpdateNote = true;
break;
case NoteConfig.NOTE_TYPE_UPDATE_EVENT:
initDrawerListView();
}
}
@Override
protected int getLayoutView() {
return R.layout.activity_main;
}
@Override
protected List<Object> getModules() {
return Arrays.<Object>asList(new DataModule());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
if (toolbar != null){
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openOrCloseDrawer();
}
});
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchItem = menu.findItem(R.id.action_search);
//searchItem.expandActionView();
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
ComponentName componentName = getComponentName();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(componentName));
searchView.setQueryHint(getString(R.string.search_note));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return true;
}
@Override
public boolean onQueryTextChange(String s) {
recyclerAdapter.setUpFactor();
recyclerAdapter.getFilter().filter(s);
return true;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
Intent intent;
switch (item.getItemId()){
case R.id.setting:
intent = new Intent(MainActivity.this, SettingActivity.class);
startActivity(intent);
return true;
case R.id.sync:
sync();
return true;
case R.id.about:
intent = new Intent(MainActivity.this, AboutActivity.class);
startActivity(intent);
return true;
case android.R.id.home:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mDrawerLayout.isDrawerOpen(drawerRootView)){
mDrawerLayout.closeDrawer(drawerRootView);
return true;
}
moveTaskToBack(true);
return super.onKeyDown(keyCode, event);
}
private void initToolbar(){
super.initToolbar(toolbar);
}
private void initDrawerListView(){
String json = mPreferenceUtils.getStringParam(PreferenceUtils.NOTE_TYPE_KEY);
if (!TextUtils.isEmpty(json)){
noteTypelist = JsonUtils.parseNoteType(json);
}else{
noteTypelist = Arrays.asList(getResources().getStringArray(R.array.drawer_content));
NoteType type = new NoteType();
type.setTypes(noteTypelist);
String text = JsonUtils.jsonNoteType(type);
mPreferenceUtils.saveParam(PreferenceUtils.NOTE_TYPE_KEY, text);
}
SimpleListAdapter adapter = new DrawerListAdapter(this, noteTypelist);
mDrawerMenuListView.setAdapter(adapter);
mDrawerMenuListView.setItemChecked(mCurrentNoteType, true);
toolbar.setTitle(noteTypelist.get(mCurrentNoteType));
}
private void initDrawerView() {
initDrawerListView();
mDrawerMenuListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDrawerMenuListView.setItemChecked(position, true);
openOrCloseDrawer();
mCurrentNoteType = position;
changeToSelectNoteType(mCurrentNoteType);
if (mCurrentNoteType == NoteConfig.NOTE_TRASH_TYPE) {
fab.hide();
fab.setVisibility(View.INVISIBLE);
} else {
fab.setVisibility(View.VISIBLE);
fab.show();
}
}
});
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0){
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
toolbar.setTitle(R.string.app_name);
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu();
toolbar.setTitle(noteTypelist.get(mCurrentNoteType));
if (hasEditClick){
Intent intent = new Intent(MainActivity.this, EditNoteTypeActivity.class);
startActivity(intent);
hasEditClick = false;
}
}
};
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.setScrimColor(getColor(R.color.drawer_scrim_color));
rightHandOn = preferenceUtils.getBooleanParam(getString(R.string.right_hand_mode_key));
if (rightHandOn){
setMenuListViewGravity(Gravity.END);
}
editNoteTypeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hasEditClick = true;
openOrCloseDrawer();
}
});
}
private void initRecyclerView(){
showProgressWheel(true);
initItemLayout();
recyclerView.setHasFixedSize(true);
recyclerAdapter = new NotesAdapter(initItemData(mCurrentNoteType));
recyclerAdapter.setOnInViewClickListener(R.id.notes_item_root,
new BaseRecyclerViewAdapter.onInternalClickListenerImpl<Note>() {
@Override
public void OnClickListener(View parentV, View v, Integer position, Note values) {
super.OnClickListener(parentV, v, position, values);
if (mCurrentNoteType == NoteConfig.NOTE_TRASH_TYPE)
return;
startNoteActivity(NoteActivity.VIEW_NOTE_TYPE, values);
}
});
recyclerAdapter.setOnInViewClickListener(R.id.note_more,
new BaseRecyclerViewAdapter.onInternalClickListenerImpl<Note>() {
@Override
public void OnClickListener(View parentV, View v, Integer position, Note values) {
super.OnClickListener(parentV, v, position, values);
showPopupMenu(v, values);
}
});
recyclerAdapter.setFirstOnly(false);
recyclerAdapter.setDuration(300);
recyclerView.setAdapter(recyclerAdapter);
fab.attachToRecyclerView(recyclerView, new ScrollDirectionListener() {
@Override
public void onScrollDown() {
recyclerAdapter.setDownFactor();
}
@Override
public void onScrollUp() {
recyclerAdapter.setUpFactor();
}
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Note note = new Note();
note.setType(mCurrentNoteType);
startNoteActivity(NoteActivity.CREATE_NOTE_TYPE, note);
}
});
showProgressWheel(false);
refreshLayout.setColorSchemeColors(getColorPrimary());
refreshLayout.setOnRefreshListener(this);
}
@Override
public void onRefresh() {
sync();
}
private void changeToSelectNoteType(int type){
showProgressWheel(true);
recyclerAdapter.setList(initItemData(type));
showProgressWheel(false);
}
private void openOrCloseDrawer() {
if (mDrawerLayout.isDrawerOpen(drawerRootView)) {
mDrawerLayout.closeDrawer(drawerRootView);
} else {
mDrawerLayout.openDrawer(drawerRootView);
}
}
private void showPopupMenu(View view, final Note note) {
PopupMenu popup = new PopupMenu(this, view);
//Inflating the Popup using xml file
String move = getString(R.string.move_to);
if (mCurrentNoteType == NoteConfig.NOTE_TRASH_TYPE){
for (int i=0; i< noteTypelist.size()-1; i ){
popup.getMenu().add(Menu.NONE, i, Menu.NONE, move noteTypelist.get(i));
}
popup.getMenu().add(Menu.NONE, noteTypelist.size()-1, Menu.NONE, getString(R.string.delete_forever));
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if (id < noteTypelist.size() - 1) {
note.setType(id);
finalDb.update(note);
changeToSelectNoteType(mCurrentNoteType);
} else {
showDeleteForeverDialog(note);
}
return true;
}
});
} else {
popup.getMenuInflater()
.inflate(R.menu.menu_notes_more, popup.getMenu());
popup.setOnMenuItemClickListener(
new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete_forever:
showDeleteForeverDialog(note);
break;
case R.id.edit:
startNoteActivity(NoteActivity.EDIT_NOTE_TYPE, note);
break;
case R.id.move_to_trash:
note.setType(NoteConfig.NOTE_TRASH_TYPE);
finalDb.update(note);
changeToSelectNoteType(mCurrentNoteType);
break;
default:
break;
}
return true;
}
});
}
popup.show(); //showing popup menu
}
private void showDeleteForeverDialog(final Note note){
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
builder.setTitle(R.string.delete_forever_message);
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
for (NoteOperateLog log : note.getLogs().getList()){
finalDb.delete(log);
}
finalDb.delete(note);
changeToSelectNoteType(mCurrentNoteType);
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
default:
break;
}
}
};
builder.setPositiveButton(R.string.sure, listener);
builder.setNegativeButton(R.string.cancel, listener);
builder.show();
}
private void startNoteActivity(int oprType, Note value){
Intent intent = new Intent(this, NoteActivity.class);
Bundle bundle = new Bundle();
bundle.putInt(NoteActivity.OPERATE_NOTE_TYPE_KEY, oprType);
EventBus.getDefault().postSticky(value);
intent.putExtras(bundle);
startActivity(intent);
}
private void setMenuListViewGravity(int gravity){
DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) drawerRootView.getLayoutParams();
params.gravity = gravity;
drawerRootView.setLayoutParams(params);
}
private List<Note> initItemData(int noteType) {
List<Note> itemList = null;
switch (noteType){
case NoteConfig.NOTE_STUDY_TYPE:
case NoteConfig.NOTE_WORK_TYPE:
case NoteConfig.NOTE_OTHER_TYPE:
case NoteConfig.NOTE_TRASH_TYPE:
itemList = finalDb.findAllByWhere(Note.class, "type = " noteType, "lastOprTime", true);
break;
default:
break;
}
return itemList;
}
private void showProgressWheel(boolean visible){
if (visible){
if (!progressWheel.isSpinning())
progressWheel.spin();
}else{
progressWheel.postDelayed(new Runnable() {
@Override
public void run() {
if (progressWheel.isSpinning()) {
progressWheel.stopSpinning();
}
}
}, 500);
}
}
private void syncNotes(final String account){
new Thread(){
@Override
public void run() {
BmobQuery<CloudNote> query = new BmobQuery<>();
query.addWhereEqualTo("email", account);
query.findObjects(MainActivity.this, new FindListenerImpl<CloudNote>(){
CloudNote cloudNote;
@Override
public void onSuccess(List<CloudNote> notes) {
List<Note> list = finalDb.findAll(Note.class);
if (notes != null && notes.size() >= 1){
cloudNote = notes.get(0);
long localVersion = preferenceUtils.getLongParam(account);
if (cloudNote.getVersion() > localVersion){
//pull notes
preferenceUtils.saveParam(PreferenceUtils.NOTE_TYPE_KEY, cloudNote.getNoteType());
for (String string : cloudNote.getNoteList()) {
Note note = JsonUtils.parseNote(string);
if (note == null)
continue;
finalDb.saveBindId(note);
NoteOperateLog log = new NoteOperateLog();
log.setTime(note.getLastOprTime());
log.setType(NoteConfig.NOTE_CREATE_OPR);
log.setNote(note);
finalDb.save(log);
}
preferenceUtils.saveParam(account, cloudNote.getVersion());
runOnUiThread(new Runnable() {
@Override
public void run() {
initDrawerListView();
changeToSelectNoteType(mCurrentNoteType);
onSyncSuccess();
}
});
return;
}else {
//upload notes
cloudNote.setVersion( localVersion);
}
}else {
cloudNote = new CloudNote();
cloudNote.setEmail(account);
cloudNote.setVersion(1);
}
cloudNote.clearNotes();
for (Note note : list){
cloudNote.addNote(note);
}
String json = mPreferenceUtils.getStringParam(PreferenceUtils.NOTE_TYPE_KEY);
cloudNote.setNoteType(json);
if (TextUtils.isEmpty(cloudNote.getObjectId())){
cloudNote.save(MainActivity.this, new SaveListenerImpl() {
@Override
public void onSuccess() {
preferenceUtils.saveParam(account, cloudNote.getVersion());
onSyncSuccess();
}
@Override
public void onFailure(int i, String s) {
super.onFailure(i, s);
onSyncFail();
}
});
}else{
cloudNote.update(MainActivity.this, new UpdateListenerImpl() {
@Override
public void onSuccess() {
preferenceUtils.saveParam(account, cloudNote.getVersion());
onSyncSuccess();
}
@Override
public void onFailure(int i, String s) {
super.onFailure(i, s);
onSyncFail();
}
});
}
}
@Override
public void onError(int i, String s) {
super.onError(i, s);
onSyncFail();
}
});
}
}.start();
}
private void sync(){
if (hasSyncing)
return;
String account = preferenceUtils.getStringParam(getString(R.string.sync_account_key));
if (TextUtils.isEmpty(account)){
AccountUtils.findValidAccount(getApplicationContext(), new AccountUtils.AccountFinderListener() {
@Override
protected void onNone() {
if (refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
SnackbarUtils.show(MainActivity.this, R.string.no_account_tip);
}
@Override
protected void onOne(String account) {
preferenceUtils.saveParam(getString(R.string.sync_account_key), account);
hasSyncing = true;
syncNotes(account);
}
@Override
protected void onMore(List<String> accountItems) {
if (refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
SnackbarUtils.show(MainActivity.this, R.string.no_account_tip);
}
});
}else {
if (!refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(true);
}
hasSyncing = true;
syncNotes(account);
}
}
private void onSyncSuccess(){
runOnUiThread(new Runnable() {
@Override
public void run() {
hasSyncing = false;
refreshLayout.setRefreshing(false);
SnackbarUtils.show(MainActivity.this, R.string.sync_success);
}
});
}
private void onSyncFail(){
runOnUiThread(new Runnable() {
@Override
public void run() {
hasSyncing = false;
refreshLayout.setRefreshing(false);
SnackbarUtils.show(MainActivity.this, R.string.sync_fail);
}
});
}
private void changeItemLayout(boolean flow){
cardLayout = flow;
if (!flow){
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
}else {
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL));
}
}
private void initItemLayout(){
if (preferenceUtils.getBooleanParam(getString(R.string.card_note_item_layout_key), true)){
cardLayout = true;
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL));
}else {
cardLayout = false;
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)