Android 在为特定视图使用上下文操作栏时,无法解析方法startActionMode()
我一直在尝试使用复选框单击上的上下文操作栏从列表视图中删除多行。。。listview在每行中都有一个复选框和一个textview。在适配器类中,我调用startActionMode(),如下所示:Android 在为特定视图使用上下文操作栏时,无法解析方法startActionMode(),android,listview,contextual-action-bar,actionmode,Android,Listview,Contextual Action Bar,Actionmode,我一直在尝试使用复选框单击上的上下文操作栏从列表视图中删除多行。。。listview在每行中都有一个复选框和一个textview。在适配器类中,我调用startActionMode(),如下所示: **@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; View view=convertView;
**@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
View view=convertView;
Log.v("ConvertView", String.valueOf(position));
final ToPayModel state = toPayList.get(position);
if (convertView == null)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.to_pay_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tvToPay);
holder.check = (CheckBox) convertView.findViewById(R.id.toPaycheck);
convertView.setTag(holder);
//holder.name.setOnCheckedChangeListener();
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.check.setOnClickListener( new View.OnClickListener()
{
public void onClick(View v)
{
CheckBox cb = (CheckBox) v;
ToPayModel toPayModel = (ToPayModel) cb.getTag();
Toast.makeText(context, "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(),
Toast.LENGTH_LONG).show();
toPayModel.setCheck(cb.isChecked());
if(state.isCheck()){
mActionMode=context.startActionMode(new ActionBarCallback());
}
else{
mActionMode.finish();
}
}
});
//holder.code.setText(" (" + state.getCode() + ")");
holder.name.setText(state.getName());
holder.check.setTextColor(Color.BLACK);
holder.check.setChecked(state.isCheck());
holder.check.setTag(state);
return convertView;
}
public static final class ActionBarCallback implements ActionMode.Callback{
public ActionBarCallback(){
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.contextual_menu,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Checkbox Selected");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()){
case R.id.delete_item:
// removeSelection();
return true;
default: return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mode.finish();
}
}**
mActionMode=((Activity)context).startActionMode(new ActionBarCallback());
适配器类扩展了BaseAdapter
public class ToPayListAdapter extends BaseAdapter {
static Context context;
LayoutInflater inflater;
ActionMode mActionMode=null;
public ArrayList<ToPayModel> toPayList;
public ToPayListAdapter(Context context,ArrayList<ToPayModel> toPayList){
this.context=context;
this.toPayList=toPayList;
}
public类ToPayListAdapter扩展了BaseAdapter{
静态语境;
充气机;
ActionMode mActionMode=null;
公共ArrayList toPayList;
公共ToPayListAdapter(上下文上下文,ArrayList toPayList){
this.context=context;
this.toPayList=toPayList;
}
但问题是,调用startActionMode()时出现了一个错误。它表示无法解析该方法。是否因为我正在从getView方法中调用…我无能为力…任何响应都将不胜感激。请提前感谢。该方法
startActionMode
是为活动定义的,但不是为上下文定义的(请参阅)
在第一段代码中,如果要将活动
作为上下文传递,可以将其强制转换为活动
,如下所示:
**@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
View view=convertView;
Log.v("ConvertView", String.valueOf(position));
final ToPayModel state = toPayList.get(position);
if (convertView == null)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.to_pay_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tvToPay);
holder.check = (CheckBox) convertView.findViewById(R.id.toPaycheck);
convertView.setTag(holder);
//holder.name.setOnCheckedChangeListener();
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.check.setOnClickListener( new View.OnClickListener()
{
public void onClick(View v)
{
CheckBox cb = (CheckBox) v;
ToPayModel toPayModel = (ToPayModel) cb.getTag();
Toast.makeText(context, "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(),
Toast.LENGTH_LONG).show();
toPayModel.setCheck(cb.isChecked());
if(state.isCheck()){
mActionMode=context.startActionMode(new ActionBarCallback());
}
else{
mActionMode.finish();
}
}
});
//holder.code.setText(" (" + state.getCode() + ")");
holder.name.setText(state.getName());
holder.check.setTextColor(Color.BLACK);
holder.check.setChecked(state.isCheck());
holder.check.setTag(state);
return convertView;
}
public static final class ActionBarCallback implements ActionMode.Callback{
public ActionBarCallback(){
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.contextual_menu,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Checkbox Selected");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()){
case R.id.delete_item:
// removeSelection();
return true;
default: return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mode.finish();
}
}**
mActionMode=((Activity)context).startActionMode(new ActionBarCallback());
或更改声明
Context context;
致:
从评论中编辑:
如果要从片段中的视图启动ActionMode.Callback
。OnClickListener()
,则可以检索当前与使用getActivity()
关联的活动
:
方法startActionMode
是为活动定义的,但没有为上下文定义(请参阅)
在第一段代码中,如果要将活动
作为上下文传递,可以将其强制转换为活动
,如下所示:
**@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
View view=convertView;
Log.v("ConvertView", String.valueOf(position));
final ToPayModel state = toPayList.get(position);
if (convertView == null)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.to_pay_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tvToPay);
holder.check = (CheckBox) convertView.findViewById(R.id.toPaycheck);
convertView.setTag(holder);
//holder.name.setOnCheckedChangeListener();
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.check.setOnClickListener( new View.OnClickListener()
{
public void onClick(View v)
{
CheckBox cb = (CheckBox) v;
ToPayModel toPayModel = (ToPayModel) cb.getTag();
Toast.makeText(context, "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(),
Toast.LENGTH_LONG).show();
toPayModel.setCheck(cb.isChecked());
if(state.isCheck()){
mActionMode=context.startActionMode(new ActionBarCallback());
}
else{
mActionMode.finish();
}
}
});
//holder.code.setText(" (" + state.getCode() + ")");
holder.name.setText(state.getName());
holder.check.setTextColor(Color.BLACK);
holder.check.setChecked(state.isCheck());
holder.check.setTag(state);
return convertView;
}
public static final class ActionBarCallback implements ActionMode.Callback{
public ActionBarCallback(){
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.contextual_menu,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Checkbox Selected");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()){
case R.id.delete_item:
// removeSelection();
return true;
default: return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mode.finish();
}
}**
mActionMode=((Activity)context).startActionMode(new ActionBarCallback());
或更改声明
Context context;
致:
从评论中编辑:
如果要从片段中的视图启动ActionMode.Callback
。OnClickListener()
,则可以检索当前与使用getActivity()
关联的活动
:
感谢您的回复。实际上我正在使用的类扩展了Fragment…那么使用((活动)上下文)也可以。startActionMode(新的……)工作吗?如果您的类扩展了Fragment
,那么您就可以执行YourFragmentClass。this.getActivity().startActionMode(…)
@antonio Nice solution.我有一个RecyclerView列表,在启动上下文操作栏时遇到问题。我非常感谢您在这个问题上提供的任何帮助或见解,这里:感谢您的回复..实际上我使用的类扩展了片段..使用((活动)上下文也会有问题。startActionMode(新…)工作?如果您的类扩展了Fragment
,那么您可以执行您的FragmentClass。这个.getActivity().startActionMode(…);
@antonio是一个很好的解决方案。我有一个RecyclerView列表,启动上下文操作栏时遇到问题。我非常感谢您在这个问题上提供的任何帮助或见解,这里: