3

カスタムアイテムレイアウトを使用してGridViewを設計しました。左上隅に1つのImageView、右上隅に別のImageView、中央にメインのImageViewとテキストがあります。

コーナーの2つのImageViewとアダプタのOnItemClickListenerの両方にOnClickListenerを設定する必要があります。

すべて正常に機能しましたが、GridViewの最初のアイテムのみがOnClickListenerをトリガーできません。誰かがこの問題を解決できますか?

PS次のアクション(他のアイテムをクリックするなど)を実行すると、ImageViewのOnClickListenerがトリガーする最初のアイテムを見つけました

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    TagView tag;
    if (convertView == null) {
        v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
        tag = new TagView(
                (ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
                (TextView) v.findViewById(R.id.myDoc_GridItem_TV),
                (ImageView) v.findViewById(R.id.iViewAdd2Category),
                (ImageView) v.findViewById(R.id.iViewDelete));
        v.setTag(tag);
    } else {
        tag = (TagView) v.getTag();
    }

    v.setLayoutParams(new GridView.LayoutParams((int) (180 * v
            .getResources().getDisplayMetrics().density), (int) (180 * v
            .getResources().getDisplayMetrics().density)));


    tag.image.setScaleType(ImageView.ScaleType.CENTER_CROP);
    tag.image.setImageDrawable(new BitmapDrawable(BitmapFactory.decodeFile(m_DisplayItems.get(position)
                    .get("image").toString())));
    tag.text.setText(m_DisplayItems.get(position).get("text").toString());
    tag.iAdd2Category.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
    tag.iDelete.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
    if (m_IsEdit) {
        tag.iAdd2Category.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Click on image add 2 category");
            }
        });

        tag.iDelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Click on image delete");
            }
        });
    }

    return v;
}
4

4 に答える 4

1

リストのアイテムのミキシングOnClickListenersOnItemClickListenersforはうまく機能しません。

あなたの場合、あなたはおそらくOnClickListenersあなたのアイテムの異なる部分で複数を使用するべきであり、まったく使用OnItemClickListenerしないでください。

于 2013-01-07T10:18:17.070 に答える
1

私はついにこの記事で答えを見つけました。

OnClickListenerがGridViewの最初のアイテムに対して機能しない

私の場合:

if (convertView == null) {
    v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
    tag = new TagView(
            (ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
            (TextView) v.findViewById(R.id.myDoc_GridItem_TV),
            (ImageView) v.findViewById(R.id.iViewAdd2Category),
            (ImageView) v.findViewById(R.id.iViewDelete));
    v.setTag(tag);
} else {
    tag = (TagView) v.getTag();
}

if elseステートメントを削除するだけで、「タグ」が毎回インスタンス化されます。

于 2013-01-14T01:34:51.730 に答える
1

この問題の理由は、Androidが、ビューが描画されるときだけでなく、レイアウト測定のためにも最初のアイテムに対してgetView()を呼び出すためです。getView()内でメジャー呼び出しと描画呼び出しを区別する方法はありません。したがって、最初に描画呼び出しを行い、後でメジャー呼び出しを行うと、onClickListenerが上書きされます。実際、そうするのは正しいようです-毎回そうするので、私はこの振る舞いを観察しました。たぶん、clickListenerを設定すると、ビューが描画されないため、システムはgetView呼び出しの後にそれを解放します...私は保証するのに十分な深さを追跡していませんでした。

それでも、非常に時間がかかるため、毎回ビューを再作成することはお勧めできません。グリッドがスムーズにスクロールしない可能性があります。

解決策は、次のように独自のGridViewを作成することです。

public class MyGridView extends GridView{
private GridAdapter adapter;


public MyGridView(Context context) {
    super(context);
}

public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public MyGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setAdapter(GridAdapter adapter) {
    this.adapter = adapter;
    super.setAdapter(adapter);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(adapter!=null)
        adapter.setIsMeasureCall();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}}

GridAdapterにメソッドsetIsMeasureCall()を実装します。このメソッドは、呼び出されるたびにフラグをtrueに設定するだけです。次に、getView()メソッドで、それがメジャー呼び出しであるかどうかを確認し、これがtrueであるかどうかを確認します。リスナーは設定しません。

getView()メソッドの最後でisMeasureをfalseに設定してください。

私はすべてが明確であることを願っています:)

詳細については、この問題を解決する完全なAndroidプロジェクトを提供している私のホームページをチェックしてください。 http://simon.osim.at/projects/gridadapter/#TheSolution

于 2015-09-24T10:34:17.957 に答える
0

セレクターファイル

    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/gridview_item_shape"></item>
     <item android:state_pressed="false" android:drawable="@android:color/transparent"></item>
</selector>

アイテムレイアウトファイル

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/griditem"
        android:padding="2dp"
        android:src="@drawable/grid_photo"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/gridview_item_select"
         />
</RelativeLayout>
于 2013-03-08T06:42:34.077 に答える