前提・実現したいこと
Android StudioでEXCELのようなアプリを作成したいと考えています。
そこでGridViewを使ってセルを作成しようとしています。ここで重要な事は設定操作によってセル幅を変更する事です。具体的には、列数は5つで、設定画面でこれらの幅の割合を指定すればテーブル表示画面を表示すると、この割合に沿った幅を持つ列で構成されるテーブルが表にしたいのです。(高さも設定値ですが全行同じで構わないです)
GridViewをActivity_Main.xmlに、カスタムセルをrecord_cell.xml、AdapterをRecordAdapter.java、GridViewの表示をMain_Process.java(MainActivity.javaから呼ばれる)に書きました。
そして、Adapterの中で、AbsListView.LayoutParamsを使用してそれぞれのカラムの幅を設定しますがカラム内のEditTextの幅は変わるものの列は5等分されているようです。(下図)
列幅も設定された割合にして下図の上部にあるメニュー/確認事項/結果/入力者/特記事項(LnearLayoutで並べた)のようにしたいのですが、どうすればよいでしょうか?
なお、AbsListView.LayoutParamsで使用されているsWidthは直前の画面で取得したスクリーン幅です。
発生している問題・エラーメッセージ
列幅は常に全て画面の1/5になってしまいます。
セル内のEditBoxのサイズは変えられますがスペースが出来るだけになります。
画像の1~10を表示している部分です。
その上のメニュー~特記事項のように表示したいのです。(これはLinearLayout)
該当のソースコード
XLM
1Main_procell.xml 2 3<LinearLayout 4 xmlns:android="http://schemas.android.com/apk/res/android" 5 ・ 6 ・ 7 8 // 記録表示他 9 <GridView 10 android:id="@+id/recordLayoutRec" 11 android:layout_width="match_parent" 12 android:layout_height="0dp" 13 android:layout_weight="1" 14 android:layout_marginTop="1dp" 15 android:layout_marginLeft="1dp" 16 android:horizontalSpacing="1dp" 17 android:numColumns="5" 18 android:stretchMode="columnWidth"></GridView> 19 ・ 20 ・ 21 </LinearLayout>
XML
1record_cell.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent"> 7 8 <EditText 9 android:id="@+id/recordText" 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:textSize="@dimen/textSize" 13 android:background="@color/whiteColor" 14 android:textColor="@color/blackColor" 15 android:textAlignment="viewStart"/> 16 17</LinearLayout>
JAVA
1ProcessActivity.java(関連部分のみ) 2 3 // 記録入力部分のセル設定 4 recordGridView = findViewById(R.id.recordLayoutRec); 5 mRecordAdapter = new RecordAdapter(this, common.bodyDisplay, common.columnRatioOfBody, common.cellHeight, screenWidth); 6 recordGridView.setAdapter(mRecordAdapter); 7 // 上記のscreenWidthは移動前のクラスで獲得したスクリーンの幅
JAVA
1Common.java(関連部分のみ) 2 3public List<String> bodyDisplay = new ArrayList<>(Arrays.asList("1","2","3","4","5","6","7","8","9","10")); 4public List<Integer> columnRatioOfBody = new ArrayList<>(Arrays.asList(20,25,7,13,35,20,25,7,13,35)); 5public int cellHeight = 80;
JAVA
1RecordAdapter.java 2 3public class RecordAdapter extends BaseAdapter { 4 private List<String> recordArray = new ArrayList(); 5 private Context mContext; 6 private LayoutInflater mLayoutInflater; 7 private List<String> bDisp = new ArrayList<>(); 8 private List<Integer> bRatio = new ArrayList<>(); 9 private Integer cHeight; 10 private Integer sWidth; 11 protected int lastPosition = -1; 12 13 //カスタムセルを拡張したらここでWidgetを定義 14 private static class ViewHolder { 15 public EditText recordText; 16 } 17 18 public RecordAdapter(Context context, List<String > bodyDisplay, List<Integer> columnRatioOfBody, Integer cellHeight, Integer screenWidth) { 19 mContext = context; 20 mLayoutInflater = LayoutInflater.from(mContext); 21 bDisp = bodyDisplay; 22 bRatio = columnRatioOfBody; 23 cHeight = cellHeight; 24 sWidth = screenWidth; 25 } 26 27 @Override 28 public int getCount() { 29 return bDisp.size(); 30 } 31 32 @Override 33 public View getView(int position, View convertView, ViewGroup parent) { 34 if (getCount()>1){ 35 if(lastPosition == 0 && position == 0 && convertView != null){ 36 return convertView; 37 } 38 } 39 lastPosition = position; 40 41 RecordAdapter.ViewHolder holder; 42 if (convertView == null) { 43 convertView = mLayoutInflater.inflate(R.layout.record_cell, null); 44 holder = new ViewHolder(); 45 holder.recordText = convertView.findViewById(R.id.recordText); 46 convertView.setTag(holder); 47 } else { 48 holder = (RecordAdapter.ViewHolder) convertView.getTag(); 49 } 50 51 //セルのサイズを指定 52 53 float dp = mContext.getResources().getDisplayMetrics().density; 54 AbsListView.LayoutParams params = new AbsListView.LayoutParams(sWidth / 100 * bRatio.get(position) - 1, cHeight - 1); 55 convertView.setLayoutParams(params); 56 57 //position部分のみ表示させる 58 holder.recordText.setText(bDisp.get(position)); 59 60// convertView.setBackgroundColor(Color.WHITE); 61 62 return convertView; 63 64 } 65 @Override 66 public long getItemId(int position) { 67 return 0; 68 } 69 70 @Override 71 public Object getItem(int position) { 72 return null; 73 } 74}
試したこと
record_cell.xmlのandroid:layout_widthをwrap_contentにしたり、GridViewのstretchModeをnone等変えてみましたがダメでした。
補足情報(FW/ツールのバージョンなど)
Android Studioのバージョンは4.1です。
回答1件
あなたの回答
tips
プレビュー