2012-05-26 3 views
6

Ich hatte eine ListView verwendet, um einige Daten (String) aus der Datenbank abgerufen ... ganz einfach, aber einer meiner Kollegen entschied sich, ein Bild vor dem Text auf dem Bildschirm zu setzen. Wir konnten dies nicht mit Listview tun, aber wir fanden ein Beispiel mit GridView, das genau so aussah, wie wir es brauchten. Dann haben wir etwas Zeit mit GridView verbracht und das Bild vor den Text gestellt.Wie bekomme ich das ausgewählte Objekt aus einer Gridview mit ImageAdapter? (Android)

nun leider wissen wir nicht, wie das ausgewählte Element zu erhalten (basierend auf dem Text, der ausgewählt ist aus der itemcomes)

ich OnItemClickListener bin mit und innerhalb onItemClick das Verfahren gridView.getItemSelectedAtPosition() , aber alles, was ich bekomme, ist "null".

Ich weiß jetzt nicht, ob ImageAdapter etwas damit zu tun hat, denn wenn ich es zu einem ArrayAdapter ändere, kann ich das richtige Objekt richtig bekommen, aber auf diese Weise gibt es kein Bild in der Reihe.

gridview.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id{  String selectedItem = (String) (gridView.getItemAtPosicion(position)); //always null  } }); 

was kann ich tun?

EDITED - Listview-Quelle

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
public class ImageAdapter extends BaseAdapter { 
private Context context; 
private final String[] mobileValues; 
private final String[] mobileValuesD; 

public ImageAdapter(Context context, String[] mobileValues, String[] mobileValuesD) { 
this.context = context; 
this.mobileValues = mobileValues; 
this.mobileValuesD = mobileValuesD; 
} 

    public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService   (Context.LAYOUT_INFLATER_SERVICE); 
    View gridView; 

    if (convertView == null) { 

    gridView = new View(context); 

    // get layout from mobile.xml 
    gridView = inflater.inflate(R.layout.pesquisa_2, null); 

    // set value into textview 
    TextView textView = (TextView) gridView.findViewById(R.id.grid_item_label); 
    textView.setText(mobileValues[position]+"\n"+mobileValuesD[position]); 

// set image based on selected text 
    ImageView imageView = (ImageView) gridView.findViewById(R.id.grid_item_image); 

    String mobile = mobileValues[position]; 

//SELECT DAS IMAGENS 

    if (mobile.equals("pdt1")) { 
    imageView.setImageResource(R.drawable.img1); 
    } else if (mobile.equals("prd2")) { 
     imageView.setImageResource(R.drawable.feijao); 
    } else { 
     imageView.setImageResource(R.drawable.acucar); 
    } 


    } else { 
    gridView = (View) convertView; 
    } 

    return gridView; 
} 

    public int getCount() { 
     return mobileValues.length; 
} 

    public Object getItem(int position) { 
     return null; 
} 

    public long getItemId(int position) { 
     return 0; 
} 

} 
+0

Und wie Ihr Code-Bild-Adapters aussieht? –

+0

@TomaszGawel das einzige, was wir getan haben, war den Adapter gridView.setAdapter (new ImageAdapter (this, name_array, description_array)); – user1419496

+0

aber ImageAdapter ist keine Standardklasse, daher stellen Sie den Code der ImageAdapter-Klasse zur Verfügung, da ich vermute, dass die getItem-Methode für Ihren Fall einfach null zurückgibt. –

Antwort

7

gridView.getItemAtPosition(position) die getItem(int position) unter der Szene des Adapters Anruf - so implementieren getItem in Ihrer ImageAdapter Klasse etw zurückzugeben, die es Ihnen erlaubt, zu identifizieren, was ausgewählt ist (vielleicht ist mobileValues[position] genug oder einfach nur was du in textview schreibst: mobileValues[position] + "\n" + mobileValuesD[position]).

Auf der anderen Seite in onItemClick(AdapterView<?> parent, View v, int position, long id) haben Sie bereits die Position des ausgewählten Artikels vielleicht ist es genug Informationen? Was machst du in diesem Zuhörer?

Ich habe einige Änderungen an Ihrem Adapter setzen:

public class ImageAdapter extends BaseAdapter { 

    private final String[] mobileValues; 
    private final String[] mobileValuesD; 

    public ImageAdapter(String[] mobileValues, String[] mobileValuesD) { 
     this.mobileValues = mobileValues; 
     this.mobileValuesD = mobileValuesD; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
     if (view == null) { 
      view = ViewGroup.inflate(
        parent.getContext(), R.layout.pesquisa_2, null); 
     } 

     ((TextView) view.findViewById(R.id.grid_item_label)) 
       .setText(getItem(position)); 

     ((ImageView) view.findViewById(R.id.grid_item_image)) 
       .setImageResource(getImageResForPosition(position)); 

     return view; 
    } 

    private int getImageResForPosition(int position) { 
     String mobile = mobileValues[position]; 
     if (mobile.equals("pdt1")) { 
      return R.drawable.img1; 
     } else if (mobile.equals("prd2")) { 
      return R.drawable.feijao; 
     } else { 
      return R.drawable.acucar; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mobileValues.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return mobileValues[position] + "\n" + mobileValuesD[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
} 
+0

Vielen Dank Tomasz Gawel! jetzt läuft alles perfekt! – user1419496

+0

Wie Sie die Klassendaten über recylerview getItemAtPosition (Position) erhalten, wenn ein Objekt angeklickt wurde. –