Android VeiwFlow从SdCard加载图像

时间:2011-10-27 07:19:22

标签: android image swipe-gesture

我正在为我的应用程序使用ViewFlow示例的实现,我必须从SdCard刷图像。使用我正在使用的代码我可以刷图像,但它只显示一个,我试图从ViewFlow中的我的SdCard特定文件夹设置整个图像,但这就是我的问题。我通过ID从sqlite数据库获取图像的路径,并根据我想将这些图像添加到视图中。所以这是我现在使用的代码:

我的卡片类:

    package com.stampii.stampii.cards;

import java.util.ArrayList;
import java.util.HashMap;

import com.stampii.stampii.R;
import com.stampii.stampii.comm.rpc.UserDatabaseHelper;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class Cards extends Activity {

    public Cursor cursor;
    int position;
    int indexxx;
    Bitmap b;
    int objectId;
    int cardsId;
    ArrayList<HashMap<Integer, String>> imgpaths;
    ArrayList<Integer> ids;
    String path;
    int mediaType=5001;

    private ViewFlow viewFlow;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.circle_layout); 
        UserDatabaseHelper userDbHelper = new UserDatabaseHelper(this, null, 1);
        userDbHelper.initialize(this);
        imgpaths = new ArrayList<HashMap<Integer, String>>();
        HashMap<Integer, String> hm = new HashMap<Integer, String>();
        ids = new ArrayList<Integer>();

        final int cardId = getIntent().getIntExtra("card_id",0);
        Log.i("Card Id ","Card Id : "+cardId);
        final int collId = getIntent().getIntExtra("collection_id",0);
        Log.i("Collection Id ","Collection Id : "+collId);

        position = getIntent().getIntExtra("position",0);
        Log.i("position","position : "+position);

        String cardSQL = "SELECT cm.cardId, cm.objectId "+
         "FROM cardmedias AS cm "+
         "INNER JOIN cards AS cd "+
         "ON (cm.cardId = cd.objectId) "+
         "WHERE cd.collectionId="+collId +" AND cm.mediaType="+mediaType;

        Cursor cards = userDbHelper.executeSQLQuery(cardSQL);
        if (cards.getCount() == 0) {
            Log.i("", "No Image file");
            cards.close();
        } else if (cards.getCount() > 0) {
            for (cards.move(0); cards.moveToNext(); cards.isAfterLast()) {
                cardsId = Integer.parseInt(cards.getString(cards
                        .getColumnIndex("objectId")));
                //Log.i("", "cards objectId : " + cardsId);

                String path = Environment.getExternalStorageDirectory()
                        + "/.Stampii/MediaCard/" + cardsId + ".png";
                //Log.i("", "path : " + path);
                ids.add(cardsId);
                hm.put(cardsId, path);
            }
        }


        String sql = "SELECT objectId FROM cardmedias WHERE cardId=" + cardId
                + " LIMIT 1";
        Cursor cursor = userDbHelper.executeSQLQuery(sql);
        if (cursor.getCount() == 0) {
            Log.i("", "No Image file");
            cursor.close();
        } else if (cursor.getCount() > 0) {
            cursor.moveToFirst();
                objectId = Integer.parseInt(cursor.getString(cursor
                        .getColumnIndex("objectId")));
                Log.i("", "objectId : " + objectId);
                path = hm.get(objectId);
                Log.i("","path : "+hm.get(objectId));
                Log.i("","hm size : "+hm.size());
        }



        Button info = (Button) findViewById(R.id.info_button);
        info.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Cards.this, SingleCardInfo.class);
                intent.putExtra("card_id", cardId);
                intent.putExtra("collection_id", collId);
                startActivity(intent);
            }
        });

        Button back = (Button) findViewById(R.id.back_button);
        back.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });

        final ArrayList<Bitmap> images = new ArrayList<Bitmap>();

        for(int i=0;i<=2;i++){
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inTempStorage = new byte[16*1024];
                Bitmap b = BitmapFactory.decodeFile(hm.get(objectId), options);
                Log.i("","path : "+hm.get(objectId));
                images.add(b);
        }


        viewFlow = (ViewFlow) findViewById(R.id.viewflow);
        viewFlow.setAdapter(new ImageAdapter(this, images),position);


        ImageButton prevBtn = (ImageButton) findViewById(R.id.previous_button);
        prevBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                indexxx = viewFlow.getSelectedItemPosition()-1;
                if (indexxx>=0) {
                    viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
                    viewFlow.setSelectedItemPosition(indexxx);
                    Log.i("indexxx", "indexxx : " + indexxx);
                }
            }
        });

        ImageButton nextBtn = (ImageButton) findViewById(R.id.next_button);
        nextBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                indexxx = viewFlow.getSelectedItemPosition()+1;
                if (indexxx<images.size()) {
                    viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
                    viewFlow.setSelectedItemPosition(indexxx);
                    Log.i("indexxx", "indexxx : " + indexxx);
                }
            }

        }); 

    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        viewFlow.onConfigurationChanged(newConfig);
    }

}

我的ImageAdapter课程:

package com.stampii.stampii.cards;

import java.util.ArrayList;

import com.stampii.stampii.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private ArrayList<Bitmap> ids = new ArrayList<Bitmap>();
    //private Bitmap bitmap;

    public ImageAdapter(Context context, ArrayList<Bitmap> images) {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ids = images;
    }

    @Override
    public int getCount() {
        return ids.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.image_item, null);
        }
        ((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ids.get(position));
        return convertView;
    }

}

所以我的问题是当我有这些图像的路径时,如何将我的SdCard文件夹中的所有图像添加到此ViewFlow示例中。我试图加载所有这些,但在某些情况下图像太多了,它给我一个outofmemoryException,这就是为什么我认为最好设置它们的路径。所以欢迎任何帮助或建议!

提前致谢!

以下是ViewFlow.class的代码:ViewFlow

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

public class ImageAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private ArrayList<String> ids = new ArrayList<String>();
    //private Bitmap bitmap;

    public ImageAdapter(Context context, ArrayList<String> images) {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ids = images;
    }

    @Override
    public int getCount() {
        return ids.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.image_item, null);
        }

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inTempStorage = new byte[8*1024];

        Bitmap ops = BitmapFactory.decodeFile(ids.get(position), options);

        ((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);
        return convertView;
    }

}

并且:

public class Cards extends Activity {

public Cursor cursor;
int position;
int indexxx;
Bitmap b;
int objectId;
int cardsId;
ArrayList<Integer> ids;
String path;
int mediaType=5001;
ArrayList<String> images;
int card;

private ViewFlow viewFlow;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.circle_layout); 
    UserDatabaseHelper userDbHelper = new UserDatabaseHelper(this, null, 1);
    userDbHelper.initialize(this);
    //imgpaths = new ArrayList<HashMap<Integer, String>>();
    HashMap<Integer, String> hm = new HashMap<Integer, String>();
    ids = new ArrayList<Integer>();
    images = new ArrayList<String>();

    final int cardId = getIntent().getIntExtra("card_id",0);
    Log.i("Card Id ","Card Id : "+cardId);
    final int collId = getIntent().getIntExtra("collection_id",0);
    Log.i("Collection Id ","Collection Id : "+collId);

    position = getIntent().getIntExtra("position",0);
    Log.i("position","position : "+position);

    String cardSQL = "SELECT cm.cardId, cm.objectId "+
     "FROM cardmedias AS cm "+
     "INNER JOIN cards AS cd "+
     "ON (cm.cardId = cd.objectId) "+
     "WHERE cd.collectionId="+collId +" AND cm.mediaType="+mediaType;

    Cursor cards = userDbHelper.executeSQLQuery(cardSQL);
    if (cards.getCount() == 0) {
        Log.i("", "No Image file");
        cards.close();
    } else if (cards.getCount() > 0) {
        for (cards.move(0); cards.moveToNext(); cards.isAfterLast()) {
            cardsId = Integer.parseInt(cards.getString(cards
                    .getColumnIndex("objectId")));

            card = Integer.parseInt(cards.getString(cards
                    .getColumnIndex("cardId")));

            String path = Environment.getExternalStorageDirectory()
                    + "/.Stampii/MediaCard/" + cardsId + ".png";
            ids.add(card);
            hm.put(cardsId, path);

            path = hm.get(cardsId);
            Log.i("","path : "+hm.get(cardsId));
            Log.i("","hm size : "+hm.size());
            images.add(path);
        }
    }


    Button back = (Button) findViewById(R.id.back_button);
    back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });


    viewFlow = (ViewFlow) findViewById(R.id.viewflow);
    viewFlow.setAdapter(new ImageAdapter(this, images),position);


    ImageButton prevBtn = (ImageButton) findViewById(R.id.previous_button);
    prevBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            indexxx = viewFlow.getSelectedItemPosition()-1;
            if (indexxx>=0) {
                viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
                viewFlow.setSelectedItemPosition(indexxx);
                Log.i("indexxx", "indexxx : " + indexxx);
            }
        }
    });

    ImageButton nextBtn = (ImageButton) findViewById(R.id.next_button);
    nextBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            indexxx = viewFlow.getSelectedItemPosition()+1;
            if (indexxx<images.size()) {
                viewFlow.setAdapter(new ImageAdapter(Cards.this, images),indexxx);
                viewFlow.setSelectedItemPosition(indexxx);
                Log.i("indexxx", "indexxx : " + indexxx);
            }
        }
    }); 


    Button info = (Button) findViewById(R.id.info_button);
    info.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Cards.this, SingleCardInfo.class);
            intent.putExtra("card_id", ids.get(position));
            intent.putExtra("collection_id", collId);
            startActivity(intent);
        }
    });

}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    viewFlow.onConfigurationChanged(newConfig);
}

}

这应该可以做到!