在现有sqlite listview(viewbinder)中显示内部存储中的图片

aamkag61  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(283)

我有一个来自sqlite数据库的现有listview。我希望用户可以添加图片从他们的画廊到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; 
                 }
                });

欢迎任何帮助。变得疯狂。。在这里坐了一个星期没有解决问题
编辑:(logoutput)

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
ovfsdjhp

ovfsdjhp1#

好吧,在你的情况下,最好 getView 我想,自从 setViewValue 为光标中的列调用,而您的图像不是(这样,您会用每一列覆盖图像,性能很差)。
下面是一个如何在中创建视图的示例 getView :
编辑更改为 bindView 以及 newView ```
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);

    }
}

}

我希望这有帮助。

相关问题