CustomListView适配器中的ActionMode(ActionBarSherlock)

CustomListView适配器中的ActionMode(ActionBarSherlock),listview,actionbarsherlock,android-actionbar,Listview,Actionbarsherlock,Android Actionbar,我的项目包含一个使用customlistview适配器的自定义listview。每一行都有一个复选框——如果勾选了任何复选框,我希望显示一个上下文操作栏(actionMode)。但是我完全不知道如何在CustomListViewAdapter中实现动作模式 我读的每一篇教程都是关于将actionMode实现到普通的MainActivity中,但没有人将其实现到customlistview适配器中。那不可能吗 PS:我正在使用ActionBarSherlock库 实际上,我想创建一个listvie

我的项目包含一个使用customlistview适配器的自定义listview。每一行都有一个复选框——如果勾选了任何复选框,我希望显示一个上下文操作栏(actionMode)。但是我完全不知道如何在CustomListViewAdapter中实现动作模式

我读的每一篇教程都是关于将actionMode实现到普通的MainActivity中,但没有人将其实现到customlistview适配器中。那不可能吗

PS:我正在使用ActionBarSherlock库

实际上,我想创建一个listview,它通常用于创建文件浏览器。如果勾选项目的复选框,则会显示actionmode并允许您选择选项(下载、删除、移动等)

这是我的代码:

MainActivity.java

public class MainActivity extends Activity {
    private ListView listview;
    private Button button;

    private List<Item> itemList;
    private CustomListViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        listview = (ListView) findViewById(R.id.listView1);
        button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(listener);
        listview.setOnItemClickListener(itemListener);

        itemList = new ArrayList<Item>();

        for(int i=1; i <= 20; i++) {
            Item item = new Item(R.drawable.ic_launcher, "Line " + String.valueOf(i), false);
            itemList.add(item);
        }

        adapter = new CustomListViewAdapter(this, R.layout.row, itemList);
        listview.setAdapter(adapter);
    }

    private OnClickListener listener = new OnClickListener() {
        @Override
        public void onClick(View view) {
            ArrayList<String> checkedList = new ArrayList<String>();

            for(int i=0; i < itemList.size(); i++) {
                Item item = adapter.getItem(i);

                if(item.getChecked() == true) {
                    checkedList.add(String.valueOf(item.getFile()));
                }
            }

            String output = "";
            for(int i=0; i < checkedList.size(); i++) {
                output += checkedList.get(i) + "\n";
            }

            if(!output.equals("")) {
                Toast.makeText(MainActivity.this, output, Toast.LENGTH_SHORT).show();
            }
        }
    };

    private OnItemClickListener itemListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Item item = adapter.getItem(position);
            Toast.makeText(MainActivity.this, item.getFile(), Toast.LENGTH_SHORT).show();
        }
    };
}
public class Item {
    private int imageID;
    private String file;
    private boolean checked;

    public Item() {

    }

    public Item(int imageID) {
        this.imageID = imageID;
    }

    public Item(int imageID, String file) {
        this.imageID = imageID;
        this.file = file;
    }

    public Item(int imageID, String file, boolean checked) {
        this.imageID = imageID;
        this.file = file;
        this.checked = checked;
    }

    public int getImageID() {
        return imageID;
    }

    public void setImageID(int imageID) {
        this.imageID = imageID;
    }

    public String getFile() {
        return file;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public boolean getChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }
}
public class CustomListViewAdapter extends ArrayAdapter<Item> {

    private Context context;

    public CustomListViewAdapter(Context context, int resourceID, List<Item> items) {
        super(context, resourceID, items);
        this.context = context;
    }

    private class ViewHolder {
        ImageView imageview;
        TextView textview;
        CheckBox checkbox;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        Item item = (Item) getItem(position);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if(convertView == null) {
            convertView = inflater.inflate(R.layout.row, null);
            holder = new ViewHolder();
            holder.imageview = (ImageView) convertView.findViewById(R.id.imageView1);
            holder.textview = (TextView) convertView.findViewById(R.id.textView1);
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox1);
            convertView.setTag(holder);

            holder.checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    CheckBox checkbox = (CheckBox) view;
                    Item item = (Item) checkbox.getTag();
                    item.setChecked(checkbox.isChecked());
                }
            });
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.checkbox.setTag(item);

        holder.imageview.setImageResource(item.getImageID());
        holder.textview.setText(item.getFile());
        holder.checkbox.setChecked(item.getChecked());

        return convertView;
    }
}
CustomListViewAdapter.java

public class MainActivity extends Activity {
    private ListView listview;
    private Button button;

    private List<Item> itemList;
    private CustomListViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        listview = (ListView) findViewById(R.id.listView1);
        button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(listener);
        listview.setOnItemClickListener(itemListener);

        itemList = new ArrayList<Item>();

        for(int i=1; i <= 20; i++) {
            Item item = new Item(R.drawable.ic_launcher, "Line " + String.valueOf(i), false);
            itemList.add(item);
        }

        adapter = new CustomListViewAdapter(this, R.layout.row, itemList);
        listview.setAdapter(adapter);
    }

    private OnClickListener listener = new OnClickListener() {
        @Override
        public void onClick(View view) {
            ArrayList<String> checkedList = new ArrayList<String>();

            for(int i=0; i < itemList.size(); i++) {
                Item item = adapter.getItem(i);

                if(item.getChecked() == true) {
                    checkedList.add(String.valueOf(item.getFile()));
                }
            }

            String output = "";
            for(int i=0; i < checkedList.size(); i++) {
                output += checkedList.get(i) + "\n";
            }

            if(!output.equals("")) {
                Toast.makeText(MainActivity.this, output, Toast.LENGTH_SHORT).show();
            }
        }
    };

    private OnItemClickListener itemListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Item item = adapter.getItem(position);
            Toast.makeText(MainActivity.this, item.getFile(), Toast.LENGTH_SHORT).show();
        }
    };
}
public class Item {
    private int imageID;
    private String file;
    private boolean checked;

    public Item() {

    }

    public Item(int imageID) {
        this.imageID = imageID;
    }

    public Item(int imageID, String file) {
        this.imageID = imageID;
        this.file = file;
    }

    public Item(int imageID, String file, boolean checked) {
        this.imageID = imageID;
        this.file = file;
        this.checked = checked;
    }

    public int getImageID() {
        return imageID;
    }

    public void setImageID(int imageID) {
        this.imageID = imageID;
    }

    public String getFile() {
        return file;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public boolean getChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }
}
public class CustomListViewAdapter extends ArrayAdapter<Item> {

    private Context context;

    public CustomListViewAdapter(Context context, int resourceID, List<Item> items) {
        super(context, resourceID, items);
        this.context = context;
    }

    private class ViewHolder {
        ImageView imageview;
        TextView textview;
        CheckBox checkbox;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        Item item = (Item) getItem(position);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if(convertView == null) {
            convertView = inflater.inflate(R.layout.row, null);
            holder = new ViewHolder();
            holder.imageview = (ImageView) convertView.findViewById(R.id.imageView1);
            holder.textview = (TextView) convertView.findViewById(R.id.textView1);
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox1);
            convertView.setTag(holder);

            holder.checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    CheckBox checkbox = (CheckBox) view;
                    Item item = (Item) checkbox.getTag();
                    item.setChecked(checkbox.isChecked());
                }
            });
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.checkbox.setTag(item);

        holder.imageview.setImageResource(item.getImageID());
        holder.textview.setText(item.getFile());
        holder.checkbox.setChecked(item.getChecked());

        return convertView;
    }
}
公共类CustomListViewAdapter扩展了ArrayAdapter{
私人语境;
公共CustomListViewAdapter(上下文上下文、int resourceID、列表项){
超级(上下文、资源ID、项目);
this.context=上下文;
}
私有类视窗持有者{
图像视图图像视图;
文本视图文本视图;
复选框;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
Item Item=(Item)getItem(position);
LayoutInflater充气器=(LayoutInflater)context.getSystemService(Activity.LAYOUT\u充气器\u SERVICE);
if(convertView==null){
convertView=充气机充气(R.layout.row,空);
holder=新的ViewHolder();
holder.imageview=(imageview)convertView.findViewById(R.id.imageView1);
holder.textview=(textview)convertView.findViewById(R.id.textView1);
holder.checkbox=(checkbox)convertView.findViewById(R.id.checkBox1);
convertView.setTag(支架);
holder.checkbox.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
复选框=(复选框)视图;
Item=(Item)checkbox.getTag();
item.setChecked(checkbox.isChecked());
}
});
}
否则{
holder=(ViewHolder)convertView.getTag();
}
holder.checkbox.setTag(项目);
holder.imageview.setImageResource(item.getImageID());
holder.textview.setText(item.getFile());
holder.checkbox.setChecked(item.getChecked());
返回视图;
}
}
我自己买的

只需将这些
方法
私有类
添加到MainActivity:

public void showActionMode() {
    actionMode = startActionMode(new AnActionModeOfEpicProportions());
}

public void closeActionMode() {
    actionMode.finish();
}

private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {

        menu.add("Download")
            .setTitle("Download")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        menu.add("Move")
            .setTitle("Move")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        menu.add("Delete")
            .setTitle("Delete")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        menu.add("Select all")
            .setTitle("Select all")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        menu.add("Unselect all")
            .setTitle("Unselect all")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
        mode.finish();
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
}
。。并在
CustomListViewAdapter
中编辑
复选框的
onClickListener()
,如下所示:

        holder.checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CheckBox checkbox = (CheckBox) view;
                Item item = (Item) checkbox.getTag();
                item.setChecked(checkbox.isChecked());

                boolean checked = false;
                for(int i=0; i < items.size(); i++) {
                    Item temp = items.get(i);

                    if(temp.getChecked() == true) {
                        checked = true;
                    }
                }

                if(checked) {
                    if(MainActivity.actionModeCheck == false) {
                        ((MainActivity) context).showActionMode();
                    }
                }
                else {
                    if(MainActivity.actionModeCheck == true) {
                        ((MainActivity) context).closeActionMode();
                    }
                }
            }
        });
holder.checkbox.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
复选框=(复选框)视图;
Item=(Item)checkbox.getTag();
item.setChecked(checkbox.isChecked());
布尔检查=假;
对于(int i=0;i
就这样;)