【问题标题】:Loading image from sqllite does not appear从 sqlite 加载图像不出现
【发布时间】:2013-12-28 14:20:34
【问题描述】:

我有一个应用程序,它从 sqllite 数据库加载数据,然后将数据转换为适当的格式,以便它可以将数据传递到片段选项卡。 除图像外,一切正常。 在数据库中,图像以完整路径存储,例如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;
    }
}

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

【问题讨论】:

  • 首先,如果您的数据在 sqlite db 中,请使用 CursorAdapter 子类之一

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


【解决方案1】:

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

但是,当您有很多图像时,请尝试使用以下函数,您可以在其中动态地从数据库中提供图像名称。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多