【问题标题】:GridView onItemClickListener never gets invokedGridView onItemClickListener 永远不会被调用
【发布时间】:2011-05-12 18:16:11
【问题描述】:

我有一个GridView,其中包含自定义View,即ButtonTextView。我定义了setOnItemClickListener,但它看起来从未被调用过,请参阅下面的代码。

gridview = (GridView) findViewById(R.id.main_gridview);
gridview.setAdapter(new GridAdapter(this));

gridview.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) {
        Toast.makeText(getApplicationContext(), "gadsfadsf", 
            Toast.LENGTH_SHORT).show();
        Log.d("Main", "onItemClick");
    }
});

【问题讨论】:

    标签: java android android-gridview


    【解决方案1】:

    标记的答案有点像黑客。不要为按钮设置 onclicklistener,只需确保 ButtonView 和 TextView 具有以下属性:

    android:clickable="false"
    

    【讨论】:

    • 这就是解决方案。谢谢
    • 还有 android:focusable="false"
    • 简单的最佳答案。
    【解决方案2】:

    我有同样的问题。虽然我还没有弄清楚为什么它永远不会被调用,但我可以提出一个解决方法。

    不要在 GridView 上设置 onClickListener,而是在 GridAdapter 内的 Button 本身上设置它,在 getView() 方法内。

    这对我有用!

    【讨论】:

    • 是的,它起作用了,但是为什么触摸网格视图不起作用,这个问题不与 listview 一起出现,为什么网格视图
    【解决方案3】:

    可能是您的 GridView 中的某些项目正在窃取焦点。尝试将这些属性添加到网格内的任何元素:

    android:focusable="false"
    android:focusableInTouchMode="false"
    

    【讨论】:

      【解决方案4】:

      而不是在您的GridView 上设置onClickListener
      GridAdapter 中的Button 本身上设置它,在getView() 方法中。

      这对我有用!

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,事件grid.itemClickListener 从未启动。

        在我的例子中,我有两个听众:grid.itemClickListener 和另一个 clickListener 附加到项目布局中的 Button

        在摆弄布局一段时间后,我意识到如果在项目的布局中有一个小部件,focusable=true,那么itemClickListener 永远不会启动。附加到ButtonclickListener 运行良好。

        也许这就是你的情况。无论如何,我认为这些信息可能对遇到相同问题的其他用户有用。

        【讨论】:

          【解决方案6】:

          感谢 CodingUser

          我们所做的是直接访问 GridView 中的 Layout,因此 onItemClickListener 发现访问项目很混乱。

          所以解决方法是在Adapter内部应用onClickListener(即通常是ArrayAdapter)

          所以我想说的是:

          public View getView(int position, View convertView, ViewGroup parent) {
          
                      //Here row is a view and we can set OnClickListener on this
              final View row;
              ViewHolder holder = null;
          
              if (convertView == null) {
                  LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                  //Here we inflate the layout to view (linear in my case)
                  row = inflater.inflate(layoutResourceId, parent, false);
                  holder = new ViewHolder();
                  holder.imageTitle = (TextView) row.findViewById(R.id.text);
                  holder.image = (ImageView) row.findViewById(R.id.image);
                  row.setTag(holder);
              } else {
                  row = convertView;
                  holder = (ViewHolder) row.getTag();
              }
          
              ImageItem item = data.get(position);
              holder.imageTitle.setText(item.getTitle());
              holder.image.setImageBitmap(item.getImage());
          
              //Now get the id or whatever needed
              row.setId(position);
              // Now set the onClickListener
              row.setOnClickListener(new OnClickListener() {
          
                  @Override
                  public void onClick(View v) {
                      // TODO Auto-generated method stub
                      Toast.makeText(context, "Clicked" + row.getId() + "!!",
                              Toast.LENGTH_SHORT).show();
                  }
              });
              return row;
          }
          

          【讨论】:

            【解决方案7】:

            您可以在 GridView 的 Adapter 中设置 OnClick 进行查看。它对我有用。

            public View getView(final int position, View convertView, ViewGroup parent) {
                ObjMenuVideo objListVideo = mListMenuVideo.get(position);
                final ViewHolder holder;
                if (convertView == null) {
                    holder = new ViewHolder();
                    inflater = (LayoutInflater) mContext
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.item_video_of_kind, null);
                    holder.tv_number_views = (TextView) convertView
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.tv_number_views.setText(String.valueOf(objListVideo.getViews()));
                convertView.setId(position);
                convertView.setOnClickListener(new OnClickListener() {
            
                    @Override
                    public void onClick(View v) {
                        Intent menuVideoIntent = new Intent(mContext,
                                ActivityDetailVideo.class);
                        mContext.startActivity(menuVideoIntent);
                    }
                });
            
                return convertView;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-27
              • 2013-10-12
              • 2012-03-27
              • 2013-08-29
              • 2013-11-03
              • 1970-01-01
              • 1970-01-01
              • 2015-05-06
              相关资源
              最近更新 更多