6

我有一个GridView带有ImageView,TextView和两个Button's. Grid 看起来不错,但我发现很难在GridView. 我是安卓新手。

任何帮助,将不胜感激。

谢谢。

4

4 回答 4

12

如果您希望按钮(和其他任何东西)在您的布局中具有独特的点击操作,您需要编写一个自定义适配器并覆盖getView()

public MyAdapter(Context context, List<T> objects) {
    ...
    inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView == null) {
        // Inflate and initialize your layout
        convertView = inflater.inflate(R.layout.grid_item, parent, false);
        holder = new ViewHolder();
        holder.btnOne = (Button) convertView.findViewById(R.id.btnOne);
        holder.btnOne.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Do something
            }
        });
        // etc, etc...
        convertView.setTag(holder);
    }
    else
        holder = (ViewHolder) convertView.getTag();

    // Do things that change for every grid item here, like
    holder.textOne.setText(getItem(position));          
    return convertView;
}


class ViewHolder {
    Button btnOne;
    TextView textOne;
}

多年来,这个概念已经在各种 Google Talks 中得到了很好的解释,这里有一个


添加

我试图在单击 GridView 内的按钮时在 GridView 列内设置 TextView 的文本。

您应该能够onClick()通过询问视图的父级然后获取 ViewHolder 来访问布局中的任何视图:

public void onClick(View v) {
    ViewHolder holder = (ViewHolder) ((View) v.getParent()).getTag();
    // Do something with holder.textOne now
}

(这假设您的布局没有任何嵌套的 ViewGroup,因此请进行相应调整。)

于 2012-11-04T17:07:17.767 回答
4

在适配器内设置 OnClick 侦听器并侦听相同的单击,如以下博客中所述

内部适配器

 holder.okay_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((GridView)parent).performItemClick(v,position,0);

        }
    });
 holder.cancel_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((GridView)parent).performItemClick(v,position,0);

        }
    });

在java文件中。

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int        position, long id) {
           switch(view.getId)
        {
         case R.id.okay_button:
           //do your stuff
           break; 
         case R.id.cancel_button:
           //do your stuff 
            break;
            }
    });

注意:如果您使用多个子项单击侦听器,请使用 switch case 检查在 SetOnItemClickListener 中单击了哪个项。因为使用 if else 会触发您在适配器中拥有的所有单击侦听器。如果有任何好的解决方案,请告诉我。谢谢。

于 2015-09-25T09:09:15.240 回答
1
 gridView = root.findViewById(R.id.gridview);
    CustomAdapter customAdapter = new CustomAdapter();
    gridView.setAdapter(customAdapter);
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) 
        {
            if(view.getId() == R.id.buyButton) {
                Intent intent = new Intent(getActivity(), OrderSummary.class);
                intent.putExtra("name", canWaterName[i]);
                intent.putExtra("price", canWaterPrice[i]);
                intent.putExtra("image", canWaterImage[i]);
                startActivity(intent);
            }
        }
    });

在扩展基本适配器的自定义适配器内部

 @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View view1 = getLayoutInflater().inflate(R.layout.row_data,null);
        //getting view in row_data
        final TextView name = view1.findViewById(R.id.canwaterName);
        final TextView price = view1.findViewById(R.id.canwaterPrice);
        final ImageView image = view1.findViewById(R.id.images);
        name.setText(canWaterName[position]);
        price.setText(canWaterPrice[position]);
        image.setImageResource(canWaterImage[position]);
        final Button buy = view1.findViewById(R.id.buyButton);
        buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((GridView)parent).performItemClick(v,position,0);
            }
        });
        return view1;
    }
于 2020-02-02T17:05:40.873 回答
0

您必须使用 onItemClickListener

 gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, 
                long row) {
 }

位置应该告诉你点击的元素。但我认为 gridview 在处理带有 clicklisteners 的对象(如按钮)时遇到问题。也许会更好地改变其他容器的gridview。如果您需要 gridview,您可以使用 setOnTouchListener 在屏幕中捕获位置并创建手动 onitemclicklistener。

于 2012-11-04T17:01:16.407 回答