public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {
// new method
private ListView listView;
private AsyncImageLoader asyncImageLoader;
private ImageAndText imageAndText;
//constructor
public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts) {
super(activity, 0, imageAndTexts);
asyncImageLoader = new AsyncImageLoader();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Activity activity = (Activity) getContext();
////////////////////////////////////////////////////////////////////////////////////////////////
// Load the image and set it on the ImageView
//new method
// Inflate the views from XML
View rowView = convertView;
ViewCache viewCache;
if (rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.image_and_text_row, null);
viewCache = new ViewCache(rowView);
rowView.setTag(viewCache);
} else {
viewCache = (ViewCache) rowView.getTag();
}
imageAndText = getItem(position);
Button btn2=(Button) findViewById(R.id.button1);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//...........
}
});
此适配器用于ListView,它采用image_and_text_row.xml表示listview的行数据。当我将点击监听器设置为btn2时,程序崩溃了。如果删除了监听器,那么程序运行正常。
问题是为什么适配器不能在代码中有一个按钮点击监听器?
答案 0 :(得分:1)
只是在黑暗中拍摄:但您的行Button btn2=(Button) findViewById(R.id.button1);
指的是适配器所在的ListActivity或ListView。因此,R.id.button1
不存在...
您是否尝试过:Button btn2=((Button)rowView.findViewById(R.id.button1));
这可能是您的问题(无法看到您的logcat,即)。 findViewById()
找到孩子。原始语句将查找活动或视图的子项。这个新语句将找到rowView的子项。
当然,这是一个假设,因为你没有完全描述应用程序或问题,我必须根据我们所拥有的信息假设每行都有一个按钮。
希望这有帮助,
FuzzicalLogic
P.S。希望你注意到如果缺乏相关信息,你会得到像这样的伪劣答案。一个很好的指南是:1)发生了什么? 2)你期望发生什么? 3)您的调试资源表明了什么? 4)我们需要知道哪些补充研究或概念?这会导致更长的问题,但它们肯定更有效,因此它们的答案也是如此。
答案 1 :(得分:0)
您应该将onClick添加到按钮所在的xml文件中。 还要确保您的按钮位于您正在膨胀的相同布局中。