ネット上で見つけて利用させて頂いている
https://akira-watson.com/android/baseadapter.html より
BaseAdapterを継承したTestAdapterというものがあります。
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class TestAdapter extends BaseAdapter { private LayoutInflater inflater; private int layoutID; private String[] namelist; private String[] emaillist; private Bitmap[] photolist; static class ViewHolder { //今回質問question ここのclassを外すことはできないのか。 TextView text; TextView email; ImageView img; } TestAdapter(Context context, int itemLayoutId, String[] names, String[] emails, int[] photos ){ inflater = LayoutInflater.from(context); layoutID = itemLayoutId; namelist = names; emaillist = emails; // bitmapの配列 photolist = new Bitmap[photos.length]; // drawableのIDからbitmapに変換 for( int i = 0; i< photos.length; i++){ photolist[i] = BitmapFactory.decodeResource(context.getResources(), photos[i]); } } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(layoutID, null); holder = new ViewHolder(); holder.img = convertView.findViewById(R.id.img_item); holder.text = convertView.findViewById(R.id.text_view); holder.email = convertView.findViewById(R.id.text_mail); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img.setImageBitmap(photolist[position]); String str = "Staff ID.170900"+ String.valueOf(position+1) + "\n\nEmail: " + emaillist[position] + "\nTel: 020-8931-9933 #340" + String.valueOf(position+1); holder.email.setText(str); holder.text.setText(namelist[position]); return convertView; } @Override public int getCount() { return namelist.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } }
以上は正常に動くサンプルですが、
自分の中で疑問が起きまして、
値を保持するための ViewHolderクラスというものに目がいきまして、
static class ViewHolder {
TextView text;
TextView email;
ImageView img;
}
確かにこれで値は保持されるのかもしれませんが、
このViewHolder というクラスを作成して
その中に
TextView text;
TextView email;
ImageView img;
というものを作成してやる必要があるのか疑問に思えました。
getViewメソッド以下に
ViewHolder holder;
として、
holder.img = convertView.findViewById(R.id.img_item); とか
holder.text = convertView.findViewById(R.id.text_view); という形でなく、
ViewHolder holder; とわざわざしなくて
TextView text;
TextView email;
ImageView img;
これらをもとに
もっとダイレクトに記載できないものかと。
text = convertView.findViewById(R.id.text_view);
そして自分が作成してみたコードは以下になります。
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class TestAdapter extends BaseAdapter { private LayoutInflater inflater; private int layoutID; private String[] namelist; private String[] emaillist; private Bitmap[] photolist; TextView text; TextView email; ImageView img; TestAdapter(Context context, int itemLayoutId, String[] names, String[] emails, int[] photos ){ inflater = LayoutInflater.from(context); layoutID = itemLayoutId; namelist = names; emaillist = emails; // bitmapの配列 photolist = new Bitmap[photos.length]; // drawableのIDからbitmapに変換 for( int i = 0; i< photos.length; i++){ photolist[i] = BitmapFactory.decodeResource(context.getResources(), photos[i]); } } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(layoutID, null); img = convertView.findViewById(R.id.img_item); text = convertView.findViewById(R.id.text_view); email = convertView.findViewById(R.id.text_mail); convertView.setTag(img); convertView.setTag(text); convertView.setTag(email; } else { img = (ImageView) convertView.getTag(); text = (TextView) convertView.getTag(); email = (Texiview) convertView.getTag(); } img.setImageBitmap(photolist[position]); String str = "Staff ID.170900"+ String.valueOf(position+1) + "\n\nEmail: " + emaillist[position] + "\nTel: 020-8931-9933 #340" + String.valueOf(position+1); email.setText(str); text.setText(namelist[position]); return convertView; } @Override public int getCount() { return namelist.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } }
しかしこちらは
img = (ImageView) convertView.getTag(); の箇所にエラーが出てしまいました。
android.widget.TextView cannot be cast to android.widget.ImageView
TextView text;
TextView email;
ImageView img;
これらのものはclassで囲ってやって、
ViewHolder holder; のようにして、
それを
holder.text
holder.email
holder.img
のように必ずしなくてはいけないのでしょうか?
質問の目的は、adapterそのものもありますが、それよりも
classとかjavaの文法、書き方、変数の書き方など基本的なことを知りたいため、
今回このような質問をさせていただきました。申し訳ございません;
乱れた文章でありますが申し訳ありません・・よろしくお願いいたします;
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/07 23:55