質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

997閲覧

リストビューのタイトルを真ん中にも入れたい

komon4242

総合スコア21

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/10/26 05:42

いつもお世話になっています。
タイトルの内容で質問があります。

リストビューにタイトル(ヘッダ)をつけたいので以下の様なコードを書きました。

java

1class MainActivity extends AppCompatActivity{ 2 3 private ListView listView; 4 private CustomAdapter adapter; 5 private List<String> list = new ArrayList<>(); 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 12 13 // 表示するListにデータを詰める 14 for(int i=0; i < 100 ; i++){ 15 list.add("data "+ Integer.valueOf(i)); 16 } 17 18 // Adapter - CustomAdapter::BaseAdapter 19 adapter = new CustomAdapter(this, list); 20 21 // ListViewに表示 22 listView = (ListView) findViewById(R.id.list_item); // Viewの紐づけ 23 // タイトル(ヘッダ)をつける 24 View titleView = View.inflate(this, R.layout.header_list, null); // 第3引数は選択可否フラグ 25 listView.addHeaderView(titleView, list, false); 26 27 // カスタムリストをセットする 28 listView.setAdapter(adapter); 29 } 30}

これで一応タイトルをつける事は出来ましたが、
例えば30行目と60行目と90行目にもタイトルをつけたいのですがどうやれば良いでしょうか?

ヒントだけでもお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

翌日立って見直してみると、言わんとしている事は分かるが何を言いたいのかが分からないタイトルになってますね。
これでは回答はおろかViewも少ないわけだ。
グループごとのタイトルって言う名前が良かったですかね。

結論から言うと出来ました。
getView()の中で同じタイトルのリストが続く時はsetVisibility(View.GONE)を使って
詰めて非表示すれば、期待する表示になりますね。

こんな感じのクラスを作っておいて

java

1class Data { 2 String Title; 3 String data; 4 5 public Data(String title, String data){ 6 this.Title = title; 7 this.data = data; 8 } 9}

MainActivityのListにデータを詰める所でこういう風に変更する。

java

1private List<Data> list = new ArrayList<>(); // 定義はこういう風にする 2 3// 表示するListにデータを詰める 4for(int i=0; i < 100 ; i++){ 5 if((i%5)==0) { 6 // タイトルの時はdataをnullにする 7 list.add(new Data("Group " + Integer.valueOf(i/5+1), null)); 8 } 9 // dataの時はタイトルをnullにする 10 list.add(new Data(null, "data " + Integer.valueOf(i))); 11}

getViewでタイトルの箇所だけ表示したい場合はこういう風にする

java

1@Override 2public View getView(int pos, View convertView, ViewGroup parent) { 3 4 ViewHolder holder; 5 6 if (convertView == null) { // 再利用できるViewがない 7 8 convertView = inflate.inflate(R.layout.activity_item_view, parent, false); 9 10 holder = new ViewHolder(); 11 holder.titleView = convertView.findViewById(R.id.groupTitle); 12 holder.textView = convertView.findViewById(R.id.textview); 13 14 // holderオブジェクトの保存 15 convertView.setTag(holder); 16 } else { 17 // 再利用できるViewがある 18 holder = (ViewHolder) convertView.getTag(); 19 } 20 21 Data item = getItem(pos); 22 23 if (item.Title != null ) { 24 // タイトルがあるとき 25 holder.titleView.setVisibility(View.VISIBLE); 26 holder.titleView.setText(item.Title); 27 holder.textView.setVisibility(View.GONE); 28 } else { 29 // dataがあるとき 30 holder.titleView.setVisibility(View.GONE); 31 holder.textView.setVisibility(View.VISIBLE); 32 holder.textView.setText(item.data); 33 } 34 35 return convertView; 36}

結果
リストビューにグループタイトルを

他に実装方法があればぜひ教えてください。

投稿2017/10/27 01:05

komon4242

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ViewType を分けています.

まず共通の Item 型を定義し

Java

1abstract class Item { 2 long _id; //getItemId用 3 ViewTypes viewType; //getItemViewType用 4 5 enum ViewTypes { 6 TITLE, DATA 7 } 8 9 abstract View createView(LayoutInflater layoutInflater, ViewGroup parent); 10 abstract void setValues(View convertView); 11}

種類毎に継承してクラスを作ります. (以下はタイトルとデータの場合)

Java

1class TitleItem extends Item { 2 private String title; 3 TitleItem(String title) { 4 viewType = ViewTypes.TITLE; //'タイトル' タイプ 5 this.title = title; 6 } 7 private class ViewHolder { //TitleItem で必要な分 8 TextView textView; 9 } 10 @Override 11 View createView(LayoutInflater layoutInflater, ViewGroup parent) { 12 ViewHolder vh = new ViewHolder(); 13 View view = layoutInflater.inflate(R.layout.list_title, parent, false); 14 vh.textView = view.findViewById(R.id.list_title_textView); 15 view.setTag(vh); 16 return view; 17 } 18 @Override 19 void setValues(View convertView) { 20 ViewHolder vh = (ViewHolder) (convertView.getTag()); 21 vh.textView.setText(title); 22 } 23} 24class DataItem extends Item { 25 private String data1; 26 private String data2; 27 DataItem(String data1, String data2) { 28 viewType = ViewTypes.DATA; //'データ' タイプ 29 this.data1 = data1; 30 this.data2 = data2; 31 } 32 private class ViewHolder { //DataItem で必要な分 33 TextView textView1; 34 TextView textView2; 35 } 36 @Override 37 View createView(LayoutInflater layoutInflater, ViewGroup parent) { 38 ViewHolder vh = new ViewHolder(); 39 View view = layoutInflater.inflate(R.layout.list_data, parent, false); 40 vh.textView1 = view.findViewById(R.id.list_data_textView1); 41 vh.textView2 = view.findViewById(R.id.list_data_textView2); 42 view.setTag(vh); 43 return view; 44 } 45 @Override 46 void setValues(View convertView) { 47 ViewHolder vh = (ViewHolder) (convertView.getTag()); 48 vh.textView1.setText(data1); 49 vh.textView2.setText(data2); 50 } 51}

リストビュー用のアダプタはItemのリストを保持しておき、それにTitleItemやDataItemを入れておきます.

Java

1 private List<Item> list = new ArrayList<Item>(); 2 3 for(int i=0; i<100; i++) { 4 if(i%5 == 0) { 5 list.add(new TitleItem("group "+(i/5+1))); 6 } 7 list.add(new DataItem("data "+i, "test"); 8 }

また, ViewTypeに関するメソッドを2つOverwriteし, getViewでは各Itemのメソッドを呼びます.

Java

1 @Override 2 public int getViewTypeCount() { 3 return Item.ViewTypes.values().length; //Item.ViewTypesに定義された件数 4 } 5 @Override 6 public int getItemViewType(int position) { 7 return list.get(position).viewType.ordinal(); //enumで自動で付けられる番号 8 } 9 10 @Override 11 public View getView(int position, View convertView, ViewGroup parent) { 12 Item item = list.get(position); 13 if(convertView == null) { 14 convertView = item.createView(layoutInflater, parent); 15 } 16 item.setValues(convertView); 17 return convertView; 18 }

Item の種類がもっとあって, でも表示するレイアウトは使いまわせる場合等は, View 関係を Item から ViewTypes に移してもいいかもしれません.

投稿2019/01/19 09:36

編集2019/01/19 13:26
jimbe

総合スコア12512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問