1. ホーム
  2. Android

Android開発用アダプターシリーズ。カスタムアダプタを使ったスピナー

2022-02-17 17:06:05
1. 以前言われたこと
前のブログ記事 <小 <小 Android開発アダプタシリーズ。スピナーバインディング ArrayAdapter アダプタ 最も基本的な配列表示を解決するために、ArrayAdapterアダプタを使用してSpinnerを実装しました。今回のブログでは、以下のようなメニューでItemオプションに複数のコントロールが含まれる場合に、カスタムアダプタを使用する方法を実装します。
2. カスタムアダプタでのLayoutInflaterの使用
LayoutInflater は実際の開発において非常に有用なクラスで、その役割は findViewById() と似ています。違いは、LayoutInflaterはres/layout/の下にあるxmlレイアウトファイルを見つけてインスタンス化するために使われ、一方findViewById()はxmlレイアウトファイルの下にある特定のウィジェットコントロール(ボタン、テキストビューなど)を見つけるために使われるという点です。
具体的な役割
1. ロードされていない、あるいは動的にロードしたいインターフェースについては、LayoutInflater.inflate()を使用してロードする必要があります。
2. 既にロードされたインターフェースについては、Activiyt.findViewById()メソッドを使用して、その中のインターフェース要素を取得することができます。
LayoutInflaterの使用方法は2つあります。
方法1
private LayoutInflater listContainer ; // View container
listContainer = LayoutInflater. from (context); // Create the view container and set the context
convertView = listContainer .inflate(R.layout. list_item , null ); // Get the view of the list_item layout file

方法1
private LayoutInflater inflater ;
inflater = (LayoutInflater) context.getSystemService(Context. LAYOUT_INFLATER_SERVICE );
convertView = inflater .inflate( R.layout. list_item , null ); //generate the item interface object

3. 効果画像
4. ソースコード例
main.xml レイアウトファイル
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:orientation="vertical">

    <TextView
        android:id="@+id/selectTextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Spinner android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner" />

</LinearLayout>

item.xml レイアウトファイル
item.xml レイアウトファイルは、コントロールの両端の整列を実装しています。両端の整列を実現するために、真ん中にコントロールを追加してweight=1という属性を設定しています。
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="20sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="20sp" />

</LinearLayout>

movie.java
package com.andieguo.myspinnerdemo;

public class Movie {
	private String imageName;
	private String name;
	private Double time;
	public Movie(String name, Double time) {
		super();
		this.name = name;
		this.time = time;
	}
	public String getImageName() {
		return imageName;
	}
	public void setImageName(String imageName) {
		this.imageName = imageName;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Double getTime() {
		return time;
	}
	public void setTime(Double time) {
		this.time = time;
	}
	
}


MyAdapter.java

package com.andieguo.myspinnerdemo;

import java.util.List;


import android.content;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
	private List<Movie> list;
	private Context context;// Context

	public MyAdapter(List<Movie> list, Context context) {
		super();
		this.list = list;
		this.context = context;
	}

	public final class ListItemView {//Cached values
		public TextView textView1;
		public TextView textView2;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	// When to execute getView
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		LayoutInflater layoutInflater = LayoutInflater.from(context);// // Create the view container factory and set the context
		ListItemView listView = null;
		if (convertView == null) {
			convertView = layoutInflater.inflate(R.layout.item, null); // Create the view for the list_item.xml layout file
			listView = new ListItemView();
			listView.textView1 = (TextView) convertView.findViewById(R.id.textView1);
			listView.textView2 = (TextView) convertView.findViewById(R.id.textView2);
			convertView.setTag(listView);
		} else {
			listView = (ListItemView) convertView.getTag();
		}
		listView.textView1.setText(list.get(position).getName());
		setText(list.textView2.setText(list.get(position).getTime() + "min");
		return convertView;
	}

}

MainActivity.java
package com.andieguo.myspinnerdemo;

import java.util.ArrayList;

import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
OnItemSelectedListener; import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget;

public class MainActivity extends Activity {
	private Spinner spinner = null;
	private TextView selectTextview = null;
	private MyAdapter myAdapter = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		spinner = (Spinner) findViewById(R.id.spinner);
		selectTextview = (TextView) findViewById(R.id.selectTextview);
		List<Movie> movies = new ArrayList<Movie>();
		for(int i=0;i<2;i++){//add data
			movies.add(new Movie("When Happiness Comes Knocking",120.0));
			movies.add(new Movie("King of Thieves", 60.0));
		}
		myAdapter = new MyAdapter(movies,this);
		spinner.setAdapter(myAdapter);
		spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<? > parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				selectTextview.setText("The movie you selected is: " + ((Movie)myAdapter.getItem(position)).getName());
			}

			@Override
			public void onNothingSelected(AdapterView<? > parent) {
				// TODO Auto-generated method stub
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


5. 参考
LayoutInflaterは、セクションリファレンスを使用してください。 Android LayoutInflater 詳細説明