jmh*_*let 6 android android-listview android-contextmenu
我在多选模式下为上下文菜单注册了listview:
private void initListViewForContextMenu(){
log.d("FilesFragment", "initListViewForContextMenu()");
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { ...
Run Code Online (Sandbox Code Playgroud)
问题是我的视图中的所有项目都不应该是可选择的,只有那些显示特殊图标的项目才可供选择.我不知道如何实现这个,我定义了一个OnItemLongClickListener:
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapter, View view, int position, long id) {
Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick at pos " + position);
PfmDocument doc = (PfmDocument)adapter.getItemAtPosition(position);
if (doc.isOnBasket()){
Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick detected in basket");
ListView lv = (ListView) adapter;
lv.setItemChecked(position, false);
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
但这个监听器从未被调用过.
我还尝试OnLongClickListener在适配器中设置一个行视图,但即使关闭上下文菜单(不在选择模式下),也会禁用正常单击.
if (doc.isOnBasket()){
rowView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false; // do nothing, already in basket
}
});
Run Code Online (Sandbox Code Playgroud)
//}
Jel*_*lle 10
如果你深入了解android源代码(AbsListview),你会看到将choiceMode设置为MULTIPLE_MODAL将接管longpress .这就是为什么你的听众永远不会被召唤.
您可以通过isEnabled(position)在适配器中返回true/false来决定是否可以单击视图.
下面的代码仅解决了在动作模式期间已添加到购物篮中的商品无法点击的部分.
但是,如果它不是有效项目,则取消选中长按项目应该相当容易.
希望这有帮助!
在MultiChoiceModeListener中:
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{
this.adapter.setActionMode(true);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode)
{
this.adapter.setActionMode(false);
}
Run Code Online (Sandbox Code Playgroud)
然后在您的自定义适配器中:
public abstract class AbstractCollectionAdapter extends AbstractCursorAdapter
{
private boolean isActionMode;
public AbstractCollectionAdapter(Context context)
{
super(context);
this.isActionMode = false;
}
@Override
public boolean isEnabled(int position)
{
if (this.isActionMode)
{
final Object item = this.getItem(position);
if (!item.isInBasket())
{
//only enable items that are not inside the basket
return true;
}
//all other items are disabled during actionmode
return false;
}
//no actionmode = everything enabled
return true;
}
public void setActionMode(boolean isActionMode)
{
this.isActionMode = isActionMode;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7020 次 |
| 最近记录: |