Android GridView按钮点击处理程序

Android GridView按钮点击处理程序,android,android-gridview,Android,Android Gridview,我有一个安卓GridView,有一个ImageView,TextView和两个按钮。网格看起来很好,但我发现在GridView中处理按钮事件很困难。我是Android新手 任何帮助都将不胜感激 谢谢。您必须使用McClickListener gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v,

我有一个安卓
GridView
,有一个
ImageView
TextView
和两个
按钮。网格看起来很好,但我发现在
GridView
中处理按钮事件很困难。我是Android新手

任何帮助都将不胜感激


谢谢。

您必须使用McClickListener

 gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, 
                long row) {
 }
gridview.setOnItemClickListener(新的OnItemClickListener(){
公共控件单击(AdapterView父对象、视图v、内部位置、,
(长行){
}
位置应该告诉您单击的元素。 但我认为gridview在使用ClickListener(如按钮)处理对象时存在问题。可能最好将gridview更改为其他容器。如果需要gridview,可以在屏幕中使用setOnTouchListener作为捕捉位置,并创建手动onitemclicklistener。

如果需要按钮(以及其他任何内容)要在布局中具有唯一的单击操作,需要编写自定义适配器并覆盖
getView()


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

或者设置OnClick listener Inner adapter,然后按中的说明进行相同的单击

内部适配器

 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;
            }
    });
gridView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
开关(view.getId)
{
案例R.id.OK_按钮:
//做你的事
打破
案例R.id.取消按钮:
//做你的事
打破
}
});

注意:如果您正在使用多个子项click listener,请使用开关大小写检查在SetOnItemClickListener中单击了哪个项。因为使用if-else会触发适配器中的所有click listener。如果有任何解决方案,请告诉我。谢谢。

如果您发布代码,您将得到质量更好的响应谢谢你的回答。我正试图在点击GridView内的按钮时设置GridView内的TextView列的文本。我无法获取TextView的引用。我正在添加适配器的getView代码。我添加了一个示例,从一个孩子那里引用ViewHolder中的任何其他布局。如果这有帮助,请告诉我。Thanks Sam。这真的很有帮助!我的GridView的OnItemClick事件没有触发。这是因为GridView中的按钮吗?是的。一个视图中的onClick侦听器会使用该事件,阻止它到达任何其他视图…如果要同时调用这两个视图,可以将
mGridView.performClick()
添加到按钮的
onClick()
(显然,
mGridView
是一个引用GridView的类变量)。这里记录了ViewHolder对象的好处:这是一个很好的帮助!您链接的博客也很棒,谢谢。
 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);
            }
        }
    });
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;
            }
    });
 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;
    }