我有一个与自定义 SimpleAdapter 关联的列表视图。我制作了自定义 SimpleAdapter,因为我想将不同的事件处理程序与包含的 textview 和 imageview 相关联,而不是其余的列表项小部件。所以,基本上我对列表项的两个部分有两个不同的事件处理程序。
我的 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 中初始化)似乎得到了错误的数据源项,并在单击时显示不同文章的数据。然而,listview 项单击处理程序获取正确的数据源项。有人可以帮我指出为什么我与自定义 SimpleAdapter 的 getView 中的 textview 和 imageview 关联的事件处理程序不能正常工作吗?我的理解是 SimpleAdapter 的 'getItem(position)' 方法应该返回正确的数据源项。但由于某种原因,它似乎没有这样做。