Android中使用ListView繪製自訂表格格

來源:互聯網
上載者:User

先上一下可以實現的 

要實現的效果有幾方面

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);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn lists.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic 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 cellSpanItemCell 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);}//效能最佳化後需要放開注釋danielinbitiif(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;}@Overridepublic 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(){@Overridepublic 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來實現行合并。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.