0

我有一个来自 SQLite 数据库的现有 ListView。我希望该用户可以将图片从他们的画廊添加到列表视图。这些图片以“*.jpg”的形式保存在内部存储中,其中 * 是创建新帐户时的特定行 ID。

示例:在 SQLite 数据库中创建一个新条目,表 (id) 编号为 8。然后,如果用户选择了图片,则该图片将保存在内部存储中,名称为“8.jpg”

我的问题是如何在 listView 中的确切位置显示该图片...到目前为止,这是我的代码:

编辑:(更新代码)

private void fillData() {

    mNotesCursor = helper.fetchAllData();

    String[] from = new String[] { MySQLiteHelper.NAME, MySQLiteHelper.PASSWORD,
            MySQLiteHelper.CB_GETREIDE, MySQLiteHelper.CB_FASTENTAG,
            MySQLiteHelper.CB_WOCHENPLAN, MySQLiteHelper.CB_DIET,
            MySQLiteHelper.SP_ART, MySQLiteHelper.PHOTO  };

    int[] to = new int[] { R.id.label, R.id.gewicht, 
            R.id.getreide,
            R.id.fastentag, 
            R.id.wochenplan, 
            R.id.diet, 
            R.id.spinner,
            R.id.imageButton1};


    adapter = new SimpleCursorAdapter(getActivity(),
            R.layout.hundeliste_item, mNotesCursor, from, to, 0);

    mMyListView.setAdapter(adapter);

    adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){

           public boolean setViewValue(View view, Cursor cursor, int columnIndex){

               final int id = mNotesCursor.getInt(mNotesCursor.getColumnIndex(MySQLiteHelper.UID));
               LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               view = inflater.inflate(R.layout.hundeliste_item, null);

               File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
                        + "/Android/data/"
                        + getActivity().getPackageName()
                        + "/Files"); 

               Uri uri = Uri.parse(mediaStorageDir.getPath() + File.separator + id +".jpg");

               Log.v("TEST COMPARISON", "columnIndex=" + columnIndex + "  ID = " + id + "  URI = " + uri); 


// I think here comes my mistake, but I don't know another solution                

if(columnIndex == cursor.getColumnIndex(MySQLiteHelper.PHOTO)) {


                      ((ImageView)view.findViewById(R.id.imageView1)).setImageDrawable(Drawable.createFromPath(uri.toString()));
                      Log.v("Test", "... this Log don't show up, cause columnIndex =/= id");  

                      return true;

               }



                       return false; 
                 }
                }); 

欢迎任何帮助。对此感到疯狂..在这里坐了一个星期没有解决方案

编辑:(日志输出)

03-11 12:55:36.784: V/TEST COMPARISON(22456): columnIndex=1  ID = 1  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/1.jpg
    03-11 12:55:36.794: V/TEST COMPARISON(22456): columnIndex=2  ID = 1  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/1.jpg
    03-11 12:55:36.804: V/TEST COMPARISON(22456): columnIndex=7  ID = 1  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/1.jpg
    03-11 12:55:36.814: V/TEST COMPARISON(22456): columnIndex=1  ID = 2  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/2.jpg
    03-11 12:55:36.824: V/TEST COMPARISON(22456): columnIndex=2  ID = 2  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/2.jpg
    03-11 12:55:36.834: V/TEST COMPARISON(22456): columnIndex=7  ID = 2  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/2.jpg
    03-11 12:55:36.844: V/TEST COMPARISON(22456): columnIndex=1  ID = 3  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/3.jpg
    03-11 12:55:36.844: V/TEST COMPARISON(22456): columnIndex=2  ID = 3  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/3.jpg
    03-11 12:55:36.854: V/TEST COMPARISON(22456): columnIndex=7  ID = 3  URI = /storage/emulated/0/Android/data/com.example.android.navigationdrawerexample/Files/3.jpg
4

1 回答 1

0

好的,所以在你的情况下,我认为最好覆盖getView,因为setViewValue会调用光标中的列,而你的图像不是(这样你会用每一列覆盖图像,性能很差)。

以下是如何在以下位置创建视图的示例getView

编辑更改为bindViewnewView

private void fillData() {

    mNotesCursor = helper.fetchAllData();

    String[] from = new String[] { MySQLiteHelper.NAME, MySQLiteHelper.PASSWORD,
        MySQLiteHelper.CB_GETREIDE, MySQLiteHelper.CB_FASTENTAG,
        MySQLiteHelper.CB_WOCHENPLAN, MySQLiteHelper.CB_DIET,
        MySQLiteHelper.SP_ART, MySQLiteHelper.PHOTO  };

    int[] to = new int[] { R.id.label, R.id.gewicht, 
        R.id.getreide,
        R.id.fastentag, 
        R.id.wochenplan, 
        R.id.diet, 
        R.id.spinner,
        R.id.imageButton1};


    adapter = new MyAdapter(getActivity(),
        R.layout.hundeliste_item, mNotesCursor, from, to, 0);

    mMyListView.setAdapter(adapter);

}


 private class MyAdapter extends SimpleCursorAdapter{

        private Context mContext;
        private int layout;
        private Cursor cursor;
        private final LayoutInflater inflater;

        public MyAdapter(Context context,int layout, Cursor cursor, String[] from, int[] to) {
            super(context,layout,cursor,from,to);
            this.layout=layout;
            this.mContext = context;
            this.inflater=LayoutInflater.from(context);
            this.cursor=cursor;
        }

        @Override
        public View newView (Context context, Cursor cursor, ViewGroup parent) {
                return inflater.inflate(layout, null);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            super.bindView(view, context, cursor);

            // Set textviews analogue to this
            TextView name = (TextView) view.findViewById(R.id.label);
            name.setText(cursor.getString(cursor.getColumnIndex(MySQLiteHelper.NAME)));

            // Set the values for other data elements
            // ....

            // Create the imageView
            final int id = cursor.getInt(cursor.getColumnIndex(MySQLiteHelper.UID));
            ImageView imageView = (ImageView) view.findViewById(R.id.imageButton1);

            // load the image from the storage location
            // (a check if the image exists would be nice)
            String mediaStorageFilePath = Environment.getExternalStorageDirectory()
                    + File.separator +"Android"
                    + File.separator +"data"
                    + File.separator + getActivity().getPackageName()
                    + File.separator + "Files"
                    + File.separator + id +".jpg";

            // load the image as a bitmap and set it to the image view
            Bitmap bmp = BitmapFactory.decodeFile(mediaStorageFilePath);
            imageView.setImageBitmap(bmp);

        }
    }
}

我希望这有帮助。

于 2014-03-11T12:48:17.307 回答