对于基于ICS的应用程序,我创建了一个ListFragment,后者又使用BaseAdapter实现。我已启用MultiChoiceModeListener()以显示上下文操作栏。但这里的问题是每当我检查CheckBox或长按Label(两者都在BaseAdapter中的View集中)时,根本不会调用MultiChoiceModeListener实现。任何形式的帮助都非常受欢迎,因为我在尝试了许多选项后完全陷入困境!!!
public class ActivitiesFragment extends ListFragment {
public void onActivityCreated(Bundle savedInstanceState) {
Log.d(TAG, "Entering onActivityCreated()");
super.onActivityCreated(savedInstanceState);
this.setAdapter();
this.setHasOptionsMenu(true);
}
private void setAdapter() {
HashMap<String, String> activities = DBAdapter
.getInstance(this.context).getActivities();
setListAdapter(new ActivitiesList(Util.sortByComparator(activities)));
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiSelectionListener());
}
private class ActivitiesList extends BaseAdapter {
// Other functions declared
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ActivityView view = null;
String activityName = this.activityList.get(position);
String colour = this.activities.get(activityName);
if (convertView == null) {
// ActivityView is a LinearLayout with CheckBox, Label and a Button
view = new ActivityView(context, activityName, colour);
} else {
view = (ActivityView) convertView;
view.setActivityName(activityName);
}
return view;
}
}
private class MultiSelectionListener implements MultiChoiceModeListener {
// implementation
}
}
答案 0 :(得分:0)
您需要使用ActionMode.Callback
。 You should read through these docs,它实际上非常简单易用。
答案 1 :(得分:0)
您应该检查列表中是否有任何onLongClickListener。 我和你有同样的问题,我意识到我的ViewHolder调用了长按,因此从未调用过MultiChoiceListener。
答案 2 :(得分:0)
我遇到了类似的问题,即使ListView
中列出的项目有CheckBox
,检查它们也不会调用MultiChoiceModeListener
。通过一些研究并查看名为CustomChoiceList
的示例(您可以从File
- &gt; Import Sample
在Android Studio中导入),我发现绑定View
s ListView
必须实现接口Checkable
。直接引用CustomChoiceList示例
当ListView设置了choiceMode时,它将允许用户“选择”一个或多个项目。该框架提供默认列表项布局,显示标准单选按钮或单行文本旁边的复选框:
android.R.layout.simple_list_item_single_choice和android.R.layout.simple_list_item_multiple_choice。
在某些情况下,您可能希望自定义此布局。执行此操作时,根视图必须实现Checkable接口。
我知道docs可能更清楚一点需要实现Checkable接口。虽然在最后一段中说它
当用户选中该复选框时,您可以调用上下文操作 通过将相应的列表项设置为已检查状态的模式 setItemChecked()。
您不必担心ActionMode.Callback
,因为它由MultipleChoiceModeListener
答案 3 :(得分:-3)
您的MultiChoiceModeListener实现中可能存在错误。它对我来说很好。