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;
}
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を追加して、行のマージを実装することができます。
関連
-
NetworkOnMainThreadException
-
デフォルトのアクティビティが見つからない場合の対処法
-
GIF、Lottie、SVGA
-
Android のパッケージングに失敗し、Android リソースのリンクに失敗したことを示すプロンプトが表示される
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
問題 ---- Android ---- ActivityManager: Error: アクティビティクラス{xx/xx.MainActivity}が存在しない
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
アンドロイドにおけるトークンの利用
-
CursorIndexOutOfBoundsException:インデックス -1 が要求されました。
-
StrictMode$AndroidBlockGuardPolicy.onNetwork は android.os の下でエラーになります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android端末にADBが接続できない!を解決。理由: デバイスが認証されていない!
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
android.os の NetworkOnMainThreadException。
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
Android Studio を 3.6.3 にアップデートした後、構成 :classpath のアーティファクトをすべて解決できない。
-
Android TextViewにandroid:ellipsize=endのバグがある。
-
view.getRootView()の本当の意味とテストについて
-
アンドロイドの遅延実行のいくつかの方法
-
Android Studioのgitの使用とgitの設定パス
-
android.view.inflateexception 例外処理