由于工作需要,第一次做安卓开发,没有系统地学习过,因此做时遇到问题时解决起来很费劲!记录一下重点问题。
问题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、bl的值
if(dictInfoList.size() > 0) { jyyqs.clear(); bl = new Boolean[dictInfoList.size()]; int i=0; for(DictInfo dictInfo:dictInfoList){ jyyqs.add(dictInfo.getDictvalue()); Mapitem = 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 { ListjyyqLst = 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 extends Map> 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(ListcfMxInfoList, 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,因此先记录到这里。还有就是屏幕的适配问题,目前只是按目前的平板调整好了,但没有从根本解决问题
目前是在已有项目上做修改,本次开发算是对安桌稍有了解,但仍需努力深入学习。