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 詳細説明
関連
-
Android プロジェクト コンパイル時に com.android.builder.internal.aapt.v2.Aapt2Exception に遭遇しました。AAPT2 エラー: 詳細はログを確認してください。
-
呼び出しは、ユーザーによって拒否される可能性のある許可を必要とします。
-
シンボル 'AppCompatActivity' の解決策を解決できない
-
Dalvik仮想マシンと学習プランの簡単な紹介
-
暗黙のうちに開始するアクティビティを使用するAndroidについて、Intent問題を処理するアクティビティが見つからないことが報告されました。
-
Android eclipseが起動できない:選択項目を起動できず、最近起動した項目もない
-
adb push 権限拒否の解決策
-
AndroidのEditTextにデフォルト値を設定する方法とヒントを設定する方法
-
AndroidManifestのuses-permissionの設定
-
Androidエラー:このターゲットで使用できるCPU/ABIシステムイメージがありません。
最新
-
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 Studio 3.1.2 新規プロジェクトのエラー AAPT2エラー:詳細はログを確認してください(Gradle 3.1.2)
-
Android RecyclerViewで「アダプターが接続されていません」と表示され、問題解析がスキップされる。
-
jniとjavaの間でbytearrayを受け渡しする
-
Android Studioの解決策:xxxは囲むクラスではありませんエラー
-
Android O (8.0) デスクトップショートカットを作成する
-
Androidのボトムナビゲーションバー、3つのスタイルとインプリメンテーション
-
Android ListViewでaddHeaderを使用する
-
スピナー実装のダウンメニューとイベントリスニング(グラフィックモード)
-
Mac OS X用Android Studioショートカット
-
android.content.res.Resources$NotFoundException: 文字列リソースID #0x1 Sinkhole!