安卓网格布局如何用java代码实现跨多行跨多列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓网格布局如何用java代码实现跨多行跨多列相关的知识,希望对你有一定的参考价值。

如图所示,我想做一个网格布局,实现其中的一个单元格中的元素跨多行多列。就像html中的table一样。但是不是Android中的table我想通过GridLayou 网格布局来实现。这里是我找到的一些参考代码 我做了很多遍都没有成功//参考代码// GridLayout.LayoutParams param = new GridLayout.LayoutParams();// param.columnSpec = GridLayout.spec(0, 1);// param.rowSpec = GridLayout.spec(0, 1);// view.setLayoutParams(param);// gridlayout.addView(view);另外我还想请教一下 上面注释的代码中的 “0”指的是什么意思?
我想实现下图的网格效果

之前有人做过用Table来实现一个表单的效果,其中也有跨多行和多列,是用纯java代码实现的,没有使用XML。用网格布局GridView也可以实现 参考技术A http://blog.csdn.net/pku_android/article/details/7343258
0表示第0行/列开始追问

谢谢,我其实是想知道如何用java代码在activity中实现上图的布局,而不是通过XML来实现。

本回答被提问者采纳

PoiExcel导入实现(解决跨行问题以及03和07版本问题)

Excel数据导入

需求:需要将多个跨行的数据保存在数据库中,而且数据库中的数据是树形结构,多行多列存在父级关系,数据需要保存父ID。

解决方案: 因为是树形结构,那么表单的数据分区读取,先读取父级的数据存到数据库,再存入子类数据。

第一步:解决Excel版本问题

String originalFileName = file.getOriginalFilename();
    		InputStream is = file.getInputStream();
    		int version = 0;
    		if (originalFileName.endsWith(".xls")) {
    			version = 2003;
    		}else if (originalFileName.endsWith(".xlsx")) {
    			version = 2007;
    		}else {
    			throw new Exception("Incorrect file format,Only allowed ‘.xls,.xlsx‘ extension");
    		}
    		Workbook workbook = null;
    		switch (version) {
    			case 2003:
    				POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(is));
    				workbook = new HSSFWorkbook(fs);
    				break;
    	
    			case 2007:
    				workbook = new XSSFWorkbook(new BufferedInputStream(is));
    				break;
    		}
    		int sheetIndex = workbook.getSheetIndex("云运维成熟度评估要素");
    		Sheet sheet = workbook.getSheetAt(sheetIndex);
		

  

第二步:遍历第二、三列数据存入list便于下一步处理

 List<OcScope> ocScopeListOne = new ArrayList<OcScope>();
String b = "";  String c = ""; 	 int e =0; double w = 0D;
    		for (Row row : sheet) {
    			OcScope ocScope = new OcScope();
    			int rowNum = row.getRowNum();
    			if(e==1){break;}  //当e==1时跳出循环
    			if(rowNum <= 1){//跳出第一行   一般第一行都是表头没有数据意义
    				continue;
    			}
    			int startCell = 1; //
    			if(row.getCell(startCell)!=null ){//第1列数据
  		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
  		          if(!row.getCell(startCell).getStringCellValue().equals("")){  
                        //判空赋值的好处是解决跨行数据 如果下一行没有读到就继续将上一行的数据写入实体
  		        	  
  		        	  if(row.getCell(startCell).getStringCellValue().equals("0")){ //如果数据为0跳出循环
  		        		  e=1;   
  		        	  }else{
  		        		 b = row.getCell(startCell).getStringCellValue();  //不是就赋值
  		        	  }
  		        	
  		          }
  		         
    			}
    			startCell++;
    			if(row.getCell(startCell) == null){
		        	  e=1;
		          }
    			
    			if(row.getCell(startCell)!=null){//第15列
    		    	row.getCell(startCell).setCellType(Cell.CELL_TYPE_NUMERIC);
    		    		 w = row.getCell(startCell).getNumericCellValue();
    		    		     }
    			//解决跨行问题
    			ocScope.setScopeName(b); //只有不为空的时候b才会被从新赋值
    			ocScope.setParentName(null);
    			ocScope.setLevel("1");
    			ocScope.setWeights(w);//只有不为空的时候W才会被从新赋值
    			ocScopeListOne.add(ocScope);
    		}

  

第三步:去重处理(因为处理的是对象,用Map去重是一个不错的解决方案)

Map<String, OcScope> ocScopeMapOne = Maps.newHashMap();
    		Map<String, OcScope>  ocScopeMapTwo = Maps.newHashMap();
    		for (OcScope ocScope : ocScopeListOne) {
    			ocScopeMapOne.put(ocScope.getScopeName(), ocScope);
			}

  

第四步:存入处理(遍历Map存入)

OcScope ocScopeOne = new OcScope();
    		ocScopeOne.setLevel("1");
        	List<OcScope> ocScopelistOne=	ocScopeService.findList(ocScopeOne);  //查询出一级的所有数据
    		for (String key : ocScopeMapOne.keySet()) { //遍历map
    			for (OcScope ocScope1 : ocScopelistOne) {
    				if(!ocScopeMapOne.get(key).getScopeName().equals(ocScope1.getScopeName())){ //与一级的list数据进行对比没有相同的就存入新数据
//    					dao.insert(ocScopeMapOne.get(key));
				}
				}
    		}

  

第五步:从新遍历表格存入下一级数据, 遍历第二、四、五列数据存入list便于下一步处理

b=""; c="";w=0; e =0;  //重新赋值
    		for (Row row : sheet) {
    			OcScope ocScope = new OcScope();
    			int rowNum = row.getRowNum();
    			if(e==1){break;}
    			if(rowNum <= 1){//跳出第一行   一般第一行都是表头没有数据意义
    				continue;
    			}
    			int startCell = 1; //
    			if(row.getCell(startCell)!=null ){//第1列数据
  		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
  		          if(!row.getCell(startCell).getStringCellValue().equals("")){
  		        	 b = row.getCell(startCell).getStringCellValue();
  		          }
  		         
    			}
    			
    			startCell++;
    			startCell++;
    			if(row.getCell(startCell) == null){
		        	  e=1;
		          }
    			if(row.getCell(startCell)!=null){//第3列数据
    		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
    		          if(!row.getCell(startCell).getStringCellValue().equals("")){
    		        	  if(row.getCell(startCell).getStringCellValue().equals("0")){
    		        		  e=1;  
    		        	  }else{
    		        		  c = row.getCell(startCell).getStringCellValue();
    		        	  }
    	  		        	
    	  		          }
    		     }
    			    			
    			startCell++;
    			if(row.getCell(startCell)!=null){//第4列
    		    	row.getCell(startCell).setCellType(Cell.CELL_TYPE_NUMERIC);
    		    	if(row.getCell(startCell).getNumericCellValue()!=0.0){
    		    		w = row.getCell(startCell).getNumericCellValue();
    		    	}
    		    		 
    		    	
    		    	}
    			
    		
//    		 转换为Integer类型
    			//解决跨行问题
    			
    			ocScope.setParentName(b); //这里需要存一个父级的名子
    			ocScope.setScopeName(c);
    			ocScope.setLevel("2");
    			ocScope.setWeights(w);
    			ocScopeListTwo.add(ocScope);
    		}

  

第六步:去重处理+存入处理

for (OcScope ocScope : ocScopeListTwo) { //去重处理
    			ocScopeMapTwo.put(ocScope.getScopeName(), ocScope);
			}


	 OcScope ocScopeTwo = new OcScope();
    		 ocScopeTwo.setLevel("2");
    	List<OcScope> ocScopelistTwo=	ocScopeService.findList(ocScopeTwo); //取出二级的List数据
        for (String key : ocScopeMapTwo.keySet()) {   //遍历map
    			for (OcScope ocScope1 :  ocScopelistOne) {
    				if(ocScopeMapTwo.get(key).getParentName().equals(ocScope1.getScopeName())){  //给对象赋值父ID根据值判断
    					ocScopeMapTwo.get(key).setParentId(ocScope1.getId());
        			}
				}
    		}
    		System.err.println("ocScopeMapTwo+Pid"+ocScopeMapTwo);
    		for (String key : ocScopeMapTwo.keySet()) {  //遍历map
    			for (OcScope ocScope1 : ocScopelistTwo) {  
    				if(!ocScopeMapTwo.get(key).getScopeName().equals(ocScope1.getScopeName())){//数据库没有相关数据就存入进去
//    					dao.insert(ocScopeMapOne.get(key));
				}
				}
    				
    		}

  

以上是关于安卓网格布局如何用java代码实现跨多行跨多列的主要内容,如果未能解决你的问题,请参考以下文章

安卓gridview 网格,多行多列实现

如何跨多列和多行“汇总”数据

系统地遍历 DF 的多列和多行以跨多列输出不同的列表大小

Xamarin 表单:显示和绑定具有多行和多列的列表/网格的数据

如何用EXCEL函数把多行多列按顺序转为多行一列

如何用CORS来解决JS中跨域的问题