日高 さん
ma です
ご教示頂きました修正箇所を直したところ、全て意図するところの動作が確認できました^^
具体的な、修正箇所については、日高さんご指摘のとおりそのままなのですが、ご報告をいたします。
まず、findViewByIdでNULLが返却されてしまう問題
実は、Inflater について、私自身あまり理解していなかったのですが、今回ご指摘いただいたことで理解を深めることができました。
LayoutInflater の inflate メソッドを実行することで、自アクティビティ以外の外部定義のレイアウトが展開できるというこ
とでしょうか。
以下、アップロードしたサンプルコードの修正箇所を抜粋
LayoutInflater inflater;
inflater = LayoutInflater.from(ListViewAct.this);
View itemview;
itemview = inflater.inflate(R.layout.listitem, listview);
adapter = new ExtendsAdapter(ListViewAct.this);
listview.setAdapter(adapter);
progress = (ProgressBar) itemview.findViewById(R.id.ITEM_PROGRESS);
adapter.addView(itemview);
これで、Row データのレイアウトからオブジェクトを取得することができました。
HashMapに詰め込んでいるのに、getViewでまたインフレートしている問題
BaseAdapter の拡張クラスですが、恥ずかしながら、いろんなサンプルを見ながら流用しており、理解が浅い部分ではありました。
こちらもご指摘いただいたことで理解を深めることができました。
1. BaseAdapter の拡張クラス内で持つ HashMap は、View のオブジェクトだけにしました。
private HashMap<Integer, View> mHashView;
2. addData メソッドで、タイトルテキストとプログレスバーのオブジェクトを受け取っていましたが、ここも View オブジェクト一本
に修正
public void addView (View view) {
mHashView.put(new Integer(mHashView.size()), view);
}
3. getView 内の Inflate を廃止し、addView メソッドで追加された HashMap を参照し、
convertView に格納。
holder オブジェクトに convertView を設定。
convertView = (View) mHashView.get(position);
holder = new ViewHolder();
holder.view = convertView;
convertView.setTag(holder);
4. holder クラスのメンバを、View オブジェクトのみに修正
static class ViewHolder {
View view;
}
実は、ここ4日ほ程いろいろと試しては、はまっていたので、本当に感謝です!
日高 さん、江川さん、この度はご教示ありがとうございました。
また、質問を登校させていただくかもしれませんが、よろしくお願いいたします。