Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile-Cn-Ko-En
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fallenstardust
YGOMobile-Cn-Ko-En
Commits
94c7fd18
Commit
94c7fd18
authored
Nov 10, 2025
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DeckManagerFragment添加注释
parent
6d95cb25
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
234 additions
and
33 deletions
+234
-33
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
...ava/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
+234
-33
No files found.
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
View file @
94c7fd18
...
...
@@ -160,6 +160,14 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
private
View
layoutView
;
/**
* 创建并返回Fragment的视图层次结构
*
* @param inflater 用于将XML布局文件转换为View对象的LayoutInflater实例,不可为空
* @param container 父容器ViewGroup,可为空
* @param savedInstanceState 保存Fragment状态的Bundle对象,可为空
* @return 返回创建的View对象,如果创建失败则返回null
*/
@Nullable
@Override
public
View
onCreateView
(
@NonNull
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
...
...
@@ -168,58 +176,93 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
activity
=
(
HomeActivity
)
getActivity
();
originalData
=
new
ArrayList
<>();
// 初始化布局视图
layoutView
=
inflater
.
inflate
(
R
.
layout
.
fragment_deck_cards
,
container
,
false
);
AnimationShake2
(
layoutView
);
initView
(
layoutView
);
//检查外部调用方是否传入了ydk文件路径,如果传入,则打开外部ydk文件
// 检查并预加载外部ydk文件
preLoadFile
();
//event
// 注册事件总线监听器
if
(!
EventBus
.
getDefault
().
isRegistered
(
this
))
{
//加上判断
EventBus
.
getDefault
().
register
(
this
);
}
// 显示新手引导
showNewbieGuide
(
"deckmain"
);
return
layoutView
;
}
/**
* 初始化视图组件和相关逻辑
* 此方法负责初始化布局中的各个UI控件,并设置它们的属性、适配器及事件监听器。
* 同时还初始化了数据管理器、搜索器、加载器等业务组件,并处理了一些用户交互逻辑,
* 如点赞功能与自动同步远程卡组信息。
*
* @param layoutView 布局视图对象,用于查找子控件
*/
public
void
initView
(
View
layoutView
)
{
// 获取屏幕宽度
screenWidth
=
getResources
().
getDisplayMetrics
().
widthPixels
;
// 初始化抽屉布局和列表视图
mDrawerLayout
=
layoutView
.
findViewById
(
R
.
id
.
drawer_layout
);
mListView
=
layoutView
.
findViewById
(
R
.
id
.
list_cards
);
// 设置卡片列表适配器并启用滑动删除功能
mCardListAdapter
=
new
CardListAdapter
(
getContext
(),
activity
.
getImageLoader
());
mCardListAdapter
.
setEnableSwipe
(
true
);
mListView
.
setLayoutManager
(
new
FastScrollLinearLayoutManager
(
getContext
()));
mListView
.
setAdapter
(
mCardListAdapter
);
// 设置各类监听器
setListeners
();
// 初始化数据管理器
mPackManager
=
DataManager
.
get
().
getPackManager
();
mCardManager
=
DataManager
.
get
().
getCardManager
();
// 初始化卡片加载器和回调接口
mCardLoader
=
new
CardLoader
(
getContext
());
mCardLoader
.
setCallBack
(
this
);
// 初始化卡片搜索器及其回调接口
mCardSearcher
=
new
CardSearcher
(
layoutView
.
findViewById
(
R
.
id
.
nav_view_list
),
mCardLoader
);
mCardSearcher
.
setCallBack
(
this
);
// 查找顶部展示区域的文本控件
tv_deck
=
layoutView
.
findViewById
(
R
.
id
.
tv_deck
);
tv_result_count
=
layoutView
.
findViewById
(
R
.
id
.
result_count
);
// 初始化限制条件选择下拉框并设置背景颜色
mLimitSpinner
=
layoutView
.
findViewById
(
R
.
id
.
sp_limit_list
);
mLimitSpinner
.
setPopupBackgroundResource
(
R
.
color
.
colorNavy
);
// 初始化网格形式的卡组显示区域
mRecyclerView
=
layoutView
.
findViewById
(
R
.
id
.
grid_cards
);
mRecyclerView
.
setPadding
(
mRecyclerView
.
getPaddingLeft
(),
0
,
mRecyclerView
.
getPaddingRight
(),
mRecyclerView
.
getPaddingBottom
());
// 设置卡组适配器和自定义布局管理器
mRecyclerView
.
setAdapter
((
mDeckAdapater
=
new
DeckAdapater
(
getContext
(),
mRecyclerView
,
activity
.
getImageLoader
())));
mRecyclerView
.
setLayoutManager
(
new
DeckLayoutManager
(
getContext
(),
Constants
.
DECK_WIDTH_COUNT
));
// 配置拖拽支持与触摸助手
mDeckItemTouchHelper
=
new
DeckItemTouchHelper
(
mDeckAdapater
);
ItemTouchHelperPlus
touchHelper
=
new
ItemTouchHelperPlus
(
getContext
(),
mDeckItemTouchHelper
);
touchHelper
.
setItemDragListener
(
this
);
touchHelper
.
setEnableClickDrag
(
Constants
.
DECK_SINGLE_PRESS_DRAG
);
touchHelper
.
attachToRecyclerView
(
mRecyclerView
);
// 添加RecyclerView的点击监听器
mRecyclerView
.
addOnItemTouchListener
(
new
RecyclerViewItemListener
(
mRecyclerView
,
this
));
// 初始化弹出菜单按钮及相关导航按钮点击事件
initBoomMenuButton
(
layoutView
.
findViewById
(
R
.
id
.
bmb
));
layoutView
.
findViewById
(
R
.
id
.
btn_nav_search
).
setOnClickListener
((
v
)
->
doMenu
(
R
.
id
.
action_search
));
layoutView
.
findViewById
(
R
.
id
.
btn_nav_list
).
setOnClickListener
((
v
)
->
doMenu
(
R
.
id
.
action_card_list
));
//只有当加载的是具有id的deck时才显示点赞按钮
// 点赞按钮逻辑:仅在当前加载的是有效卡组时可用
tv_add_1
=
layoutView
.
findViewById
(
R
.
id
.
tv_add_1
);
ll_click_like
=
layoutView
.
findViewById
(
R
.
id
.
ll_click_like
);
ll_click_like
.
setOnClickListener
(
v
->
{
...
...
@@ -232,7 +275,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
YGOUtil
.
showTextToast
(
"点赞失败"
);
}).
done
(
data
->
{
if
(
data
!=
null
&&
data
.
getMessage
()
!=
null
&&
data
.
getMessage
().
equals
(
"true"
))
{
// 显示点赞动画
// 显示点赞动画
效果
tv_add_1
.
setText
(
"+1"
);
ll_click_like
.
startAnimation
(
AnimationUtils
.
loadAnimation
(
getContext
(),
R
.
anim
.
fade_out
));
ll_click_like
.
setVisibility
(
View
.
GONE
);
...
...
@@ -245,13 +288,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
ll_click_like
.
setVisibility
(
View
.
GONE
);
}
});
// 卡组标题点击打开管理对话框
tv_deck
.
setOnClickListener
(
v
->
{
new
DeckManageDialog
(
this
).
show
(
getActivity
().
getSupportFragmentManager
(),
"pagerDialog"
);
});
// YGODeckDialogUtil.dialogDeckSelect(getActivity(), AppsSettings.get().getLastDeckPath(), this));
mContext
=
(
BaseActivity
)
getActivity
();
/** 自动同步 */
/**
* 自动同步服务器上的卡组信息(如果已登录)
*/
if
(
SharedPreferenceUtil
.
getServerToken
()
!=
null
)
{
VUiKit
.
defer
().
when
(()
->
{
try
{
...
...
@@ -268,17 +316,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
}
/**
* 外部调用fragment时,如果通过setArguments(mBundle)方法设置了ydk文件路径,则直接打开该ydk文件
* 预加载文件方法
* 当外部调用fragment时,如果通过setArguments(mBundle)方法设置了ydk文件路径,则直接打开该ydk文件
* 将mPreLoadFile设置为对应的File
*/
public
void
preLoadFile
()
{
String
preLoadFilePath
=
""
;
// 从参数中获取预加载文件路径
if
(
getArguments
()
!=
null
)
{
preLoadFilePath
=
getArguments
().
getString
(
"setDeck"
);
getArguments
().
clear
();
}
// 调用重载方法加载文件
preLoadFile
(
preLoadFilePath
);
}
...
...
@@ -291,7 +341,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
public
void
preLoadFile
(
String
preLoadFilePath
)
{
final
File
_file
;
//
打开指定卡组
//
打开指定卡组文件,如果路径有效则使用指定文件,否则使用最后访问的卡组文件
if
(!
TextUtils
.
isEmpty
(
preLoadFilePath
)
&&
(
mPreLoadFile
=
new
File
(
preLoadFilePath
)).
exists
())
{
//外面卡组
_file
=
mPreLoadFile
;
...
...
@@ -305,23 +355,36 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
_file
=
new
File
(
path
);
}
}
// 检查原始卡组目录是否存在且当前卡组目录文件数量较少时,启动权限获取活动
File
oriDeckFiles
=
new
File
(
ORI_DECK
);
File
deckFiles
=
new
File
(
AppsSettings
.
get
().
getDeckDir
());
if
(
oriDeckFiles
.
exists
()
&&
deckFiles
.
list
().
length
<=
1
)
{
mContext
.
startPermissionsActivity
();
}
// 初始化卡组数据
init
(
_file
);
}
/**
* 设置列表项点击监听器和滚动监听器
*
* 该方法主要完成以下功能:
* 1. 为卡片列表适配器设置点击和长按事件监听器
* 2. 为列表视图添加滚动监听器,用于控制图片加载框架的暂停和恢复
*/
protected
void
setListeners
()
{
// 设置列表项点击监听器,当用户点击列表项时触发onCardClick回调
mCardListAdapter
.
setOnItemClickListener
((
adapter
,
view
,
position
)
->
{
onCardClick
(
view
,
mCardListAdapter
.
getItem
(
position
),
position
);
});
// 设置列表项长按监听器,当用户长按列表项时触发onCardLongClick回调
mCardListAdapter
.
setOnItemLongClickListener
((
adapter
,
view
,
position
)
->
{
onCardLongClick
(
view
,
mCardListAdapter
.
getItem
(
position
),
position
);
return
true
;
});
// 添加滚动监听器,根据滚动状态控制Glide图片加载的暂停和恢复
mListView
.
addOnScrollListener
(
new
RecyclerView
.
OnScrollListener
()
{
@Override
public
void
onScrollStateChanged
(
@NonNull
RecyclerView
recyclerView
,
int
newState
)
{
...
...
@@ -329,9 +392,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
switch
(
newState
)
{
case
RecyclerView
.
SCROLL_STATE_IDLE
:
case
RecyclerView
.
SCROLL_STATE_SETTLING
:
// 列表停止滚动或正在减速时,恢复图片加载请求
GlideCompat
.
with
(
getContext
()).
resumeRequests
();
break
;
case
RecyclerView
.
SCROLL_STATE_DRAGGING
:
// 用户正在拖拽列表时,暂停图片加载请求以提升滑动流畅度
GlideCompat
.
with
(
getContext
()).
pauseRequests
();
break
;
}
...
...
@@ -387,21 +452,28 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
/**
* 在此处处理卡组中卡片的长按删除
/**
* 处理卡组中卡片的长按删除操作
* 当用户长按卡片时,根据设置决定是否显示删除确认对话框或直接删除
*
* @param pos
* @param pos
被长按的卡片在列表中的位置索引
*/
@Override
public
void
onDragLongPress
(
int
pos
)
{
// 检查位置索引有效性
if
(
pos
<
0
)
return
;
if
(
Constants
.
DEBUG
)
Log
.
d
(
TAG
,
"delete "
+
pos
);
// 根据设置决定删除方式:弹窗确认删除 或 直接显示删除头部视图
if
(
mSettings
.
isDialogDelete
())
{
// 获取要删除的卡组项
DeckItem
deckItem
=
mDeckAdapater
.
getItem
(
pos
);
if
(
deckItem
==
null
||
deckItem
.
getCardInfo
()
==
null
)
{
return
;
}
// 创建并显示删除确认对话框
DialogPlus
dialogPlus
=
new
DialogPlus
(
getContext
());
dialogPlus
.
setTitle
(
R
.
string
.
question
);
dialogPlus
.
setMessage
(
getString
(
R
.
string
.
delete_card
,
deckItem
.
getCardInfo
().
Name
));
...
...
@@ -412,6 +484,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
});
dialogPlus
.
show
();
}
else
{
// 直接显示删除头部视图
mDeckAdapater
.
showHeadView
();
}
}
...
...
@@ -427,10 +500,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
view
.
findViewById
(
R
.
id
.
cube2
).
startAnimation
(
shake
);
//给组件播放动画效果
}
/**
* 隐藏所有打开的抽屉菜单
*
* 该方法会检查左右两侧的抽屉是否处于打开状态,如果打开则将其关闭。
* 主要用于在特定场景下统一关闭所有抽屉菜单,确保界面的一致性。
*/
public
void
hideDrawers
()
{
// 关闭右侧抽屉(如果已打开)
if
(
mDrawerLayout
.
isDrawerOpen
(
Gravity
.
RIGHT
))
{
mDrawerLayout
.
closeDrawer
(
Gravity
.
RIGHT
);
}
// 关闭左侧抽屉(如果已打开)
if
(
mDrawerLayout
.
isDrawerOpen
(
Gravity
.
LEFT
))
{
mDrawerLayout
.
closeDrawer
(
Gravity
.
LEFT
);
}
...
...
@@ -459,22 +540,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
}
//region load deck
//从文件file中读取deck
/**
* 从指定文件中加载卡牌包数据
*
* @param file 包含卡牌数据的文件对象,如果文件不存在或为null则会设置空的卡牌包
*/
private
void
loadDeckFromFile
(
File
file
)
{
// 检查卡牌加载器是否打开以及文件是否存在,如果条件不满足则设置空卡牌包
if
(!
mCardLoader
.
isOpen
()
||
file
==
null
||
!
file
.
exists
())
{
setCurDeck
(
new
DeckInfo
(),
false
);
return
;
}
// 显示加载对话框
DialogPlus
dlg
=
DialogPlus
.
show
(
getContext
(),
null
,
getString
(
R
.
string
.
loading
));
// 异步加载卡牌包数据
VUiKit
.
defer
().
when
(()
->
{
// 双重检查卡牌加载器状态和文件存在性,确保数据加载安全
if
(
mCardLoader
.
isOpen
()
&&
file
.
exists
())
{
return
mDeckAdapater
.
read
(
mCardLoader
,
file
,
mCardLoader
.
getLimitList
());
}
else
{
return
new
DeckInfo
();
}
}).
done
((
rs
)
->
{
// 关闭加载对话框并设置当前卡牌包
dlg
.
dismiss
();
//setCurDeck(rs, file.getParent().equals(mSettings.getPackDeckDir()) || file.getParent().equals(mSettings.getCacheDeckDir()));
setCurDeck
(
rs
,
file
.
getParent
().
equals
(
mSettings
.
getPackDeckDir
()));
...
...
@@ -482,67 +573,98 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
//region init
/**
* 初始化函数,用于加载卡组数据和相关配置
*
* @param ydk 卡组文件,可以为null,如果为null则会尝试加载默认卡组文件
*/
public
void
init
(
@Nullable
File
ydk
)
{
// 显示加载对话框
DialogPlus
dlg
=
DialogPlus
.
show
(
mContext
,
null
,
getString
(
R
.
string
.
loading
));
VUiKit
.
defer
().
when
(()
->
{
// 加载数据管理器
DataManager
.
get
().
load
(
true
);
//默认第一个卡表
// 设置限制卡表列表,使用第一个可用的限制列表
if
(
activity
.
getmLimitManager
().
getCount
()
>
0
)
{
mCardLoader
.
setLimitList
(
activity
.
getmLimitManager
().
getTopLimit
());
}
// 处理卡组文件加载逻辑
File
file
=
ydk
;
if
(
file
==
null
||
!
file
.
exists
())
{
//
当默认卡组不存在的时候
//
当默认卡组不存在的时候,尝试获取其他可用的ydk文件
List
<
File
>
files
=
getYdkFiles
();
if
(
files
!=
null
&&
files
.
size
()
>
0
)
{
file
=
files
.
get
(
0
);
}
}
//EXTRA_DECK
// 如果没有找到有效的卡组文件,返回空的卡组信息
if
(
file
==
null
)
{
return
new
DeckInfo
();
}
Log
.
i
(
TAG
,
"load ydk "
+
file
);
// 读取卡组文件内容
if
(
mCardLoader
.
isOpen
()
&&
file
.
exists
())
{
return
mDeckAdapater
.
read
(
mCardLoader
,
file
,
mCardLoader
.
getLimitList
());
}
else
{
return
new
DeckInfo
();
}
}).
done
((
rs
)
->
{
// 初始化完成后的处理逻辑
isLoad
=
true
;
dlg
.
dismiss
();
mCardSearcher
.
initItems
();
initLimitListSpinners
(
mLimitSpinner
,
mCardLoader
.
getLimitList
());
//设置当前卡组
// 设置当前卡组显示
if
(
rs
.
source
!=
null
)
{
setCurDeck
(
rs
,
rs
.
source
.
getParent
().
equals
(
mSettings
.
getPackDeckDir
()));
}
else
{
setCurDeck
(
rs
,
false
);
}
//设置收藏夹
// 设置并显示收藏夹
mCardSearcher
.
showFavorites
(
false
);
});
}
/**
* 用户选中某个卡组后,更新当前界面,显示已选中的卡组。包括更新界面显示(tv_deck)、更新AppsSettings、通知DeckAdapter
* 设置当前选中的卡组并更新界面显示
* @param deckInfo 选中的卡组信息,如果为null则创建新的空卡组信息对象
* @param isPack 是否为卡包模式
*/
private
void
setCurDeck
(
DeckInfo
deckInfo
,
boolean
isPack
)
{
// 处理空卡组信息情况
if
(
deckInfo
==
null
)
{
deckInfo
=
new
DeckInfo
();
}
File
file
=
deckInfo
.
source
;
// 更新最后选择的卡组路径和界面显示名称
if
(
file
!=
null
&&
file
.
exists
())
{
String
name
=
IOUtils
.
tirmName
(
file
.
getName
(),
Constants
.
YDK_FILE_EX
);
mSettings
.
setLastDeckPath
(
file
.
getAbsolutePath
());
tv_deck
.
setText
(
name
);
}
// 通知适配器更新卡组数据和界面
mDeckAdapater
.
setDeck
(
deckInfo
,
isPack
);
mDeckAdapater
.
notifyDataSetChanged
();
}
/**
* 判断指定文件是否位于卡牌目录中
*
* @param file 要检查的文件对象
* @return 如果文件的父目录等于卡牌目录则返回true,否则返回false
*/
private
boolean
inDeckDir
(
File
file
)
{
// 获取卡牌目录的绝对路径
String
deck
=
new
File
(
AppsSettings
.
get
().
getDeckDir
()).
getAbsolutePath
();
// 比较文件父目录与卡牌目录是否相同
return
TextUtils
.
equals
(
deck
,
file
.
getParent
());
}
...
...
@@ -633,11 +755,24 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return
mDialog
!=
null
&&
mDialog
.
isShowing
();
}
/**
* 显示卡片详情对话框
*
* @param provider 卡片列表提供者,用于获取当前卡片的上下文数据
* @param cardInfo 要显示的卡片信息,如果为null则不执行任何操作
* @param pos 当前卡片在列表中的位置
*/
protected
void
showCardDialog
(
CardListProvider
provider
,
Card
cardInfo
,
int
pos
)
{
// 如果卡片信息为空,则不进行任何操作
if
(
cardInfo
!=
null
)
{
// 如果卡片已经显示,则直接返回
if
(
isShowCard
())
return
;
// 初始化卡片详情视图(如果尚未初始化)
if
(
mCardDetail
==
null
)
{
mCardDetail
=
new
CardDetail
((
BaseActivity
)
getActivity
(),
activity
.
getImageLoader
(),
activity
.
getStringManager
());
// 设置卡片点击监听器,处理各种卡片交互事件
mCardDetail
.
setOnCardClickListener
(
new
CardDetail
.
OnDeckManagerCardClickListener
()
{
@Override
public
void
onOpenUrl
(
Card
cardInfo
)
{
...
...
@@ -675,18 +810,26 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
addMainCard
(
cardInfo
);
}
});
// 设置回调函数,当卡片收藏状态改变时触发
mCardDetail
.
setCallBack
((
card
,
favorite
)
->
{
if
(
mCardSearcher
.
isShowFavorite
())
{
mCardSearcher
.
showFavorites
(
false
);
}
});
}
// 显示添加按钮
mCardDetail
.
showAdd
();
// 初始化对话框(如果尚未初始化)
if
(
mDialog
==
null
)
{
mDialog
=
new
DialogPlus
(
getContext
());
mDialog
.
setView
(
mCardDetail
.
getView
());
mDialog
.
hideButton
();
mDialog
.
hideTitleBar
();
// 设置手势监听器,支持左右滑动切换卡片
mDialog
.
setOnGestureListener
(
new
AOnGestureListener
()
{
@Override
public
boolean
onFling
(
MotionEvent
e1
,
MotionEvent
e2
,
float
velocityX
,
float
velocityY
)
{
...
...
@@ -701,13 +844,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
});
}
// 如果对话框未显示,则显示它
if
(!
mDialog
.
isShowing
())
{
mDialog
.
show
();
}
// 绑定卡片数据到详情视图
mCardDetail
.
bind
(
cardInfo
,
pos
,
provider
);
}
}
private
void
showSearchKeyWord
(
String
keyword
)
{
//使用此方法,可以适用关键词查询逻辑,让完全符合关键词的卡名置顶显示,并同时搜索字段和效果文本
CardSearchInfo
searchInfo
=
new
CardSearchInfo
.
Builder
().
keyword
(
keyword
).
types
(
new
long
[]{}).
build
();
//构建CardSearchInfo时type不能为null
mCardLoader
.
search
(
searchInfo
);
...
...
@@ -830,11 +978,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
/**
* 处理菜单项点击事件,根据传入的菜单ID执行对应的操作。
*
* @param menuId 菜单项ID,用于区分不同的菜单操作
* @return 如果处理了该菜单项则返回true,否则返回false
*/
public
boolean
doMenu
(
int
menuId
)
{
DialogPlus
builder
=
new
DialogPlus
(
getContext
());
switch
(
menuId
)
{
case
R
.
id
.
action_deck_backup_n_restore
:
// 启动权限请求页面
mContext
.
startPermissionsActivity
();
// 显示备份与恢复卡组的选择对话框
builder
.
setTitle
(
R
.
string
.
question
);
builder
.
setMessage
(
R
.
string
.
deck_explain
);
builder
.
setMessageGravity
(
Gravity
.
CENTER_HORIZONTAL
);
...
...
@@ -842,31 +998,34 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
builder
.
setRightButtonText
(
R
.
string
.
deck_back_up
);
builder
.
setRightButtonListener
((
dialog
,
which
)
->
{
dialog
.
dismiss
();
doBackUpDeck
();
doBackUpDeck
();
// 执行卡组备份
});
builder
.
setLeftButtonListener
((
dialog
,
which
)
->
{
dialog
.
dismiss
();
doRestoreDeck
();
doRestoreDeck
();
// 执行卡组恢复
});
builder
.
show
();
break
;
case
R
.
id
.
action_search
:
//
弹
条件对话框
//
弹出搜索
条件对话框
showSearch
(
true
);
break
;
case
R
.
id
.
action_card_list
:
// 显示卡牌列表结果
showResult
(
true
);
break
;
case
R
.
id
.
action_share_deck
:
// 分享当前卡组
if
(
mDeckAdapater
.
getYdkFile
()
==
null
)
{
YGOUtil
.
showTextToast
(
R
.
string
.
unable_to_edit_empty_deck
);
return
true
;
}
shareDeck
();
break
;
case
R
.
id
.
action_save
:
//如果是通过“预加载”打开ydk,则将ydk保存到
if
(
mPreLoadFile
!=
null
&&
mPreLoadFile
==
mDeckAdapater
.
getYdkFile
())
{
//代表通过预加载功能打开的ydk
//需要保存到deck文件夹
case
R
.
id
.
action_save
:
// 保存卡组逻辑:判断是否为预加载文件并进行相应处理
if
(
mPreLoadFile
!=
null
&&
mPreLoadFile
==
mDeckAdapater
.
getYdkFile
())
{
// 预加载文件需要保存到deck文件夹
inputDeckName
(
mPreLoadFile
,
null
,
true
);
}
else
{
if
(
mDeckAdapater
.
getYdkFile
()
==
null
)
{
...
...
@@ -876,12 +1035,13 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
TextUtils
.
equals
(
mDeckAdapater
.
getYdkFile
().
getParent
(),
mSettings
.
getPackDeckDir
()))
{
YGOUtil
.
showTextToast
(
R
.
string
.
donot_edit_Deck
);
}
else
{
save
(
mDeckAdapater
.
getYdkFile
());
save
(
mDeckAdapater
.
getYdkFile
());
// 保存卡组文件
}
}
}
break
;
case
R
.
id
.
action_rename
:
// 重命名卡组
if
(
mDeckAdapater
.
getYdkFile
()
==
null
)
{
YGOUtil
.
showTextToast
(
R
.
string
.
unable_to_edit_empty_deck
);
return
true
;
...
...
@@ -894,10 +1054,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
break
;
case
R
.
id
.
action_deck_new
:
// 新建卡组
createDeck
(
null
);
break
;
case
R
.
id
.
action_clear_deck
:
{
// 清空当前卡组内容
builder
.
setTitle
(
R
.
string
.
question
);
builder
.
setMessage
(
R
.
string
.
question_clear_deck
);
builder
.
setMessageGravity
(
Gravity
.
CENTER_HORIZONTAL
);
...
...
@@ -910,6 +1071,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
break
;
case
R
.
id
.
action_delete_deck
:
{
// 删除当前卡组
if
(
mDeckAdapater
.
getYdkFile
()
==
null
)
{
YGOUtil
.
showTextToast
(
R
.
string
.
unable_to_edit_empty_deck
);
return
true
;
...
...
@@ -924,12 +1086,10 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
builder
.
setLeftButtonListener
((
dlg
,
rs
)
->
{
if
(
mDeckAdapater
.
getYdkFile
()
!=
null
)
{
FileUtils
.
deleteFile
(
mDeckAdapater
.
getYdkFile
());
//统一调用批量删除在线卡组(这里只有1个)
//
统一调用批量删除在线卡组(这里只有1个)
List
<
DeckFile
>
deckFileList
=
new
ArrayList
<>();
deckFileList
.
add
(
new
DeckFile
(
mDeckAdapater
.
getYdkFile
()));
onDeckDel
(
deckFileList
);
YGOUtil
.
showTextToast
(
R
.
string
.
done
);
dlg
.
dismiss
();
File
file
=
getFirstYdk
();
...
...
@@ -941,10 +1101,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
break
;
case
R
.
id
.
action_unsort
:
//
打乱
//
打乱卡组顺序
mDeckAdapater
.
unSort
();
break
;
case
R
.
id
.
action_sort
:
// 对卡组进行排序
mDeckAdapater
.
sort
();
break
;
default
:
...
...
@@ -953,22 +1114,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return
true
;
}
/**
* 创建新的卡组文件
* @param savePath 新卡组文件的保存路径
*/
private
void
createDeck
(
String
savePath
)
{
final
File
old
=
mDeckAdapater
.
getYdkFile
();
DialogPlus
builder
=
new
DialogPlus
(
getContext
());
builder
.
setTitle
(
R
.
string
.
question
);
builder
.
setMessage
(
R
.
string
.
question_keep_cur_deck
);
builder
.
setMessageGravity
(
Gravity
.
CENTER_HORIZONTAL
);
// 设置左按钮监听器 - 选择保留当前卡组
builder
.
setLeftButtonListener
((
dlg
,
rs
)
->
{
dlg
.
dismiss
();
//复制当前卡组
inputDeckName
(
old
,
savePath
,
true
);
});
// 设置右按钮监听器 - 不保留当前卡组
builder
.
setRightButtonListener
((
dlg
,
rs
)
->
{
dlg
.
dismiss
();
setCurDeck
(
null
,
false
);
inputDeckName
(
null
,
savePath
,
true
);
});
// 设置关闭监听器 - 当对话框关闭时的处理
builder
.
setOnCloseLinster
((
dlg
)
->
{
dlg
.
dismiss
();
setCurDeck
(
null
,
false
);
...
...
@@ -1110,12 +1281,17 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return
null
;
}
//从存储卡组的文件夹中获取所有名字以.ydk结尾的文件,并将mPreLoadFile也加入到返回结果中
/**
* 从存储卡组的文件夹中获取所有名字以.ydk结尾的文件,并将mPreLoadFile也加入到返回结果中
* @return 包含所有.ydk文件的文件列表,如果目录不存在或无法访问则返回null
*/
private
List
<
File
>
getYdkFiles
()
{
// 获取卡组文件夹路径并列出所有.ydk文件
File
dir
=
new
File
(
mSettings
.
getResourcePath
(),
Constants
.
CORE_DECK_PATH
);
File
[]
files
=
dir
.
listFiles
((
file
,
s
)
->
s
.
toLowerCase
(
Locale
.
US
).
endsWith
(
Constants
.
YDK_FILE_EX
));
if
(
files
!=
null
)
{
List
<
File
>
list
=
new
ArrayList
<>(
Arrays
.
asList
(
files
));
// 检查并添加预加载文件(如果存在且不在当前列表中)
if
(
mPreLoadFile
!=
null
&&
mPreLoadFile
.
exists
())
{
boolean
hasCur
=
false
;
for
(
File
f
:
list
)
{
...
...
@@ -1133,12 +1309,21 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return
null
;
}
/**
* 初始化限制列表下拉框
* @param spinner 要初始化的Spinner控件
* @param cur 当前选中的限制列表对象,用于设置默认选中项
*/
private
void
initLimitListSpinners
(
Spinner
spinner
,
LimitList
cur
)
{
List
<
SimpleSpinnerItem
>
items
=
new
ArrayList
<>();
List
<
String
>
limitLists
=
activity
.
getmLimitManager
().
getLimitNames
();
int
index
=
-
1
;
int
count
=
activity
.
getmLimitManager
().
getCount
();
// 添加默认选项
items
.
add
(
new
SimpleSpinnerItem
(
0
,
getString
(
R
.
string
.
label_limitlist
)));
// 遍历所有限制列表,构建下拉项并查找当前选中项的索引
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
int
j
=
i
+
1
;
String
name
=
limitLists
.
get
(
i
);
...
...
@@ -1147,13 +1332,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
index
=
j
;
}
}
// 设置适配器
SimpleSpinnerAdapter
adapter
=
new
SimpleSpinnerAdapter
(
getContext
());
adapter
.
setColor
(
Color
.
WHITE
);
adapter
.
set
(
items
);
spinner
.
setAdapter
(
adapter
);
// 设置默认选中项
if
(
index
>=
0
)
{
spinner
.
setSelection
(
index
);
}
// 设置选择监听器
spinner
.
setOnItemSelectedListener
(
new
AdapterView
.
OnItemSelectedListener
()
{
@Override
public
void
onItemSelected
(
AdapterView
<?>
parent
,
View
view
,
int
position
,
long
id
)
{
...
...
@@ -1167,10 +1358,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
});
}
/**
* 设置限制列表并更新相关适配器
* @param limitList 限制列表对象,如果为null则直接返回
*/
private
void
setLimitList
(
LimitList
limitList
)
{
if
(
limitList
==
null
)
return
;
// 检查新的限制列表是否与当前列表相同
LimitList
last
=
mDeckAdapater
.
getLimitList
();
boolean
nochanged
=
last
!=
null
&&
TextUtils
.
equals
(
last
.
getName
(),
limitList
.
getName
());
// 如果限制列表发生变化,则更新牌组适配器并通知数据变更
if
(!
nochanged
)
{
mDeckAdapater
.
setLimitList
(
limitList
);
getActivity
().
runOnUiThread
(()
->
{
...
...
@@ -1179,6 +1378,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
mDeckAdapater
.
notifyItemRangeChanged
(
DeckItem
.
SideStart
,
DeckItem
.
SideEnd
);
});
}
// 更新卡片列表适配器的限制列表并通知数据变更
mCardListAdapter
.
setLimitList
(
limitList
);
getActivity
().
runOnUiThread
(()
->
mCardListAdapter
.
notifyDataSetChanged
());
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment