1. ホーム
  2. android

AndroidでListViewを使ってカスタムテーブルを描画する

2022-02-17 13:25:38

まずは、どんなことが実現できるのか、イメージしてみましょう 



達成すべき効果はいくつかあります。

1. 列が固定されていない:データソースによって異なる列を生成することができる

2、テーブルの内容は、データソースの定義によると、列をマージすることができます

3、記入される細胞は注文のキーボードかシステム キーボードを選ぶことができます


この3点を実行し、簡単な実装を行い、ソースコードを掲載します(ポイントはメインインターフェイスの一部であるため、全体のデモを置くのは簡単ではありません)。

カスタムアダプタ、CallBackInterfaceはカスタムコールバックインタフェースで、入力されたデータを時間内に保存する必要があるため、コールバックはここで定義されています。

public class SiteDetailViewAdapter extends BaseAdapter implements CallBackInterface{
	private Context context;
	private LayoutInflater inflater;
	private ArrayList<HashMap<String,Object>> lists;
	private KeyBoard keyBoard = null;//Custom keyboard
	private ListView listView = null;
	private boolean isReadOnly = false;//Whether it is browsing state
	private String[] arrCellType = null; 
	private int[] arrHeadWidth = null;//the width of each column
	
	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);
		}
		// performance optimization after the need to release the annotation 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のレイアウトの各行は、内部コードが冗長で、それはデモなので、効果に最初に承認されていない、ないコードのリファクタリング、あなたがListItemCustomに渡すことができないことに注意してくださいマップの各行は、取得または入力更新や他の操作に価値があるのでアドレス方法で、次にListViewが描かれていると組み合わせて、最後のマップはあなたが考えるマップではありません。

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
		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)getVert



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を追加して、行のマージを実装することができます。