如何从带有ImageAdapter的GridView中获取所选项目?(Android)

7
我曾经使用了一个ListView来显示从数据库中检索的一些数据(String)...相当简单,但我的一位同事决定在屏幕上的文本前面放置一张图片。我们无法通过ListView实现它,但是我们发现了一些使用GridView的示例,看起来正是我们需要的,然后我们花了一些时间使用GridView并将图像放在了文本前面。
现在,不幸的是,我们不知道如何获取选定的项目(基于所选项目中的文本)。我正在使用OnItemClickListener,在onItemClick内部调用gridView.getItemSelectedAtPosition()方法,但我得到的都是"null"。
我不知道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     } });

我能帮您做什么?

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

 }

你的图像适配器代码是什么样子的? - Tomasz Gawel
@TomaszGawel 我们所做的唯一一件事就是设置适配器 gridView.setAdapter(new ImageAdapter(this, name_array, description_array));。 - user1419496
但是ImageAdapter不是一个标准类,因此请提供ImageAdapter类的代码,因为我怀疑它的getItem方法对于您的情况只返回null。 - Tomasz Gawel
@TomaszGawel 抱歉,我真的以为它是一个标准类,因为不是我把Listview改成了Gridview,我不知道所有的更改...顺便说一下,你是对的,该方法返回null,你有任何想法如何编写它以获取所选行的文本吗?谢谢。 - user1419496
如果你没有提供源代码,我怎么能做到呢? - Tomasz Gawel
1个回答

8

gridView.getItemAtPosition(position)会在场景下调用适配器的getItem(int position),所以在您的ImageAdapter类中实现getItem来返回允许您识别所选内容的东西(也许mobileValues[position]就足够了,或者只需将其写入文本视图: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;
    }
}

非常感谢Tomasz Gawel!现在一切都运行得非常完美! - user1419496
当单击项目时,如何通过RecyclerView的getItemAtPosition(position)获取类数据。 - Zia Ur Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接