Problem med MediaStore och GridView

Diskussion i 'Frågor, support och diskussion' startad av 3D-kreativ, 16 feb 2013.

  1. 3D-kreativ

    3D-kreativ Infant Droid Medlem

    Blev medlem:
    16 feb 2013
    Inlägg:
    9
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej!

    Jag håller på att lära mig att hämta bilderna från SD-kort via MediaStore och visa dem i en GridView. Jag har en MainActivity klass och en ImageAdapter klass. Eftersom det är ett tag sedan jag programmerade Java, tror jag att mitt fel är ganska enkelt fel som har något med referens att göra mellan klasserna.

    Det är i sista raden som jag får en rödmarkering i Eclipse när jag använder: return cursor.getCount(); Ska jag inte komma åt objektet cursor och dess värden när jag skickar klassen MainActivity med "this" till konstruktorn i ImageAdapter? Jag har kikat på lite kod från några exempel och där tror jag att klassen ImageAdapter är nestlad eller vad det kallas. Behöver jag någon referens när jag har en fristående klass av ImageAdapter?

    Tacksam för lite hjälp för att komma framåt!

    MainActivity:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Array for the columns to access
    String[] projection = {MediaStore.Images.Thumbnails._ID};

    // Cursor object
    cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this)); // Send this class to constructor


    ImageAdapter:

    public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
    mContext = c;
    }

    public int getCount() {
    //return mThumbIds.length;
    return cursor.getCount(); // Det är här som jag får fel!!
    }
     
  2. e7andy

    e7andy Professional Droid Hedersmedlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    2 349
    Mottagna gillanden:
    835
    Telefon:
    Huawei P10 Plus

    MINA ENHETER

    Telefon:
    Huawei P10 Plus
    Telefon 2:
    Nexus 5
    Telefon 3:
    ADP1
    Övrigt:
    LG G Watch R, ChromeCast
    ImageAdapter känner som sagt inte till cursor.
    Två olika enkla lösningar som har samma resultat:
    1. Gör ImageAdapter till en intern ("nested") klass i MainActivity: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
    Då kommer ImageAdapter åt instansvariabeln cursor.
    2. Sätt cursor på ImageAdapter-klassen.

    Alternativ 2 gör du så här:
    Skapa en metod i ImageAdapter: setCursor(Cursor cursor) som sätter cursor till en ny instansvariabel.
    I MainActivity så gör du om gridview.setAdapter(new ImageAdapter(this)); till:
    ImageAdapter imageAdapter = new ImageAdapter(this);
    imageAdapter.setCursor(cursor);
    gridview.setAdapter(imageAdapter);
     
    3D-kreativ gillar detta.
  3. 3D-kreativ

    3D-kreativ Infant Droid Medlem

    Blev medlem:
    16 feb 2013
    Inlägg:
    9
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack för tipsen! Funkar bra med första alternativet. Dock är jag inte helt säker på vad du menar med "Sätt cursor på ImageAdapter-klassen"?
     
  4. e7andy

    e7andy Professional Droid Hedersmedlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    2 349
    Mottagna gillanden:
    835
    Telefon:
    Huawei P10 Plus

    MINA ENHETER

    Telefon:
    Huawei P10 Plus
    Telefon 2:
    Nexus 5
    Telefon 3:
    ADP1
    Övrigt:
    LG G Watch R, ChromeCast
    Så här gör du det:
    imageAdapter.setCursor(cursor);

    Den instansen av ImageAdapter får då tillgång till cursor-instansen som skapades i MainActivity.

    Att sätta och hämta variabler och dylikt från olika klasser används ofta. Jämför med det som redan står i din kod:
    gridview.setAdapter(new ImageAdapter(this));
    Där sätter du en instans av ImageAdapter på instansen gridview som då får tillgång till adaptern och kan använda den som sin egen.
     
    3D-kreativ gillar detta.
  5. 3D-kreativ

    3D-kreativ Infant Droid Medlem

    Blev medlem:
    16 feb 2013
    Inlägg:
    9
    Mottagna gillanden:
    0

    MINA ENHETER

    OK! Jag tror jag förstår. Nu har jag dock ett större problem och det är att, istället för att visa bilderna en gång, så upprepas alla bilder i grupper fem gånger. När jag klickar på en bild för att visa den i fullskärm i annan aktivitet och sedan backar tillbaka, så verkar det vara en annan ordning och fel id på bilderna när jag åter igen klickar på dem för fullskärm i en annan aktivitet då det blir tomt!

    Tips på vad som kan vara fel?
     
  6. e7andy

    e7andy Professional Droid Hedersmedlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    2 349
    Mottagna gillanden:
    835
    Telefon:
    Huawei P10 Plus

    MINA ENHETER

    Telefon:
    Huawei P10 Plus
    Telefon 2:
    Nexus 5
    Telefon 3:
    ADP1
    Övrigt:
    LG G Watch R, ChromeCast
    Det du bör börja med är att debugga koden. Lägg in breakpoints på lämpliga ställen och kolla vad variabler har för värden och se hur flödet i programmet går. Då kommer man oftast på direkt varför det blir fel.

    Lägg gärna upp din kod så kan vi kika på det.
    Bra ställe att lägga upp kod: http://pastebin.com/
     
  7. 3D-kreativ

    3D-kreativ Infant Droid Medlem

    Blev medlem:
    16 feb 2013
    Inlägg:
    9
    Mottagna gillanden:
    0

    MINA ENHETER

    Flyttat frågan till ny tråd!
     
    Last edited: 18 feb 2013