Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
显示cab的自定义适配器中的android复选框_Android_Checkbox_Android Adapter - Fatal编程技术网

显示cab的自定义适配器中的android复选框

显示cab的自定义适配器中的android复选框,android,checkbox,android-adapter,Android,Checkbox,Android Adapter,我尝试使用自定义适配器实现上下文操作栏(cab)。 首先,我用cab制作了简单的ListView,它成功了。 其次,我尝试使自定义适配器包含复选框和文本视图。 cab的复选框,但它不起作用 public class MainActivity extends Activity { ListView lv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanc

我尝试使用自定义适配器实现上下文操作栏(cab)。 首先,我用cab制作了简单的
ListView
,它成功了。 其次,我尝试使自定义适配器包含
复选框
文本视图
。 cab的
复选框
,但它不起作用

public class MainActivity extends Activity {

ListView lv1;

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

    ArrayList<String> arr = new ArrayList<String>();
    arr.add("1");
    arr.add("2");
    arr.add("3");
    arr.add("4");
    arr.add("5");
    lv1 = (ListView)findViewById(R.id.listView1);
    lv1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    lv1.setAdapter(new Adapters(this, R.layout.item, arr));
    lv1.setMultiChoiceModeListener(new ModeCallback());
}

private class Adapters extends ArrayAdapter<String> implements OnCheckedChangeListener{

    Context context;
    ArrayList<String> arr;
    CheckBox cb;
    int position;
    ViewGroup parent;

    public Adapters(Context context, int resource, ArrayList<String> objects) {
        super(context, resource, objects);
        this.context = context;
        this.arr = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = null;
        if(v == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.item, null);
        }
        TextView tv = (TextView)v.findViewById(R.id.tv1);
        tv.setText(arr.get(position));
        cb = (CheckBox)v.findViewById(R.id.cb1);
        cb.setOnCheckedChangeListener(this);
        this.parent = parent;
        this.position = position;
        return v;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        ((ListView)parent).setItemChecked(position, true);
    }

}

private class ModeCallback implements ListView.MultiChoiceModeListener {

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        mode.setTitle("Select Items");
        setSubtitle(mode);
        return true;
    }

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return true;
    }

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return true;
    }

    public void onDestroyActionMode(ActionMode mode) {
    }

    public void onItemCheckedStateChanged(ActionMode mode,
            int position, long id, boolean checked) {
        setSubtitle(mode);
    }

    private void setSubtitle(ActionMode mode) {
        final int checkedCount = lv1.getCheckedItemCount();
        switch (checkedCount) {
            case 0:
                mode.setSubtitle(null);
                break;
            case 1:
                mode.setSubtitle("One item selected");
                break;
            default:
                mode.setSubtitle("" + checkedCount + " items selected");
                break;
        }
    }
}
公共类MainActivity扩展活动{
ListView lv1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList arr=新的ArrayList();
协议增补(“1”);
协议增补(“2”);
协议增补(“3”);
协议增补(“4”);
协议增补(“5”);
lv1=(ListView)findViewById(R.id.listView1);
lv1.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE\u MODE);
lv1.setAdapter(新适配器(this,R.layout.item,arr));
lv1.setMultichoiceModelListener(newmodecallback());
}
私有类适配器扩展ArrayAdapter实现OnCheckedChangeListener{
语境;
ArrayList-arr;
复选框cb;
内部位置;
视图组父对象;
公共适配器(上下文、int资源、ArrayList对象){
超级(上下文、资源、对象);
this.context=上下文;
this.arr=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=null;
如果(v==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
v=充气机充气(R.layout.item,空);
}
TextView电视=(TextView)v.findviewbyd(R.id.tv1);
tv.setText(arr.get(position));
cb=(复选框)v.findviewbyd(R.id.cb1);
cb.setOnCheckedChangeListener(此);
this.parent=parent;
这个位置=位置;
返回v;
}
@凌驾
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
((ListView)父项).setItemChecked(位置,true);
}
}
私有类ModeCallback实现ListView.MultiChoiceModelListener{
公共布尔onCreateActionMode(ActionMode模式,菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。主菜单,菜单);
mode.setTitle(“选择项”);
设置子标题(模式);
返回true;
}
公共布尔onPrepareActionMode(操作模式,菜单){
返回true;
}
公共布尔值onActionItemClicked(ActionMode模式,菜单项){
返回true;
}
公共void onDestroyActionMode(ActionMode模式){
}
已更改MCheckedStateChanged(操作模式,
int位置,长id,布尔值已选中){
设置子标题(模式);
}
私有void setSubtitle(操作模式){
final int checkedCount=lv1.getCheckedItemCount();
开关(已检查计数){
案例0:
mode.setSubtitle(空);
打破
案例1:
模式。设置子标题(“选定一项”);
打破
违约:
mode.setSubtitle(“+checkedCount+”所选项目”);
打破
}
}
}
问题未更改
复选框
。 我真的很想知道这件事,
找不到任何类似的问题。

事实上,问题是添加可聚焦的元素(如复选框按钮)会禁用单击整个列表项的功能,并且必须禁用它们的可聚焦性。您也不应该向主布局添加任何可单击的标志

将xml中的复选框的聚焦设置为false

<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:focusable="false"/>

谢谢您的回复,但我的问题不是这样。我添加了可聚焦并可以单击复选框。当我添加
((ListView)parent)时,setItemChecked(position,true);
复选框没有更改。