Миниатюры Gridview исчезают через некоторое время - PullRequest
1 голос
/ 27 марта 2012

У меня есть вопрос, касающийся приложения галереи / тегов изображений, которое я создаю для курса.

Мое приложение представляет собой приложение для создания галереи / тегов. Он начинается с отображения сетки, в которой отображаются эскизы всех изображений телефонов, хранящихся на SD-карте. Проблема, с которой я сталкиваюсь, заключается в следующем: Gridview -> пользователь нажимает на картинку -> полный просмотр изображения -> пользователь нажимает обратно -> вернуться к просмотру сетки поэтому после возврата к виду сетки при прокрутке блоки миниатюр, которые не находятся в прямом просмотре, удаляются, однако объекты все еще там и доступны для щелчка, но миниатюра не видна.

надеюсь получить помощь в этом: D

public class App2Activity extends Activity {
/** Called when the activity is first created. */
static Cursor cursor;
static int columnIndex;
static Bitmap bMap;
static String imagePath;
protected static ContentResolver cr;
@Override

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String[] projection = {MediaStore.Images.Thumbnails._ID}; //Columns to return
    cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);//Puts selected columns in cursor object
    columnIndex = cursor.getColumnIndex(MediaStore.Images.Thumbnails._ID);//return columns index


    GridView imagesview = (GridView) findViewById(R.id.gridView1);
    imagesview.setAdapter(new ImageAdapter(this));
    //Method litsens for thumbnail that is clicked and then loads the full image bit map
    imagesview.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View v, int position, long id){
            String[] projection = {MediaStore.Images.Media.DATA};
            //This segment fetches selected image path
            cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
            columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
            cursor.moveToPosition(position);
            imagePath = cursor.getString(columnIndex);


            Intent intent = new Intent(v.getContext(), Fullview.class);

            FileInputStream in;
            BufferedInputStream buf;

            try {
                in = new FileInputStream(imagePath);
                buf = new BufferedInputStream(in);
                bMap = BitmapFactory.decodeStream(buf);
                startActivity(intent);//Start fullviewclass to project bitmap in fullscreen

                if (in != null) {
                    in.close();
                }
                if (buf != null) {
                    buf.close();
                }
            } catch (Exception e) {
                Log.e("Error reading file", e.toString());
            }

        }
    });

}
//Inflates menu when button is pressed
public boolean onCreateOptionsMenu(Menu menu){

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.exitmenu, menu);

    return true;
    }
//handles the exit menu button
public boolean onOptionsItemSelected(MenuItem item){

    switch(item.getItemId()){
        case R.id.exit:
        finish();
        default:
            return super.onOptionsItemSelected(item);
    }
}

}

class ImageAdapter extends BaseAdapter{
private Context context;

public ImageAdapter(Context cont){
    context = cont;
}
@Override
public int getCount() {

    return App2Activity.cursor.getCount();
}

@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) {
    ImageView iv;
    // this segment sets up the gridview
    if(convertView == null){
        iv = new ImageView(context);

        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        iv.setPadding(4, 4, 4, 4);
        iv.setLayoutParams(new GridView.LayoutParams(120, 120));
    }

    else {
        iv = (ImageView)convertView;
    }
    //fetches thumbnails
    App2Activity.cursor.moveToPosition(position);
    int imageID = App2Activity.cursor.getInt(App2Activity.columnIndex);
    iv.setImageURI(Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));
    return iv;
}

}

public class Fullview extends Activity {


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fullview);
    ImageView iv = (ImageView)findViewById(R.id.imageView1);
    iv.setImageBitmap(App2Activity.bMap);

}
//Inflates menu when button is pressed
public boolean onCreateOptionsMenu(Menu menu){

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    return true;
 }
//Handles menu options
public boolean onOptionsItemSelected(MenuItem item){

    switch(item.getItemId()){
        case R.id.back:
        finish();
        case R.id.Tag:

            Intent intent = new Intent(getApplicationContext(), ContactsDisplay.class);
            startActivityForResult(intent, 0);
            return true;

        case R.id.tagged:
            Intent intent2 = new Intent(getApplicationContext(), TaggedViewer.class);
            startActivity(intent2);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

//Gets the result Uri from choosing a contact after having pressed menu option "Tag" and saves pic/contact combination to internal storage
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if(resultCode == RESULT_OK){
        if(requestCode == 0){   
            //This segment saves the tagged contact uri and hashes the associated imagepath name which become filename internal storage file
            Uri result = data.getData();
            String toBeStored = result.toString();
            Log.w("GOT", result.toString());

            int filehash = App2Activity.imagePath.hashCode();
            String strfilehash = String.valueOf(filehash);

            try {
                FileOutputStream fos = openFileOutput(strfilehash, MODE_PRIVATE);
                fos.write(toBeStored.getBytes());
                fos.close();
            } catch (FileNotFoundException e) {
                Log.w("FileWrite", "FileError");
            } catch (IOException e) {
                Log.w("FileWrite", "WriteError");
            }
        }
    }

Перед изображением ошибки так вот как выглядит вид до появления ошибки. Все картинки есть, и затем после возвращения из fullview и некоторой прокрутки позже, возникает ошибка, и представление выглядит как на рисунке ниже. Примечание: он сохраняет все изображения, которые были видны все время, а также объекты, миниатюры которых исчезли, они по-прежнему кликабельны. После ошибки картинка

Logcat говорит об этом, когда пытается вернуть одно из изображений, которое должно вернуться в вид:

Невозможно открыть контент: content: // media / external / images / thumbnails / 0 java.io.FileNotFoundException: нет записи для содержимого: // media / external / images / thumbnails / 0 а затем некоторые дополнительные вещи и, наконец,: resolUri обнаружил неверное растровое изображение uri: content: // media / external / images / thumbnails / 0

Так что каким-то образом класс адаптера изображения не может найти никаких миниатюр для изображений, которые должны вернуться к текущему виду. я бы включил изображение всей этой записи logcat, но в настоящее время я не могу публиковать более 2 ссылок:)

Надеюсь, это вся информация, которая вам нужна :) буду рад любой помощи, которую я могу получить!

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я нашел проблему самостоятельно. Проблема заключалась в том, что я использовал те же переменные для получения миниатюр, а затем для получения полноразмерных изображений, поэтому, когда я вернулся к экрану галереи, запрос миниатюр получил неправильные таблицы. По сути, он пытался получить миниатюры из таблицы полных изображений.

Сессия изучена, повторное использование глобальных переменных без причины = плохо: D

0 голосов
/ 30 января 2013

Попробуйте это:

private String getPath(Uri uri) {
String[]  data = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, uri, data, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
...