web-dev-qa-db-ja.com

OnItemClickListenerがトリガーされないAndroid GridView

私は、それぞれがImageButtonとTextViewを含むLinearLayoutsを返すアダプターで満たされたグリッドビューを持っています。

アダプターでは、onClickおよびonLongClickイベントをImageButtonにバインドしています。

OnItemClickListenerをグリッドビューにバインドしようとしていますが、onItemclickedが起動されなかった理由がわかりません。

何もない私の6時間目です。

ところで; OnItemSelectListenerはグリッド上で完全に機能します。

コードの一部が誤ってonItemClickedを処理したが、まだキャッチできなかったかどうかを確認しています。

助けが必要です。

gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null);
gridView.setOnItemClickListener(new ItemClickListener());
. 
.
.

//inner handler class
class ItemClickListener implements AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +            
        i,Toast.LENGTH_SHORT).show();
    }
}
29
Olgun Kaya

グリッドでクリック可能なオブジェクトを使用しないでください。その場合AndroidはGridViewのクリックイベントを処理できません。

代わりに、何かを使用して同様のユーザーインターフェイスビューを表示します。次に、そのオブジェクトのクリックアクションを処理します。

しないでください:ButtonGridViewを入れて、クリック操作を実行します。

Do:ImageViewの代わりにImageButtonを置き、ImageViewのクリックイベントを処理します。

79
Olgun Kaya

ButtonまたはImageButtonを使用する場合は、ウィジェットのXMLコードにこれらの属性を記述する必要があります。

Android:focusable="false"
Android:focusableInTouchMode="false"

私にとってはその作品。

ただし、GridViewでは、これらのウィジェットの使用を避けてください。これらの代わりに、他のウィジェットを使用できます(ImageViewなど)。

13
MPG

また、ListAdpterがtrueを返すことも確認してください

パブリックブールisEnabled(int _position)

クリックしたい位置に.

3
r-hold

設定してみてください

    Android:clickable="false"
    Android:focusable="false"
1
newbie

やあ、ガイズはようやく解決策を得ました...

ここでは、GridView内のレイアウトに直接アクセスしているため、onItemClickListenerがアイテムへのアクセスを混乱させています。

したがって、解決策は、アダプター(つまり、通常はArrayAdapter)内にonClickListenerを適用することです。

だから私が言おうとしているのは:

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

いくつかの理由により、私も同じ問題に直面しています。だから、ここに私のヒントがあります:

  1. アダプターの拡張BaseAdapter;
  2. OnItemClickListener for GridViewを設定する代わりに、アダプターのgetView内でOnClickListenerを使用します。
  3. LayoutParamsを複数回設定しないでください。
  4. 位置= 0かどうかを確認し、convertViewを使用せず、新しいインフレートView;
  5. Set OnClickListenerは親Viewだけでなく、すべての子View(ある場合)に設定します。
  6. すべてのView sをクリック可能にします。

4台のデバイスでテストしたところ、このソリューションは期待どおりに動作しました。それがあなたの場合に役立つことを願っています。私が何か間違ったことをしたら私を訂正してください。

レイアウトコードXML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="100dp"
    Android:layout_height="100dp"
    Android:background="#273238"
    Android:clickable="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    Android:padding="1dp">

<ImageView
    Android:id="@+id/open_image_item_imageview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:src="@drawable/loh"
    Android:clickable="true"
    Android:focusable="false"
    Android:focusableInTouchMode="false"
    Android:scaleType="centerCrop"/>
<TextView
    Android:id="@+id/open_image_item_textview"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:clickable="true"
    Android:focusable="false"
    Android:focusableInTouchMode="false"
    Android:layout_gravity="bottom"
    Android:padding="4dp"
    Android:textSize="10sp"
    Android:ellipsize="start"
    Android:background="#55000000"
    Android:textColor="#FFFFFF"
    Android:text="image name"/>

</FrameLayout>

アダプターコードJava:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;
        if(convertView != null && position != 0)
            view = convertView;
        else{
            view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false);
            view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));
        }

        TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview);
        ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview);

        ...

        View.OnClickListener onClickListener = getOnClickListener(files[position]);
        view.setOnClickListener(onClickListener);
        textView.setOnClickListener(onClickListener);
        imageView.setOnClickListener(onClickListener);

        return view;
    }
0
Dr. Failov