listfragment中的奇怪错误

时间:2013-10-06 22:31:44

标签: android android-sqlite android-listfragment android-adapter

我想学习android sqlite所以我创建了一个即时标记应用程序,用户可以在其中标记他的照片并将其上传到他的网络(谷歌+,fb,推特)问题是我有ListFragment其中用户可以看到他所做的所有标记,列表中的图像元素存储在一个隐藏文件夹中,并且这些单词存储在sqlite数据库中。问题是在向上或向下滚动某些项目时只需随意切换加即使我有更多超过8个项目他们重复显示8个第一项(即1-8而不是9-12我再看到1-4) 唯一的问题可能是在适配器中,但在调试会话的会话后我找不到问题我的适配器代码是 -

public class FlowAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, List<String>>> data;
    private static LayoutInflater layoutInflater = null;

    public FlowAdapter(Activity activityContext,
            ArrayList<HashMap<String, List<String>>> data) {
        this.activity = activityContext;
        this.data = data;
        this.layoutInflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return data.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // method variables
        ViewHolder cacheView;
        HashMap<String, List<String>> photos = null;
        photos = data.get(position);
        ImageView iv;
        FlowLayout flow;

        ArrayList<String> subjects = new ArrayList<String>();

        if (convertView == null) {
            cacheView = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.list_item, null);
            flow = (FlowLayout) convertView.findViewById(R.id.flow_tags);;

            // add the tags to the flowlayout
            int size = photos.get(DatabaseHandler.KEY_TAGS).size();
            for (int i = 0; i < size; i++) {
                String name = String.format("#%s",
                        photos.get(DatabaseHandler.KEY_TAGS).get(i));
                Bubble.getBubble(name, flow, subjects, activity, photos
                        .get(DatabaseHandler.KEY_THUMBNAILPATH).get(1), false);
            }
            cacheView.image = (ImageView)convertView.findViewById(R.id.list_image);//iv;
            cacheView.tags = flow;
            convertView.setTag(cacheView);

        }   

        cacheView = (ViewHolder) convertView.getTag();
        cacheView.image.setImageBitmap(null);
        DecodeTask task = new DecodeTask(cacheView.image);
        task.execute(photos.get(DatabaseHandler.KEY_THUMBNAILPATH).get(1));
        cacheView.image.setTag(R.id.list_image, task);

        return convertView;
    }

    static class ViewHolder {
        static FlowLayout  tags;
        static ImageView image;

        public static FlowLayout getFlowLayout() {
            return tags;
        }
    }
}

流程布局来自这里 - http://nishantvnair.wordpress.com/2010/09/28/flowlayout-in-android/ 泡泡布局来自这里 - http://nishantvnair.wordpress.com/2010/09/28/android-create-bubble-like-facebook/ 我使用这个SO线程在背景上加载图像 - Large ListView containing images in Android 任何帮助? = \ P.S 我知道已有类似的应用程序[实际上很多,但是在编写代码时最好的学习就是这样,这就是我做的事情=)]

1 个答案:

答案 0 :(得分:4)

原因很明显!!!您在ViewHolder中有静态变量:

而不是:

 static class ViewHolder {
    static FlowLayout  tags;
    static ImageView image;

    public static FlowLayout getFlowLayout() {
        return tags;
    }
}

必须

 static class ViewHolder {
     FlowLayout  tags;
     ImageView image;

    public FlowLayout getFlowLayout() {
        return tags;
    }
}

更多关于static变量在互联网上可用,简而言之它们不是实例变量,因此更改其值将为每个实例更改它(尽管应使用类引用访问static变量)。 / p>

<强>更新

如教程所述Large ListView containing images in Android

,如果DecodeTask为空,您还需要取消convertView

但保留这些变量static是一个简单的错误并且易于检测,因为您可以在2+2 = 5中检测到错误。说删除static修饰符似乎打破了所有内容意味着您的代码出现了其他问题。