在我的ImageAdapter
(扩展为BaseAdapter
)中,每个View
是我称为ImageTapView
的自定义视图。这是一个单独的类,它使用自己的以RelativeLayout
开头的布局文件扩展<merge>
。此类包含所有单击侦听器,每个ImageTapView
从Internet下载和显示的图像的加载器,以及单击时发生的动画。
这是我的ImageAdapter
构造函数:
public class ImageAdapter extends BaseAdapter {
private Context context;
private JSONArray posts;
private String baseUrl;
private HashMap views = new HashMap();
public ImageAdapter(Context _context, JSONArray _posts, String _baseUrl){
context = _context;
posts = _posts;
baseUrl = _baseUrl;
}
...etc
}
在我的
ImageAdapter.getView
中,如果执行以下操作,则一切正常:public View getView(int position, View convertView, ViewGroup parent){
// create new imageTapView
JSONObject thisPost = posts.getJSONObject(position);
convertView = new ImageTapView(context, thisPost);
return convertView;
}
但这意味着Android每次调用
ImageTapView
时都会创建一个新的getView
,而不仅仅是替换已经膨胀的视图中的数据。我认为进入和替换每个字段并重置getView
上的动画会更困难,更不用说了,我希望用户查看在与ImageTapView
的交互中它们停在哪里(例如缩放在图片上或在动画中间)。我尝试将每个视图保存到名为
HashMap
的views
中:public View getView(int position, View convertView, ViewGroup parent){
if(views.containsKey(position)) return (ImageTapView) views.get(position);
// create new imageTapView
JSONObject thisPost = posts.getJSONObject(position);
convertView = new ImageTapView(context, thisPost);
views.put(position, convertView);
return convertView;
}
但是我得到一些非常奇怪的行为。
ImageTapViews
处于交互的3个步骤(开始状态,缩放状态,信息覆盖显示状态)中的第2步,事情真的很奇怪。他们似乎没有从中断的地方接起电话,也没有以全新的ImageTapView
正确的方式响应点击。那么在
ListView
中是否有一种标准的方法来缓存对象或自定义对象?我应该扩展ArrayAdapter
还是在getView
函数中遇到同样的问题?提前致谢!
最佳答案
试试这个,你需要创建额外的方法setPost()来设置发布
public View getView(int position, View convertView, ViewGroup parent){
// create new imageTapView
JSONObject thisPost = posts.getJSONObject(position);
if(convertView==null)
convertView = new ImageTapView(context, thisPost);
else{
((ImageTapView)convertView).setPost(thisPost);
}
return convertView;
}
关于java - 如何在ListView适配器中缓存自定义 View ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26333601/