1

Android sqlite を勉強したかったので、ユーザーが自分の写真にタグを付けてネットワーク (google+、fb、twitter) にアップロードできるインスタント タグ付けアプリケーションを作成しましたListFragment。 、リスト内の画像要素は隠しフォルダーに保存され、単語はsqlite dbに保存されます..問題は、上下にスクロールしているときに、一部のアイテムがランダムに切り替わるだけでなく、8つ以上のアイテムがあるにもかかわらず、最初の8つのアイテムが繰り返し表示されます (つまり、9-12 ではなく 1-8 が再び表示されます) 唯一の問題はアダプターにある可能性がありますが、デバッグのセッションでのセッションの後、アダプターの私のコードは -

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 スレッドを使用して、背景に画像をロードします - Android の画像を含む大きな ListView は 役に立ちますか? =\ ps そのようなアプリが既にあることは知っています [そして実際にはたくさんありますが、コードを書いているときに最も良い学習が得られるので、私はそうしました =) ]

4

1 に答える 1

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変数にはクラス参照を使用してアクセスする必要があります)。

アップデート:

DecodeTaskまた、チュートリアルにあるようにif convertViewis nullをキャンセルする必要があります: Android の画像を含む大きな ListView

しかし、これらの変数を保持することstaticは単純な間違いであり、2+2 = 5. 修飾子を削除するstaticとすべてが壊れたように見えるということは、コードに何か他の問題があることを意味します。

于 2013-10-09T17:46:03.287 に答える