在我的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的交互中它们停在哪里(例如缩放在图片上或在动画中间)。

我尝试将每个视图保存到名为HashMapviews中:

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/

10-09 19:26