- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android中使用ListView绘制自定义表格技巧分享由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
先上一下可以实现的效果图 要实现的效果有几方面 1、列不固定:可以根据数据源的不同生成不同的列数 2、表格内容可以根据数据源的定义合并列 3、要填写的单元格可以选择自定义键盘还是系统键盘 奔着这三点,做了个简单的实现,把源码贴一下(因为该点是主界面中的一部分,不便于放整个Demo) 自定义适配器,CallBackInterface是自定义的回调接口,这里定义回调是因为数据输入时需要及时保存 。
复制代码 代码如下
public class SiteDetailViewAdapter extends BaseAdapter implements CallBackInterface{ private Context context; private LayoutInflater inflater; private ArrayList<HashMap<String,Object>> lists; private KeyBoard keyBoard = null;//自定义键盘 private ListView listView = null; private boolean isReadOnly = false;//是否是浏览状态 private String[] arrCellType = null; private int[] arrHeadWidth = null;//每列宽度 public SiteDetailViewAdapter(Context context, ArrayList<HashMap<String,Object>> lists ,KeyBoard keyBoard,ListView listView,boolean isReadOnly ,int[] arrHeadWidth) { super(); this.context = context; this.lists = lists; inflater = LayoutInflater.from(context); this.keyBoard = keyBoard; this.listView = listView; this.isReadOnly = isReadOnly; this.arrHeadWidth = arrHeadWidth; this.listView.setAdapter(this); } @Override public int getCount() { // TODO Auto-generated method stub return lists.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int index, View view, ViewGroup arg2) { HashMap map = lists.get(index); String type = (String)map.get("rowtype"); ArrayList<ItemCell> itemCells = new ArrayList(); //String cellValue,String cellKey,long cellType,int cellInRow,int cellSpan ItemCell itemCellXuHao = new ItemCell((index+1)+"","-1",1,-1,1); itemCells.add(itemCellXuHao); for(int i=0;i<map.size()-1;i++){ ItemCell itemCell = (ItemCell)map.get(i+""); itemCells.add(itemCell); } //性能优化后需要放开注释danielinbiti if(view == null||view!=null&&!((ListItemCustom)view.getTag()).getType().equals(type)){ view = inflater.inflate(R.layout.customel_list_item, null); ListItemCustom itemCustom = (ListItemCustom)view.findViewById(R.id.custome_item); itemCustom.buildItem(type, context, isReadOnly,arrHeadWidth,itemCells,index ,this.listView,this.keyBoard,this); view.setTag(itemCustom); }else{ ListItemCustom itemCustom = (ListItemCustom)view.getTag(); itemCustom.refreshData(itemCells,index); } if(index%2 == 0){ view.setBackgroundColor(Color.argb(250 , 255 , 255 , 255 )); }else{ view.setBackgroundColor(Color.argb(250 , 224 , 243 , 250 )); } return view; } @Override public boolean exectueMethod(Object params) { String[] arr = (String[])params; HashMap map = lists.get(Integer.parseInt(arr[0])); ItemCell itemCell = (ItemCell)map.get(arr[1]); itemCell.setCellValue(arr[2]); itemCell.setIsChange(true); return false; } 。
ListView每行的布局,内部代码是有冗余的,因为是Demo,所以先以效果未准,未进行代码重构,注意不能往ListItemCustom中传入每行的Map来进行值得获取或者输入更新等操作,因为Map是按地址方式,再结合ListView的绘制方式,最终的map不是你想象的map.
复制代码 代码如下
public class ListItemCustom extends LinearLayout{ public ListItemCustom(Context context){ super(context); } public ListItemCustom(Context context, AttributeSet attrs) { super(context, attrs); } private String type = "-1"; private Context context = null; private boolean isRead = false; private int[] headWidthArr = null; private ListView listView = null; private KeyBoard keyBoard = null; private int orderNum = -1; private ArrayList<View> viewList = new ArrayList(); private int rowNum = -1; private CallBackInterface callBack = null; public void buildItem(String type,Context context,boolean isRead,int[] headWidthArr ,ArrayList<ItemCell> itemCells,int rowNum ,ListView listView,KeyBoard keyBoard,CallBackInterface callBack){ this.context = context; this.isRead = isRead; this.headWidthArr = headWidthArr; this.setOrientation(LinearLayout.VERTICAL); this.rowNum = rowNum; this.listView = listView; this.keyBoard = keyBoard; this.callBack = callBack; this.type = type; this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,45)); this.addCell(itemCells); } public void refreshData(ArrayList<ItemCell> itemCells,int rowNum){ this.rowNum = rowNum; this.refreshCells(itemCells); } private void refreshCells(ArrayList<ItemCell> itemCells){ for(int i=0;i<itemCells.size();i++){ ItemCell itemCell = itemCells.get(i); if(itemCell.getCellType()==ItemCellValueType.VALUE_NONE){ TextView view = (TextView)viewList.get(i); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); }else if(itemCell.getCellType()==ItemCellValueType.VALUE_NUMBER){ EditText view= (EditText)viewList.get(i); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); //view.setText(itemCell.getCellId()+""); //view.setTag(itemCell.getCellKey()+""); this.setEditView(view,itemCell.getCellKey()); this.setOnKeyBorad(view, itemCell.getCellInRow()); }else if(itemCell.getCellType()==ItemCellValueType.VALUE_STRING){ EditText view= (EditText)viewList.get(i); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); //view.setText(itemCell.getCellId()+""); //view.setTag(itemCell.getCellKey()+""); this.setEditView(view,itemCell.getCellKey()); } } } private int getCellWidth(int cellStart,int cellEnd){ int width = 0; for(int i=cellStart;i<cellEnd;i++){ width = this.headWidthArr[i] + width; } return width; } private void addCell(ArrayList<ItemCell> itemCells){ LinearLayout secondLayout = new LinearLayout(context); secondLayout.setOrientation(LinearLayout.HORIZONTAL); secondLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); this.addView(secondLayout); int cellIndex = 0; for(int i=0;i<itemCells.size();i++){ ItemCell itemCell = itemCells.get(i); int endIndex = cellIndex+itemCell.getCellSpan(); int width = getCellWidth(cellIndex,endIndex); cellIndex = endIndex; if(itemCell.getCellType()==ItemCellValueType.VALUE_NONE){ TextView view = (TextView)getReadView(); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); view.setWidth(width); secondLayout.addView(view); viewList.add(view); }else if(itemCell.getCellType()==ItemCellValueType.VALUE_NUMBER){ EditText view= (EditText)getInputView(); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); view.setWidth(width); //view.setText(itemCell.getCellId()+""); //view.setTag(itemCell.getCellKey()+""); this.setEditView(view,itemCell.getCellKey()); this.setOnKeyBorad(view, itemCell.getCellInRow()); secondLayout.addView(view); viewList.add(view); }else if(itemCell.getCellType()==ItemCellValueType.VALUE_STRING){ EditText view= (EditText)getInputView(); view.setId(itemCell.getCellId()); view.setText(itemCell.getCellValue()); view.setWidth(width); //view.setText(itemCell.getCellId()+""); //view.setTag(itemCell.getCellKey()+""); this.setEditView(view,itemCell.getCellKey()); secondLayout.addView(view); viewList.add(view); } if(i!=itemCells.size()-1){ LinearLayout v_line = (LinearLayout)getVerticalLine(); v_line.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); secondLayout.addView(v_line); } } } private View getVerticalLine(){ return LayoutInflater.from(context).inflate(R.layout.atom_line_v_view, null); } private View getReadView(){ return (View)LayoutInflater.from(context).inflate(R.layout.atom_text_view, null); } private View getInputView(){ return (View)LayoutInflater.from(context).inflate(R.layout.atom_edttxt_view, null); } private void setOnKeyBorad(EditText edtText1,int index){ if(!this.isRead){ onListenText(edtText1,this.listView,index); } } private void onListenText(EditText edtText,ListView listView,int index){ final ListView lsv = listView; final int idx = index; edtText.setOnFocusChangeListener(new OnFocusChangeListener(){ @Override public void onFocusChange(View arg0, boolean arg1) { if(arg1){ int[] y = getYPos(lsv,idx); keyBoard.show((EditText)arg0,y[0],y[1]); } } }); } private int[] getYPos(ListView listview,int index){ int[] yPosArr = new int[2]; Rect r = new Rect(); listview.getChildAt(0).getGlobalVisibleRect(r); int first = listview.getFirstVisiblePosition(); yPosArr[1] = (index-first+1)*r.height()+listview.getTop(); yPosArr[0] = (index-first)*r.height()+listview.getTop(); return yPosArr; } private void setEditView(EditText edtText1,final String key){ if(this.isRead){ edtText1.setEnabled(false); }else{ edtText1.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { String[] arr = new String[3]; arr[0] = rowNum+""; arr[1] = key; arr[2] = arg0.toString(); callBack.exectueMethod(arr); // ItemCell itemCell = (ItemCell)dataMap.get(key); // itemCell.setCellValue(arg0.toString()); // itemCell.setIsChange(true); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } }); } } public String getType(){ return this.type; } } 。
。
复制代码 代码如下
public class ItemCell { private String cellValue = ""; private int cellSpan = 1; private String cellKey = ""; private int cellInRow = 0; private long cellType = ItemCellValueType.VALUE_NONE; private int colNum = 0; private int rowType = 0; private int cellId = -1; private boolean isValueFromTable = false; private boolean isChange = false; public ItemCell(String cellValue,String cellKey,long cellType,int cellInRow,int cellSpan){ this.cellValue = cellValue; this.cellType = cellType; this.cellSpan = cellSpan; this.cellKey = cellKey; this.cellInRow = cellInRow; } public ItemCell(String cellValue,String cellKey,long cellType,int cellInRow){ this(cellValue,cellKey,cellType,cellInRow,1); } public void setColNum(int colNum){ this.colNum = colNum; } public int getColNum(){ return this.colNum; } public void setRowType(int rowType){ this.rowType = rowType; } public int getRowType(){ return this.rowType; } public String getCellValue(){ return cellValue; } public void setCellValue(String value){ this.cellValue = value; } public long getCellType(){ return cellType; } public int getCellSpan(){ return cellSpan; } public String getCellKey(){ return cellKey; } public int getCellInRow(){ return cellInRow; } public void setIsChange(boolean isChange){ this.isChange = isChange; } public boolean getIsChange(){ return this.isChange; } public int getCellId() { return cellId; } public void setCellId(int cellId) { this.cellId = cellId; } public boolean isValueFromTable() { return isValueFromTable; } public void setValueFromTable(boolean isValueFromTable) { this.isValueFromTable = isValueFromTable; } } 。
custome_list_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="40dp" android:orientation="vertical" android:id="@+id/test_dajej" android:background="#ffffff"> <srit.collection.widget.costomtable.ListItemCustom android:id="@+id/custome_item" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 。
以上是核心的文件内容。有了列合并,行合并也不远了。可以在自定义的布局中多加个LinearLayout来实现行合并.
最后此篇关于Android中使用ListView绘制自定义表格技巧分享的文章就讲到这里了,如果你想了解更多关于Android中使用ListView绘制自定义表格技巧分享的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!