Android ListViewのカスタムView

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bobo
記事: 11
登録日時: 13年前
住所: 千葉

Android ListViewのカスタムView

#1

投稿記事 by bobo » 13年前

はじめまして。こちらAndroidアプリ開発に聞いてもよかったでしょうか?

現在、Androidアプリを作成中です。(SDKは16です)

ダイアログを表示して、ListViewを組み込み、行をカスタム表示しているのですが、
HTMLのような一行内に列・行が複数入れられず、困ってます。

一行データとして表示したいのはこんな感じです。

-----------------------------------------
①説明
-----------------------------------------
②画像1|③画像2|④画像3
      |      |
-----------------------------------------


ListViewを使わないと縦スクロールも効かず、
ListViewを使うと一行データはLinerLayoutで縦並び or 横並びしか指定できません。
TableLayout,FrameLayoutありそうなものは色々調べたつもりですが・・、コンパイルはできても
表示時にエラーで止まってしまいます。

お分かりになる方いましたら、よろしくお願いします。

bobo
記事: 11
登録日時: 13年前
住所: 千葉

Re: Android ListViewのカスタムView

#2

投稿記事 by bobo » 13年前

すみません。
肝心の質問について。

このような行を表示する一覧のコンポーネントは何が良いのでしょうか?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: Android ListViewのカスタムView

#3

投稿記事 by ISLe » 13年前

こんな記事を見付けました。

AndroidでListView内で独自のArrayAdapterを使用する » tech-tec
http://tech-tec.com/archives/488

bobo
記事: 11
登録日時: 13年前
住所: 千葉

Re: Android ListViewのカスタムView

#4

投稿記事 by bobo » 13年前

調べて頂き、ありがとうございます。

実は私もずっとListViewを使用する際はこのカスタムViewを使っています。
ただ、それは上記のLinearLayout と同様に一方向しか指定できません。縦か横か。

私の場合、上記のように1、2は縦、2~4は横の構成となります。
縦・横に限らず、絶対値(座標)のカスタム形式でも良いのですが、
私が探したり、試した限り、存在せず、困ってます。

ListView以外には、このようなLayoutの配置系はTableLayout,FrameLayoutなどいくつかあるのですが、
ListView内のカスタムでは使えないようなのです。

或いはListLinearLayout iewも否定して他のコントロールで実現できるのであれば
何でも構わないのですが。。

bobo
記事: 11
登録日時: 13年前
住所: 千葉

Re: Android ListViewのカスタムView

#5

投稿記事 by bobo » 13年前

ごめんなさい。修正です。
>或いはListLinearLayout iewも否定して他のコントロールで実現できるのであれば

○或いはListViewも否定して他のコントロールで実現できるのであれば

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: Android ListViewのカスタムView

#6

投稿記事 by ISLe » 13年前

bobo さんが書きました:実は私もずっとListViewを使用する際はこのカスタムViewを使っています。
ただ、それは上記のLinearLayout と同様に一方向しか指定できません。縦か横か。
このようなレイアウトを使って

コード:

<?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="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/first_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

	<LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:orientation="horizontal" >
	    
	    <ImageView
	        android:id="@+id/second_view"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content" />
	    <ImageView
	        android:id="@+id/third_view"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content" />
	    	
	</LinearLayout>
</LinearLayout>
このように表示できますが、これではダメだということですか?
PriSc001.png
このレベルで実機では動かないということはないと思うのですが。

bobo
記事: 11
登録日時: 13年前
住所: 千葉

Re: Android ListViewのカスタムView

#7

投稿記事 by bobo » 13年前

ありがとうございます。

べたがきで書きますと以下、横に並列して表示しているのですが。
このようになります。(パッケージ化しており、分かりづらいかもしれませんが、ImageViewやTextViewを生成してるだけです)

ご指摘頂いた点も試してみたのです(Javaコードですが)が、
正常に動きません。

こちらのソースと違う点ですが、私のこのカスタムViewをDialog内に仕込んでいる点と
xmlでは無く、Javaで記述している事です。

下記、「convertView=layout;」で2階層のLinearLayoutで生成できそうな気もしたのですが、
コンパイルエラーとなったり、リストが全く表示されなくなったりと混乱し、
もっと簡潔に実現できるコントロールが無いか探してきた次第です。

コード:

	private class DialogAdapter extends BaseAdapter {
		
		//セルのビューの生成
		@Override
		public View getView(int idx, View convertView, ViewGroup parent) {
			
			CardDisp item=list.get(idx);
			
			//レイアウトの生成
			if (convertView==null) {
		        LinearLayout layout=ApCard.makeLinearLayout(CardDialog.context,Color.rgb(32,32,32),0,0,0,0,null,null,null);
				convertView=layout;
				
				//テキストスタイル
				layout.addView(ApCard.makeTextView(CardDialog.context,"disp",null,Color.rgb(255,255,255),14,3,28,0,0,new LinearLayout.LayoutParams(45,LinearLayout.LayoutParams.WRAP_CONTENT),Gravity.CENTER,null));

				//アイコンスタイル
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon1",0,5,0,0,new LinearLayout.LayoutParams(50,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon2",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon3",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon4",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon5",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon6",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon7",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
				layout.addView(ApCard.makeImageView(CardDialog.context,"icon8",-22,5,0,0,new LinearLayout.LayoutParams(28,82)));
			}

			//※ここで値をセットしないとViewのキャッシュが効いてスクロール時に正しく表示されない
			((TextView)convertView.findViewWithTag("disp")).setText(item.disp);
			((ImageView)convertView.findViewWithTag("icon1")).setImageBitmap(item.img1);
			((ImageView)convertView.findViewWithTag("icon2")).setImageBitmap(item.img2);
			((ImageView)convertView.findViewWithTag("icon3")).setImageBitmap(item.img3);
			((ImageView)convertView.findViewWithTag("icon4")).setImageBitmap(item.img4);
			((ImageView)convertView.findViewWithTag("icon5")).setImageBitmap(item.img5);
			((ImageView)convertView.findViewWithTag("icon6")).setImageBitmap(item.img6);
			((ImageView)convertView.findViewWithTag("icon7")).setImageBitmap(item.img7);
			((ImageView)convertView.findViewWithTag("icon8")).setImageBitmap(item.img8);

			return convertView;
		}
	}


bobo
記事: 11
登録日時: 13年前
住所: 千葉

Re: Android ListViewのカスタムView

#8

投稿記事 by bobo » 13年前

自己解決です。

ご指摘のXMLから、もう一度、プロパティをじっくり見直しました。
layout.addView(layout1);

このようにaddViewするだけで大丈夫でした。
お騒がせしてすみませんでした。

また、ご助言頂いた方には感謝です。

コード:

			//レイアウトの生成
			if (convertView==null) {
		        LinearLayout layout=ApCard.makeLinearLayout(CardDialog.context,Color.rgb(32,32,32),0,0,0,0,LinearLayout.VERTICAL,null,null);
		        //テキストスタイル
				layout.addView(ApCard.makeTextView(CardDialog.context,"disp",null,null,Color.rgb(255,255,255),14,2,2,0,0,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT),Gravity.CENTER,null));

		        LinearLayout layout1=ApCard.makeLinearLayout(CardDialog.context,Color.rgb(32,32,32),0,0,0,0,LinearLayout.HORIZONTAL,null,null);
		        layout.addView(layout1);
				convertView=layout;

				//アイコンスタイル
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon1",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon2",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon3",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon4",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon5",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon6",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon7",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
				layout1.addView(ApCard.makeImageView(CardDialog.context,"icon8",0,0,0,0,new LinearLayout.LayoutParams(50,82)));
			}

閉鎖

“C言語何でも質問掲示板” へ戻る