- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
AdapterView不提供MultiChoiceModeListener,如何用ActionBarSherlock在AdapterView上实现多选?
这就是它的样子
你怎么能做到这一点?
最佳答案
这就是我所做的。
编辑:一年多过去了,因为我发现上一个答案有很多无用的代码(呜呜),CAB 的事情可以用更少的努力和更清晰的代码来实现,所以我花了一些时间更新它
LibraryFragment ListView 应该定义为选择模式“none”
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="none"/>
列表项应具有 ?attr/activatedBackgroundIndicator 前景,以便在 list.setItemChecked(pos, true) 上自动绘制突出显示的半透明叠加层
list_item_library.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="?attr/activatedBackgroundIndicator"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
....
ListFragment
import android.support.v4.app.DialogFragment;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
public final class LibraryFragment
extends SherlockListFragment
{
private MyListAdapter adapter;
private ListView list;
// if ActoinMode is null - assume we are in normal mode
private ActionMode actionMode;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragment_library, null);
this.list = (ListView) v.findViewById(android.R.id.list);
this.initListView();
return v;
}
@Override
public void onPause()
{
super.onPause();
if (this.actionMode != null) {
this.actionMode.finish();
}
}
@Override
public void onResume() {
super.onResume();
updateData();
}
// update ListView
protected void updateData()
{
if (adapter == null) {
return;
}
adapter.clear();
// my kinda stuff :)
File[] items = scan();
if (items != null) {
adapter.updateData(items);
if (actionMode != null) {
actionMode.invalidate();
}
}
// if empty - finish action mode.
if (actionMode != null && (files == null || files.length == 0)) {
actionMode.finish();
}
}
private void initListView()
{
this.adapter = new MyAdapter(getActivity());
this.list.setAdapter(adapter);
this.list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> arg0,
View arg1, int arg2, long arg3)
{
if (actionMode != null) {
// if already in action mode - do nothing
return false;
}
// set checked selected item and enter multi selection mode
list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
list.setItemChecked(arg2, true);
getSherlockActivity().startActionMode(
new ActionModeCallback());
return true;
}
});
this.list.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
if (actionMode != null) {
// the items are auomatically "checked" becaise we've set AbsListView.CHOICE_MODE_MULTIPLE before
// starting action mode, so the only thing we have to care about is invalidating the actionmode
actionMode.invalidate(); //invalidate title and menus.
} else {
// do whatever you should on item click
}
}
});
}
// all our ActionMode stuff here :)
private final class ActionModeCallback
implements ActionMode.Callback
{
// " selected" string resource to update ActionBar text
private String selected = getActivity().getString(
R.string.library_selected);
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{
actionMode = mode;
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu)
{
// remove previous items
menu.clear();
final int checked = list.getCheckedItemCount();
// update title with number of checked items
mode.setTitle(checked + this.selected);
switch (checked) {
case 0:
// if nothing checked - exit action mode
mode.finish();
return true;
case 1:
// all items - rename + delete
getSherlockActivity().getSupportMenuInflater().inflate(
R.menu.library_context, menu);
return true;
default:
getSherlockActivity().getSupportMenuInflater().inflate(
R.menu.library_context, menu);
// remove rename option - because we have more than one selected
menu.removeItem(R.id.library_context_rename);
return true;
}
}
@Override
public boolean onActionItemClicked(ActionMode mode,
com.actionbarsherlock.view.MenuItem item)
{
SparseBooleanArray checked;
switch (item.getItemId()) {
case R.id.library_context_rename:
// the rename action is present only when only one item is selected.
// so when the first checked item found, show the dialog and break
checked = list.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
final int index = checked.keyAt(i);
if (checked.get(index)) {
final DialogFragment d = RenameDialog.instantiate(adapter.getItem(index).getFile(), LibraryFragment.this);
d.show(getActivity().getSupportFragmentManager(), "dialog");
break;
}
}
return true;
case R.id.library_context_delete:
// delete every checked item
checked = list.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
final int index = checked.keyAt(i);
if (checked.get(index)) {
adapter.getItem(index).getFile().delete();
}
}
updateData();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode)
{
list.clearChoices();
//workaround for some items not being unchecked.
//see http://stackoverflow.com/a/10542628/1366471
for (int i = 0; i < list.getChildCount(); i++) {
(list.getChildAt(i).getBackground()).setState(new int[] { 0 });
}
list.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
actionMode = null;
}
}
关于android - 如何在 ActionBarSherlock 中实现多选和上下文 ActionMode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14737519/
我想在 ActionMode 中添加一个下拉菜单,它看起来像 Android 官方 Gallery 应用程序中的下拉菜单,它允许您“选择所有”或“取消选择所有”图像。如下图所示: 我发现的唯一方法是通
我有一个列表 Activity ,用户可以在其中执行打开操作模式 A和 B .用户还可以打开操作模式 A然后B在它上面。 问题是当 Action 模式A显示并且操作模式 B 显示在其顶部,A当 B 时
我正在学习教程 11. Exercise: Using the contextual action mode 但是我有这个错误: mActionMode = Display.this.startAct
我正在使用“AppCompact”并实现“ActionMode.Callback”,我看到了 2 个具有相同覆盖方法的不同“ActionMode”。 “android.view.ActionMode”
我使用 startSupportActionMode(...) 在我的应用中启动 acion 模式。但是当我点击智能手机上的后退按钮时,操作模式被取消。 我发现了这个解决方案,但它对我不起作用。第二个
我在 ListView 中使用操作模式进行多选。我遇到的问题是,在模拟器上测试时,我指定为隐藏在我的操作模式菜单中的图标永远不会隐藏在溢出菜单中,尽管在预览中它是。我在这里使用 AppCompat 主
目前,操作模式工具栏显示在工具栏上方,将整个布局向下移动,我希望它显示在我当前工具栏的顶部。我尝试了 this post 中的所有解决方案和 this one : 我尝试使用带或不带 android:
在我的 Activity 中,我使用带有微调器而不是标题(在 xml 中定义)的 Toolbar(来自 appcompat)。该 Activity 不是 ActionBarActivity,因此我不将
我正在使用新的 android 支持库 21.0.2,当我调用 ActionMode 进行文本选择时,我得到了这个。 似乎标题 TextView 背景是透明的。 重新定义 ActionMode 的 t
我有启动 Action 模式的列表 fragment 。我正在使用 actionbarsherlock。但是当方向改变时,或者当我开始新的 Activity 时,上下文操作栏就会消失。有什么方法可以恢
我们如何更改 ActionMode 的布局或背景?有方法actionMode.getCustomView();但总是返回 null 。有什么建议吗? 最佳答案 您可以通过带有此属性的 styles.x
哎呀。当我将我的应用程序升级到 L 时,我用工具栏替换了 ActionBars,现在每当我启动 ActionMode 时,它都会下推所有内容。 (我想这是因为再次显示 ActionBar 是为了显
除了传统的 android 之外,我正在尝试将 android.view.ActionMode 与新的 android.support.v7.widget.Toolbar 一起使用.app.Actio
我为 ActionMode 编写了一个自定义菜单,并将其作为文本选择中的自定义 ActionMode 传递给 TextView.setCustomSelectionActionModeCallback
我正在使用 Android 的新小部件 Toolbar,我想更改它的 ActionMode 的背景和文本颜色(第一个奇怪的事情:ActionMode 不会使用默认的原色,它应该是默认行为...)。 我
我有一个 ActionMode 的实现来显示多个在 RecyclerView 中选择项目。 我想知道什么时候点击 actionMode 中的后退按钮以相应地重置 recyclerView 但是在实现
几天来我一直在尝试寻找 ActionMode 内存泄漏的根源,但没有成功。我有一个包含多个 fragment 的 Activity ,当我离开具有 ActionMode 的 fragment (同时自
有没有办法在不更改“正常”ActionBar 图标的情况下更改 ActionMode 溢出图标? 最佳答案 I still need to figure out how to only change
我有以下 Activity 布局:
我有一项新支持工具栏和抽屉导航的 Activity 。工具栏与内容相关,例如元素 list 。可以选择多个项目 - 然后显示 ActionMode(上下文操作栏)。然而系统的ActionMode位置、
我是一名优秀的程序员,十分优秀!