android开发遇到的问题及解决方案

由于工作需要,第一次做安卓开发,没有系统地学习过,因此做时遇到问题时解决起来很费劲!记录一下重点问题。

问题1:实现一个字段的值(值为集合),支持多选,将选中的值用逗号隔开放在下拉框中。

实现思路:第一次看到原型图画的是一个下拉框,下面是一个可以多选的列表项。因为前面没做过安卓,也不知道这样的效果能不能实现。(1)于是就在网上搜索下拉多选框,结合教程发现Spinner列表选项框,只能单选,但网上搜索可以自定义实现MultiSelectSpinner的效果,无奈功力有限,未能实现;(2)在网上搜索的过程中,就发现Dialog+Listview+checkbox,能实现这样的效果,https://www.cnblogs.com/wzqnxd/p/9144519.html 通过此网址,抓住了核心实现方式,但也遇到了listview点击与checkbox选中效果不同步的问题,经同事帮助及个人理解的加深,实现了。(3)网上搜索过程中还发现了,RecyclerView、PopupWindow等,但我没有试过。

解决方案:(1)在layout xml布局文件中用了EditText,并设置spJyyq.setFocusable(false); 不可编辑,再设置spJyyq.setOnClickListener(l_spjyyq); 点击事件,在事件实现中创建一个对话框,对话框里的View是ListView,ListView里的内容是TextView和Checkbox,主要代码如下:

View getlistview;
ArrayList> mData = new ArrayList>();
AlertDialog.Builder builder;
SimpleAdapter adapter;
Boolean[] bl ;

//根据字段集合的值来设置mData、bl的值

if(dictInfoList.size() > 0) {
                        jyyqs.clear();
                        bl = new Boolean[dictInfoList.size()];
                        int i=0;
                        for(DictInfo dictInfo:dictInfoList){
                                jyyqs.add(dictInfo.getDictvalue());
                                Map item = new HashMap();
                                item.put("text", dictInfo.getDictvalue());
                                mData.add(item);
                                bl[i] = true;
                                i++;
                        }
                        defJyyq = org.apache.commons.lang3.StringUtils.join(jyyqs,",");
                        spJyyq.setText(defJyyq);
                        app.setJyyqValue(defJyyq);
                    }
public void CreateDialog() {

        // 动态加载一个listview的布局文件进来
        LayoutInflater inflater = LayoutInflater.from(FunctionListActivity.this);
        getlistview = inflater.inflate(R.layout.item_jyyq_list, null);

        // 给ListView绑定内容
        ListView listview = (ListView) getlistview.findViewById(R.id.X_listview);
        adapter = new SetSimpleAdapter(FunctionListActivity.this, mData, R.layout.item_jyyq, new String[] { "text" },
                new int[] { R.id.X_item_text });
        // 给listview加入适配器
        listview.setAdapter(adapter);
        listview.setItemsCanFocus(false);
        listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listview.setOnItemClickListener(new ItemOnClick());

        builder = new AlertDialog.Builder(this);
//        builder.setTitle("请选择查询类型");
////        builder.setIcon(R.drawable.ic_launcher);
        //设置加载的listview
        builder.setView(getlistview);
        builder.setPositiveButton("确定", new DialogOnClick());
        builder.setNegativeButton("取消", new DialogOnClick());
        //设置点击旁边,不关闭对话框
        builder.setCancelable(false);
        builder.create().show();
    }
//ListView 条目点击事件
class ItemOnClick implements AdapterView.OnItemClickListener {

    @Override
    public void onItemClick(AdapterView arg0, View view, int position, long id) {
        CheckBox cBox = (CheckBox) view.findViewById(R.id.X_checkbox);
        TextView textView = view.findViewById(R.id.X_item_text);
        textView.setText(mData.get(position).get("text").toString());
     //将复选框中的选中状态与listview的 保持一致
        if (cBox.isChecked()) {
            bl[position] = false;
            cBox.setChecked(false);
        } else {
            bl[position] = true;
            cBox.setChecked(true);
        }

    }

}
//对话框 按钮事件
class DialogOnClick implements DialogInterface.OnClickListener {
    ListView listview = (ListView) getlistview.findViewById(R.id.X_listview);
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
            case Dialog.BUTTON_POSITIVE:
                //确定按钮的事件
              //  SparseBooleanArray checklist =  listview.getCheckedItemPositions();
                String strcheck = "";
                for (int i = 0; i < bl.length; i++) {
                    if (bl[i]) {
                        final Object item = mData.get(i).get("text");
                        strcheck += item + ",";
                    }
                }
                if(strcheck.length()>0){
                    strcheck = strcheck.substring(0,strcheck.length()-1);
                }
                spJyyq.setText(strcheck);
                app.setJyyqValue(strcheck);
                break;
            case Dialog.BUTTON_NEGATIVE:
                //取消按钮的事件
                String[] checkJyyqArray = null;
                String checkJyyq = spJyyq.getText().toString();
                if(checkJyyq.length()>0){
                    checkJyyqArray = checkJyyq.split(",");
                }
                if(checkJyyqArray == null){
                    for (int i = 0; i < bl.length; i++) {
                        bl[i]=false;
                    }
                }else {
                    List jyyqLst = Arrays.asList(checkJyyqArray);
                    for (int i = 0; i < bl.length; i++) {
                        String item = mData.get(i).get("text").toString();
                        if(!jyyqLst.contains(item)){
                            bl[i]=false;
                        }else{
                            bl[i]=true;
                        }
                    }
                }
                adapter.notifyDataSetChanged();
                break;
            default:
                break;
        }
    }
}

//重写simpleadapterd的getview方法
class SetSimpleAdapter extends SimpleAdapter {

    public SetSimpleAdapter(Context context, List> data, int resource, String[] from,
                            int[] to) {
        super(context, data, resource, from, to);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LinearLayout.inflate(getBaseContext(), R.layout.item_jyyq, null);
        }
        CheckBox ckBox = (CheckBox) convertView.findViewById(R.id.X_checkbox);
        TextView textView = convertView.findViewById(R.id.X_item_text);
        textView.setText(mData.get(position).get("text").toString());
        //每次都根据 bl[]来更新checkbox
        if (bl[position] == true) {
            ckBox.setChecked(true);
        } else if (bl[position] == false) {
            ckBox.setChecked(false);
        }
        return super.getView(position, convertView, parent);
    }
}

 

问题2:数据明细采用三列的网格方式展示 不能出现滚动条,即全部展示。用GridView 实现,但老是出现显示不全的问题。

思路:这个功能是前面同事已经做好的功能,但在不同的平板上就会出现显示不全的情况(尤其本来是横板,竖着看时,但用户非要竖着固定平板),通过贴子 https://blog.csdn.net/lintax/article/details/52072074 得出结论:
1, GridView有一个视图高度,其计算方法是:第一个格子的高度*总的排数;
2, GridView有一个内容高度,其计算方法是:每排最后一个格子的高度之和;
3, 若视图高度小于内容高度,则内容显示不全,可以滑动来显示;
4,GridView每排的高度,不是固定的,使用的是最后一个格子的高度。
5,若某一排中有内容超过最后一个格子高度的,则多出的部分,会显示到下一排上,从而出现重叠现象。若这排就是最后一排了,则多出的部分不能显示。

鉴于此问题,同事建议我用TableLayout 动态添加行的方式来实现,事实证明姜还是老的辣!通过此方式解决了问题。

解决方案:1、在layout xml里定义TableLayout 标签,此处尤其说明一下,要合理使用android:shrinkColumns和android:stretchColumns属性 ,若每列显示相同的内容,则这两个属性的值可设置为"*",即每列可拉伸和收缩;若每列显示的内容不一样,某一列的值可能会比较长,希望长的换行显示,则需要将shrinkColumns的值设置为此列号,注:列号从0开始。

2、在获取数据的接口中,设置数据明细集合,并发消息通知 handler,如:

//发消息通知处理明细信息
Message msg = new Message();
msg.what = REFRESH;
mHandler.sendMessage(msg);

//在handler中 根据数据明细数据,动态添加tablelayout

mHandler=new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == REFRESH) {
            //移除药味
            tableLayout.removeAllViews();
            setCfMxGXInfo(cfMxInfoList,tableLayout,4);

        }
    }
};

 

public void setCfMxGXInfo(List cfMxInfoList, TableLayout tableLayout,int cols){
    int size = cfMxInfoList.size();
    int fontsize = 20;
    int align = Gravity.LEFT;
    for (int i = 0; i < size; i++) {
        CfMxInfo item = cfMxInfoList.get(i);
        //创建一行
        TableRow row = new TableRow(getApplicationContext());
        for(int j=0;j 
  

 

问题3:扫码框,有的平板或手机扫不上条形码,或容易识别错误。

思路:顺着代码摸索实现方式,发现系统是用zxing扫描和识别二维码的,于是网上搜索解决方案,解决时参考:

https://blog.csdn.net/u012917700/article/details/52369175?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9

此问题是同事解决的,目前也不太了解zxing,因此先记录到这里。

还有就是屏幕的适配问题,目前只是按目前的平板调整好了,但没有从根本解决问题

目前是在已有项目上做修改,本次开发算是对安桌稍有了解,但仍需努力深入学习。

 

 

 

你可能感兴趣的:(安卓)