Android CheckBox 多选以及反选清除已选项

2023-11-09

前言

疫情随着这个春天的到来已悄然离去,你还记得填写问卷调查的那个时候么

话不多少,这篇文章要实现的就是一个问卷调查列表,即 Listview 嵌套 Listview 实现 checkbox 多选以及反选清除已选项

                                              

正文

思路就是定义一个 Map 集合用于存储每一个 checkbox 条目的选中状态。默认 checkbox 状态都为 false,遍历集合,选中哪条就把该条目的位置添加进集合,并设置状态为true,未选设置状态为 false,如果集合不为空设置checkbox 状态为 true ,反之为 false

1.引入库

implementation 'com.google.code.gson:gson:2.2.2'

2.准备数据

  新建一个DataJson 类 ,把接口数据定义为一个不可改变的字符串JSON

public class DataJson {
    public static final String JSON = "{\n" +
            "    \"data\": {\n" +
            "        \"problems\": [\n" +
            "            {\n" +
            "                \"bodydetails\": [\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"发热\",\n" +
            "                        \"ConditionValue\": \"10\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"干咳\",\n" +
            "                        \"ConditionValue\": \"11\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"腹泻\",\n" +
            "                        \"ConditionValue\": \"12\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"身体无异常\",\n" +
            "                        \"ConditionValue\": \"100\"\n" +
            "                    }\n" +
            "                ],\n" +
            "                \"problem\": \"身体是否出现以下状况:\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"bodydetails\": [\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"划伤\",\n" +
            "                        \"ConditionValue\": \"10\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"水泡\",\n" +
            "                        \"ConditionValue\": \"11\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"疱疹\",\n" +
            "                        \"ConditionValue\": \"12\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"手掌无异常\",\n" +
            "                        \"ConditionValue\": \"100\"\n" +
            "                    }\n" +
            "                ],\n" +
            "                \"problem\": \"手掌是否出现以下状况:\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"bodydetails\": [\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"口腔溃疡\",\n" +
            "                        \"ConditionValue\": \"10\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"牙龈出血\",\n" +
            "                        \"ConditionValue\": \"11\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"扁导体发炎\",\n" +
            "                        \"ConditionValue\": \"12\"\n" +
            "                    },\n" +
            "                    {\n" +
            "                        \"ConditionName\": \"口腔无异常\",\n" +
            "                        \"ConditionValue\": \"100\"\n" +
            "                    }\n" +
            "                ],\n" +
            "                \"problem\": \"口腔是否出现以下状况:\"\n" +
            "            }\n" +
            "        ]\n" +
            "    },\n" +
            "    \"msg\": \"获取成功\",\n" +
            "    \"status\": \"Y\"\n" +
            "}";
}

当拿到服务器返回的数据的时候,我也是一脸懵,为什么每一项的状态码都是一样的?这怎么区分存储呢,所以嘛跟后台打好关系还是比较重要的,不然你会做很多工作,这里就自己定义实体类加 flag 标识吧,创建 ResponseBean 实体类 并新增 flag 字段

public class ResponseBean {

    /**
     * status : Y
     * msg : 获取成功
     * data : {"problems":[{"bodydetails":[{"ConditionName":"发热","ConditionValue":"10"},{"ConditionName":"干咳","ConditionValue":"11"},{"ConditionName":"腹泻","ConditionValue":"12"},{"ConditionName":"身体无异常","ConditionValue":"100"}],"problem":"身体是否出现以下状况:"},{"bodydetails":[{"ConditionName":"划伤","ConditionValue":"10"},{"ConditionName":"水泡","ConditionValue":"11"},{"ConditionName":"疱疹","ConditionValue":"12"},{"ConditionName":"手掌无异常","ConditionValue":"100"}],"problem":"手掌是否出现以下状况:"},{"bodydetails":[{"ConditionName":"口腔溃疡","ConditionValue":"10"},{"ConditionName":"牙龈出血","ConditionValue":"11"},{"ConditionName":"扁导体发炎","ConditionValue":"12"},{"ConditionName":"口腔无异常","ConditionValue":"100"}],"problem":"口腔是否出现以下状况:"}]}
     */

    private String status;
    private String msg;
    private DataBean data;

    @Override
    public String toString() {
        return "ResponseBean{" +
                "status='" + status + '\'' +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        private List<ProblemsBean> problems;

        @Override
        public String toString() {
            return "DataBean{" +
                    "problems=" + problems +
                    '}';
        }

        public List<ProblemsBean> getProblems() {
            return problems;
        }

        public void setProblems(List<ProblemsBean> problems) {
            this.problems = problems;
        }

        public static class ProblemsBean {
            /**
             * bodydetails : [{"ConditionName":"发热","ConditionValue":"10"},{"ConditionName":"干咳","ConditionValue":"11"},{"ConditionName":"腹泻","ConditionValue":"12"},{"ConditionName":"身体无异常","ConditionValue":"100"}]
             * problem : 身体是否出现以下状况:
             */

            private String problem;
            private List<BodydetailsBean> bodydetails;

            @Override
            public String toString() {
                return "ProblemsBean{" +
                        "problem='" + problem + '\'' +
                        ", bodydetails=" + bodydetails +
                        '}';
            }

            public String getProblem() {
                return problem;
            }

            public void setProblem(String problem) {
                this.problem = problem;
            }

            public List<BodydetailsBean> getBodydetails() {
                return bodydetails;
            }

            public void setBodydetails(List<BodydetailsBean> bodydetails) {
                this.bodydetails = bodydetails;
            }

            public static class BodydetailsBean {
                /**
                 * ConditionName : 发热
                 * ConditionValue : 10
                 */

                private String ConditionName;
                private String ConditionValue;
                private String flag;

                @Override
                public String toString() {
                    return "BodydetailsBean{" +
                            "ConditionName='" + ConditionName + '\'' +
                            ", ConditionValue='" + ConditionValue + '\'' +
                            ", flag=" + flag +
                            '}';
                }

                public String getConditionName() {
                    return ConditionName;
                }

                public void setConditionName(String ConditionName) {
                    this.ConditionName = ConditionName;
                }

                public String getConditionValue() {
                    return ConditionValue;
                }

                public void setConditionValue(String ConditionValue) {
                    this.ConditionValue = ConditionValue;
                }

                public String getFlag() {
                    return flag;
                }

                public void setFlag(String flag) {
                    this.flag = flag;
                }
            }
        }
    }
}

因为接口数据为数组嵌套一个数组,如下图

这里需要解决 Listview 嵌套中 item 点击失效 或 显示不全 问题 

需要自定义一个 CustomListView 类继承父类 ListView 并重写 onMeasure 方法,进行重定义高度

public class CustomListView extends ListView {

    public CustomListView(Context context) {
        super(context);
    }

    public CustomListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int newHeightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, newHeightSpec);
    }
}

接下来创建标题 item 的 xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_title_tv"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_marginTop="30dp"
        android:gravity="center_vertical"
        android:paddingStart="10dp"
        android:paddingLeft="10dp"
        android:paddingEnd="10dp"
        android:paddingRight="10dp"
        android:text="标题"
        android:textColor="#000000" />

    <com.wyc.checkbox.CustomListView
        android:id="@+id/item_list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:overScrollMode="never" />

</LinearLayout>

在创建子选项 item 的 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:padding="10dp"
    android:layout_height="100dp">

    <TextView
        android:id="@+id/item_check_tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="标题"
        android:textColor="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/item_check_box"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <CheckBox
        android:id="@+id/item_check_box"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBaseline_toBaselineOf="@id/item_check_tv"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/item_check_tv" />
</android.support.constraint.ConstraintLayout>

接下来就是外层标题适配器,创建一个 ResponseAdapter 类并继承 BaseAdapter ,然后这里定义一个 Map 数组 用来存储选项状态码,默认所有为 false

然后再判断选项列表是否为空,不为空就加载选项适配器

public class ResponseAdapter extends BaseAdapter {

    private List<ResponseBean.DataBean.ProblemsBean> mDataList;
    private Map<String, Boolean> mCheckMap = new HashMap<>();

    public ResponseAdapter(List<ResponseBean.DataBean.ProblemsBean> dataList) {
        this.mDataList = dataList;
        for (ResponseBean.DataBean.ProblemsBean bean : mDataList) {
            for (ResponseBean.DataBean.ProblemsBean.BodydetailsBean bodydetail : bean.getBodydetails()) {
                mCheckMap.put(bodydetail.getFlag(), false);
            }
        }
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    public Map<String, Boolean> getCheckMap() {
        return mCheckMap;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_response, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        ResponseBean.DataBean.ProblemsBean problemsBean = mDataList.get(position);
        holder.itemTitleTv.setText(problemsBean.getProblem());
        List<ResponseBean.DataBean.ProblemsBean.BodydetailsBean> bodyList = problemsBean.getBodydetails();
        if (bodyList != null && bodyList.size() > 0) {
            holder.itemListView.setVisibility(View.VISIBLE);
            holder.itemListView.setAdapter(new ProblemAdapter(problemsBean.getBodydetails(), mCheckMap));
        } else {
            holder.itemListView.setVisibility(View.GONE);
        }
        return convertView;
    }

    final static class ViewHolder {
        TextView itemTitleTv;
        ListView itemListView;

        public ViewHolder(View view) {
            itemListView = view.findViewById(R.id.item_list_view);
            itemTitleTv = view.findViewById(R.id.item_title_tv);
        }
    }
}

接下来就是子选项的adapter ,创建 ProblemAdapter 类并继承 BaseAdapter , 顶一个 Map 数组 ,然后在 getView 当中 为 checkbox 添加 改变监听事件 ,选择就存储为 true 反之为 false , 并及时刷新适配器, 接下来就是获取选项状态码,这里是从大项开始刷选 ,状态值是自己定义的接下来会说的,默认存储都为 false ,

public class ProblemAdapter extends BaseAdapter {
    public static final String TAG = "ProblemAdapter";

    private List<ResponseBean.DataBean.ProblemsBean.BodydetailsBean> mBodyDetails;
    private Map<String, Boolean> mCheckMap;


    public ProblemAdapter(List<ResponseBean.DataBean.ProblemsBean.BodydetailsBean> bodydetails, Map<String, Boolean> checkMap) {
        this.mBodyDetails = bodydetails;
        this.mCheckMap = checkMap;
        Log.d(TAG, "===============================");
        for (String integer : mCheckMap.keySet()) {
            Log.d(TAG, "key= " + integer + " , value = " + mCheckMap.get(integer));
        }
    }

    public Map<String, Boolean> getCheckMap() {
        return mCheckMap;
    }

    @Override
    public int getCount() {
        return mBodyDetails.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_check_view, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.itemCheckTv.setText(mBodyDetails.get(position).getConditionName());
        final ResponseBean.DataBean.ProblemsBean.BodydetailsBean bean = mBodyDetails.get(position);
        holder.itemCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    mCheckMap.put(bean.getFlag(), true);
                } else {
                    mCheckMap.put(bean.getFlag(), false);
                }
                notifyDataSetChanged();
            }
        });

        if (mCheckMap.get("1100")) {
            mCheckMap.put("110", false);
            mCheckMap.put("111", false);
            mCheckMap.put("112", false);
            notifyDataSetChanged();
        }

        if (mCheckMap.get("2100")) {
            mCheckMap.put("210", false);
            mCheckMap.put("211", false);
            mCheckMap.put("212", false);
            notifyDataSetChanged();
        }

        if (mCheckMap.get("3100")) {
            mCheckMap.put("310", false);
            mCheckMap.put("311", false);
            mCheckMap.put("312", false);
            notifyDataSetChanged();
        }

        if (mCheckMap != null && mCheckMap.get(bean.getFlag())) {
            holder.itemCheckBox.setChecked(true);
        } else {
            holder.itemCheckBox.setChecked(false);
        }

        return convertView;
    }

    final static class ViewHolder {
        TextView itemCheckTv;
        CheckBox itemCheckBox;

        public ViewHolder(View view) {
            itemCheckTv = view.findViewById(R.id.item_check_tv);
            itemCheckBox = view.findViewById(R.id.item_check_box);
        }
    }
}

最后就是 MainActivity 进行资源整合,先看布局,布局就是一个标题栏加一个 Listview 标题栏的 已选择项 点击方便自己测试用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="选择效果"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/checkBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:layout_marginEnd="10dp"
            android:text="已选择项"
            android:textColor="#ff0000" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="#f2f2f2" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:overScrollMode="never" />

</LinearLayout>

最后就是主要整合代码,主要就是 初始化时 准备下本地数据,这里自定义状态 flag 标识,循环列表通过 i 进行递增,用于判断复选框是否选中,最后加到 mDataBeanList 中,

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "Log_MainActivity";
    private List<ResponseBean.DataBean.ProblemsBean> mDataBeanList = new ArrayList<>();
    private ListView mListView;
    private ResponseAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        mListView = findViewById(R.id.listView);
        mAdapter = new ResponseAdapter(mDataBeanList);
        mListView.setAdapter(mAdapter);
        TextView checkBtn = findViewById(R.id.checkBtn);
        checkBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Map<String, List<String>> map = checkItem();
                Log.d(TAG, "check map = " + map.toString());
            }
        });


    }

    /**
     * 获取已选项目
     *
     * @return
     */
    private Map<String, List<String>> checkItem() {
        Map<String, List<String>> map = new HashMap<>();
        if (mAdapter != null) {
            Map<String, Boolean> checkMap = mAdapter.getCheckMap();
            for (ResponseBean.DataBean.ProblemsBean problemsBean : mDataBeanList) {
                List<String> problemList = new ArrayList<>();
                for (ResponseBean.DataBean.ProblemsBean.BodydetailsBean bodydetail : problemsBean.getBodydetails()) {
                    if (checkMap.get(bodydetail.getFlag())) {
                        problemList.add(bodydetail.getConditionValue() + "--------------" + bodydetail.getConditionName());
                    }
                }
                map.put(problemsBean.getProblem(), problemList);
            }
        }
        return map;
    }

    private void initData() {
        ResponseBean responseBean = new Gson().fromJson(DataJson.JSON, ResponseBean.class);
        Log.d(TAG, "responseBean = " + responseBean.toString());
        List<ResponseBean.DataBean.ProblemsBean> dataList = responseBean.getData().getProblems();

        //准话本地数据,自定义下标,用于判断复选框是否选中
        for (int i = 0; i < dataList.size(); i++) {
            ResponseBean.DataBean.ProblemsBean problemsBean = dataList.get(i);
            List<ResponseBean.DataBean.ProblemsBean.BodydetailsBean> beanList = new ArrayList<>();
            for (int j = 0; j < problemsBean.getBodydetails().size(); j++) {
                //数据转化
                ResponseBean.DataBean.ProblemsBean.BodydetailsBean bean = problemsBean.getBodydetails().get(j);
                ResponseBean.DataBean.ProblemsBean.BodydetailsBean newBean = new ResponseBean.DataBean.ProblemsBean.BodydetailsBean();
                newBean.setConditionValue(bean.getConditionValue());
                newBean.setConditionName(bean.getConditionName());
                //自定义下标
                newBean.setFlag((i + 1) + bean.getConditionValue());
                beanList.add(newBean);
            }
            problemsBean.setBodydetails(beanList);
            mDataBeanList.add(problemsBean);
        }
        Log.d(TAG, "data bean list = " + mDataBeanList.toString());
    }
}

运行程序,敲完收工  代码后续上传,如有疑问请评论留言第一时间回复

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android CheckBox 多选以及反选清除已选项 的相关文章

  • 使用新语法应用 Android Gradle 插件

    如何使用新的 Gradle 插件语法应用 Android 插件 plugins id version 代替 buildscript dependencies classpath com android tools build gradle
  • 将项目升级到Android Studio 1.0(Gradle问题)

    首先 我对 android 开发 android studio gradle 非常陌生 所以如果我问了一个愚蠢的问题 请原谅我 我的团队一直在使用 android studio 的 beta 版本开发一个项目 我刚刚安装了新版本 1 0 并
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • 是否可以使用 CardView 为浮动操作按钮制作阴影?

    I know CardView不是为此而设计的 但理论上如果cardCornerRadius view size 2它应该导致圆圈 我错过了什么吗 绘制真实的动画阴影并不困难 您可以尝试在 Froyo 等任何 Android 设备上实现 L
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 如何在Android中创建一个简洁的两栏输入表单?

    我想创建一个整洁的两列输入表单 如下所示 到目前为止我的 xml 布局代码
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码

随机推荐

  • 浅谈软件构件和软件构件测试

    什么是构件 构件也称为组件 是一个独立发布的功能部分 通过接口可以访问它的服务 其特点是 l 软件系统中具有相对独立功能 可以明确辨识 接口由契约指定 和语境有明显依赖关系 可独立部署 且多由第三方提供的可组装软件实体 l 软件构件须承载有
  • 前端导出后端文件的方法

    一般存在两种方式 1 请求接口之后 后端返回文件路径 前端直接下载 2 请求接口之后 后端以文件流的形式返回给前端 前端再下载到本地 第一种方式 window location href res request responseURL 直接
  • CVPR 2017论文

    近期在看CVPR2017的文章 顺便就把CVPR2017整理一下 分享给大家 更多的 Computer Vision的文章可以访问Computer Vision Foundation open access CVPapers Machine
  • Vue实现给按钮的点击事件绑定id参数

    当我们需要给按钮所绑定的值做出判断并记录时 eg 为答题的正确以及题号做判断 第一种情况 使用v for循环 div div 我是id div div 1 2 3 然后在 vue 的实例中就可以拿到对应的 id b index this l
  • 持久化数据&缓存数据双写一致性

    背景 缓存中数据更新一般有两个入口 数据缓存过期 数据在访问时发现缓存中无数据时重新查库然后更新至缓存 场景和问题等同于缓存查询 相关solution参考 缓存数据查询的注意事项 缓存未过期 数据库数据有变动主动更新至缓存 比较常见的场景
  • Windows+Ubuntu 22.04.1 LTS 64bit 双系统配置

    为了开发linux下的软件 花了半天的时间安装了双系统 记录一下过程方便以后重装 帮同学装 安装尽量使用官网教程 一 提前准备 1 确保硬盘有足够空余空间 2 关闭windows快速启动 会影响开机进入多系统引导 windows 10如何关
  • 函数栈帧的创建与销毁

    目录 引言 基础知识 内存模型 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main 函数栈帧的创建 NO1 NO2 NO3 NO4 NO5 NO6 main 函数栈帧变量的创建 调用Add 函数栈帧的预备工作 传参 NO1 N
  • 小蜜团队万字长文《读后简略概括》

    1 对话系统主要分为三类 闲聊型 任务导向型 问答型 闲聊型 就是瞎聊 想聊啥就 聊啥 任务导向型 考虑多轮对话 根据对话的不同状态和槽位值进行回复策略的选择 问答型 一问一答 识别询问者的意图 从知识库中选取答案进行返回 2 任务导向型
  • perl编写之前的一些习惯细节

    变量 环境变量的传递 文件 文件目录文件名路径的解析操作 命令行参数 调用shell命令 变量的debug 主体结构的划分 编写简单package的模板 脚本执行的关键信息保存在日志里 代码整理 下述信息 仅供自己编写新脚本之前的回顾内容
  • web前端html+css基础 项目实例

  • 【C++笔记】数据结构栈、堆,内存占用中栈区、堆区的区别和理解

    在计算机领域 堆栈是一个不容忽视的概念 我们编写的C语言程序基本上都要用到 但对于很多的初学着来说 堆栈是一个很模糊的概念 堆栈 一种数据结构 一个在程序运行时用于存放的地方 这可能是很多初学者的认识 因为我曾经就是这么想的和汇编语言中的堆
  • matlab机器人工具箱(1)

    1 机器人工具箱 2 Figure的基本组成 figure和axes的概念 在实际绘图中 一张图可能会有好几个子图 这时axes表示生成的各个小图 而figure则是绘制各图的大画布 所以 在之后设置图形属性时 有时用到gca Axes 有
  • Python爬虫自动刷“问卷网”问卷(不锁IP)

    大学很多项目都会要求征集问卷 但很难找到渠道迅速收集大量样本 如果是自己通过 问卷网 设计的问卷可以在设置不锁IP 默认情况 下用本方法快速刷取大量样本 且能保证问卷结果满足自身项目需求 即使没有了解过爬虫 稍有python基础看过本程序后
  • C++后台开发之我见

    C 后台开发之我见 2017 2 6 工作也快两年了 偶然看到自己以前写过的一些技术博客 发现自己自毕业后一直没有更新过自己的技术博客 趁现在是刚过完春节快要回公司工作之际 谈谈我个人对后台开发的一些个人见解 希望能够对在校的学生或者刚刚接
  • Python爬虫从入门到精通:今日作业_requests基础04_爬取药监总局中的企业详情数据_Python涛哥

    今日作业 爬取药监总局中的企业详情数据 爬取药监总局中的企业详情数据 url http scxk nmpa gov cn 81 xk 需求 将首页中每一家企业详情页对应的数据 每一家企业详情页对应的数据 将前5页企业的数据爬取即可 难点 用
  • scipy.sparse使用简例

    CDIMC Net 1 中有个对整个数据集求 kNN 图的函数 get kNNgraph2 2 是用 dense 的 numpy ndarray 存的 空间复杂度 O n 2 O n 2
  • HBuilder 制表符转换成空格

    在学习BootStrap时 看到 编码规范 by mdo 里面有一条关于编辑器配置的 用两个空格代替制表符 soft tab 即用空格代表 tab 符 避免常见的代码不一致和差异 然后找到了 HBuilder 制表符转换成空格 的方法 具体
  • Linux环境SVN用户权限修改

    1 查看SVN配置文件位置 系统环境 Linux 3 10 0 使用命令行查看SVN进程 ps ef grep svn 通过进程信息可以看到svnserve conf存放的目录 svnserve conf是svn配置文件 vim 目录 sv
  • OpenHarmony与HarmonyOS联系与区别

    目录 1 背景 2 OpenHarmony 3 HarmonyOS 4 鸿蒙生态 5 OpenHarmony与HarmonyOS的技术上实现区别 1 语言支持 2 SDK 的不同 3 运行调测方式不同 4 对APK的兼容性不同 5 包含关系
  • Android CheckBox 多选以及反选清除已选项

    前言 疫情随着这个春天的到来已悄然离去 你还记得填写问卷调查的那个时候么 话不多少 这篇文章要实现的就是一个问卷调查列表 即 Listview 嵌套 Listview 实现 checkbox 多选以及反选清除已选项 正文 思路就是定义一个