从sqlite加载图像不会出现

时间:2013-12-28 14:20:35

标签: java android sqlite android-fragments android-imageview

我有一个应用程序从sqllite数据库加载数据,然后将数据转换为适当的格式,以便它可以将数据传递给片段选项卡。 除了图像,一切正常。 在DB中,图像以完整路径存储,例如R.drawable.muntjakas,图像在资源可绘制文件夹中可用。 应用程序从数据库中提取数据,然后将其转换为int格式,以便传递给它。 Eclipse没有给我任何错误,但是当应用程序加载图像时不显示。我的xml文件设置了图像ID,如果我手动分配值,则显示图像,例如

flag = new int[] { R.drawable.muntjakas,.... };

有什么问题? fragmenttab1.java类从sql加载数据并转换它:

public class FragmentTab1 extends SherlockFragment {

    ListView list;
    ListViewAdapter adapter;

       private static final String DB_NAME = "animalsDB.sqllite3";
        private static final String TABLE_NAME = "animals";
        private static final String ANIMAL_ID = "_id";
        private static final String ANIMAL_NAME = "name";
        private static final String ANIMAL_PIC = "pic";
        public static final String[] ALL_KEYS = new String[] {ANIMAL_ID, ANIMAL_NAME,ANIMAL_PIC };

        private SQLiteDatabase database;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmenttab1, container,
                false);

        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(getActivity(), DB_NAME);
            database = dbOpenHelper.openDataBase();
        Cursor cursor = getAllRows();


        ArrayList<String> nameArray = new ArrayList<String>();
        ArrayList<Integer> picArray = new ArrayList<Integer>();
        for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
            nameArray.add(cursor.getString(cursor.getColumnIndex(ANIMAL_NAME)));
            picArray.add(cursor.getInt(cursor.getColumnIndex(ANIMAL_PIC)));
        }
        final String[] name = (String[]) nameArray.toArray(new String[nameArray.size()]);
        final Integer[] pic = (Integer[]) picArray.toArray(new Integer[picArray.size()]);

        final int[] flag =  new int[pic.length];

        for (int i = 0; i < pic.length; i++ ) {
           flag[i] = pic[i];
        }

        // Locate the ListView in fragmenttab1.xml
        list = (ListView) rootView.findViewById(R.id.listview);

        // Pass results to ListViewAdapter Class
        adapter = new ListViewAdapter(getActivity(), name, flag);
        // Binds the Adapter to the ListView
        list.setAdapter(adapter);
        // Capture clicks on ListView items
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // Send single item click data to SingleItemView Class
                Intent i = new Intent(getActivity(), SingleItemView.class);

                // Pass all data country
                i.putExtra("country", name);
                // Pass all data flag
                i.putExtra("flag", flag);
                // Pass a single position
                i.putExtra("position", position);
                // Open SingleItemView.java Activity
                startActivity(i);

            }});
        return rootView;
    }

    public Cursor getAllRows() {
        String where = null;
        Cursor c =  database.query(true, TABLE_NAME, ALL_KEYS, 
                            where, null, null, null, null, null);
        if (c != null) {
            c.moveToFirst();
        }
        return c;
    }

}

我的listViewAdapter.java类应该在屏幕上加载数据:

package kf.kaunozoo;
public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context context;
    String[] country;
    int[] flag;
    LayoutInflater inflater;

    public ListViewAdapter(Context context, String[] country, int[] flag) {
        this.context = context;     
        this.country = country;
        this.flag = flag;

    }

    public int getCount() {
        return country.length;
    }

    public Object getItem(int position) {
        return null;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {

        // Declare Variables

        TextView txtcountry;
        ImageView imgflag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.listview_item, parent, false);

        // Locate the TextViews in listview_item.xml

        txtcountry = (TextView) itemView.findViewById(R.id.country);
        // Locate the ImageView in listview_item.xml
        imgflag = (ImageView) itemView.findViewById(R.id.flag);

        // Capture position and set to the TextViews        
        txtcountry.setText(country[position]);

        // Capture position and set to the ImageView
        imgflag.setImageResource(flag[position]);

        return itemView;
    }
}

我做错了什么?感谢所有答案

1 个答案:

答案 0 :(得分:0)

我曾经在我的一个应用程序中遇到过这个问题,但是,我做的是,我为数据库中的每个drawable保存了唯一的ID,因为我的图像有限。在显示我编写了一个小函数时,我使用switch语句检查数据库中的每个id,然后在ImageView中相应地加载图像。

但是,当您有大量图像时,请尝试使用以下功能,您可以从数据库中动态提供图像名称。

// image from res/drawable
int resID = getResources().getIdentifier("your_image_name", 
        "drawable", getPackageName());

此外,您可以尝试使用此blog给出的解决方案。