Как получить выбранный элемент из Gridview с помощью ImageAdapter? (Андроид)

Я использовал ListView для отображения некоторых данных (String), извлеченных из базы данных... довольно просто, но один из моих коллег решил поместить изображение перед текстом на экране. Нам не удалось сделать это с помощью Listview, но мы нашли пример с GridView, который выглядел именно так, как нам нужно, затем мы потратили некоторое время на использование GridView и поместили изображение перед текстом.

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

Я использую OnItemClickListener, а в onItemClick метод gridView.getItemSelectedAtPosition(), но все, что я получаю, является «нулевым».

Теперь я не знаю, имеет ли к этому какое-то отношение ImageAdapter, потому что, если я изменю его на ArrayAdapter, я смогу правильно получить правильный элемент, но таким образом в строке нет изображения.

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

что я могу сделать?

EDITED - источник ListView

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;
 }

 }

person user1419496    schedule 26.05.2012    source источник
comment
И как выглядит код вашего адаптера изображения?   -  person Tomasz Gawel    schedule 27.05.2012
comment
@TomaszGawel единственное, что мы сделали, это установили адаптер gridView.setAdapter(new ImageAdapter(this, name_array, description_array));   -  person user1419496    schedule 27.05.2012
comment
но ImageAdapter не является стандартным классом, поэтому предоставьте код класса ImageAdapter, поскольку я подозреваю, что метод getItem просто возвращает null для вашего случая.   -  person Tomasz Gawel    schedule 27.05.2012
comment
@TomaszGawel извините, я действительно думал, что это стандартный класс, так как не я изменил Listview на Gridview, я не знаю всего, что было сделано ... кстати, вы правы, метод возвращает ноль, не так ли? есть идеи, как я могу написать это, чтобы получить текст в выбранной строке??? Спасибо   -  person user1419496    schedule 27.05.2012
comment
как я мог, если вы не предоставили источник?   -  person Tomasz Gawel    schedule 27.05.2012


Ответы (1)


gridView.getItemAtPosition(position) вызывает getItem(int position) адаптера под сценой, поэтому реализуйте getItem в своем классе ImageAdapter, чтобы вернуть что-то, что позволит вам определить, что выбрано (возможно, mobileValues[position] достаточно или просто то, что вы пишете в textview: mobileValues[position] + "\n" + mobileValuesD[position]).

С другой стороны, в onItemClick(AdapterView<?> parent, View v, int position, long id) у вас уже есть позиция выбранного элемента, может быть, достаточно информации? что вы собираетесь делать в этом слушателе?

Я внес некоторые изменения в ваш адаптер:

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;
    }
}
person Tomasz Gawel    schedule 26.05.2012
comment
Большое спасибо Томаш Гавел! теперь все работает отлично! - person user1419496; 27.05.2012
comment
как получить данные класса через recylerview getItemAtPosition (position) при нажатии элемента. - person Zia Ur Rahman; 25.06.2016