カスタム SimpleAdapter が関連付けられたリストビューがあります。カスタムの SimpleAdapter を作成したのは、含まれている textview と imageview に、他のリスト項目ウィジェットとは異なるイベント ハンドラーを関連付けたいからです。したがって、基本的に、リスト項目の 2 つの部分に対して 2 つの異なるイベント ハンドラーがあります。
私のSimpleAdapterのカスタマイズは次のとおりです。
class ClickableButtonListAdapter extends SimpleAdapter {
private static class ViewHolder {
TextView text;
ImageView image;
}
public ClickableButtonListAdapter(Context context,
List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
}
@SuppressWarnings("unchecked")
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
ViewHolder holder = (ViewHolder) view.getTag();
if(holder == null) {
holder = new ViewHolder();
holder.text = (TextView) view.findViewById(R.id.comments);
holder.image = (ImageView) view.findViewById(R.id.arrow);
view.setTag(holder);
final Context context = view.getContext();
final HashMap<String, String> article = (HashMap<String,String>) getItem(position);
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View view) {
String item_id = article.get("item_id");
Intent intent = new Intent(context, HNewsCommentsActivity.class);
intent.putExtra("item_id", item_id);
context.startActivity(intent);
}
};
holder.text.setOnClickListener(listener);
holder.image.setOnClickListener(listener);
}
return view;
}
}
その後、onCreate アクティビティで、カスタム SimpleAdapter を次のように関連付けます。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
final ArrayList<HashMap<String, String>> articles = getHNewsFeed();
final SimpleAdapter adapter = new ClickableButtonListAdapter(this,
articles, R.layout.article,
new String[] {"title", "urlShort", "score", "comments", "item_id"},
new int[] {R.id.title, R.id.url, R.id.score, R.id.comments, R.id.item_id}
);
final ListView l = (ListView) findViewById(android.R.id.list);
l.setAdapter(adapter);
l.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
final HashMap<String, String> article = articles.get(position);
String url = article.get("url");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
});
} catch (Exception e) {
Log.w(TAG, e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
私の問題は、含まれている textview と imageview (カスタム SimpleAdapter の getView で初期化する) に関連付けられたイベント ハンドラーが、間違ったデータ ソース項目を取得し、クリックすると別の記事のデータを表示するように見えることです。ただし、リストビュー アイテムのクリック ハンドラーは、正しいデータ ソース アイテムを取得します。カスタム SimpleAdapter の getView で textview と imageview に関連付けたイベント ハンドラーが正しく機能しない理由を指摘してくれる人がいますか? 私の理解では、SimpleAdapter の 'getItem(position)' メソッドは正しいデータ ソース アイテムを返す必要があります。しかし、何らかの理由で、そうではないようです。