3

ViewPager のレイアウト内に GridView があります (それが違いを生むかどうかはわかりません)。

inside SampleAdapter for ViewPager{
@Override
        public Object instantiateItem(ViewGroup container, int position) {
            View page = null;
            if (position == 0) {
                page = getLayoutInflater().inflate(R.layout.layoutone,
                        container, false);
            } else {
                page = getLayoutInflater().inflate(R.layout.layouttwo,
                        container, false);
                GridView grid = (GridView) page.findViewById(R.id.gridview);
                grid.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {

                                  //switch to another activity based on click event

                    }

                });
                grid.setAdapter(new GridItemAdapter(context)); //sets custom gridItemLayout


        container.addView(page);

        return (page);

    }

}

グリッドは問題なく表示できます。カスタム レイアウトも、私の GridAdapter に従って機能しています。ただし、クリック イベントが発生していません。instantiateItem() メソッド呼び出しが原因ですか? どうすればこれを回避できますか?

Fragments が ViewPager でどのように機能するかはまだよくわかっていないので、この解決策に Fragment ベースのメソッドへの切り替えが含まれる場合は、誰かが詳しく説明してくれると助かります。

4

3 に答える 3

2

位置を送信し、フラグメントをインスタンス化するために、アダプターを個別Fragmentに使用して作成することをお勧めします。Fragment内では、レイアウトを簡単に膨らませて使用できます。getItem(position)ViewPagerGridView

 @Override
 public Fragment getItem(int position) {
    return GridFragment.newInstance(position);
}

あなたが現在使用している方法は、私には少し複雑に見えます。だから、私はあなたにそれを試してみることを主張します。サンプルデモはhere私が言っている方法のためのものです。

于 2012-10-19T07:43:09.177 に答える
2

でクリックするのは少しおかしなことですViewPagerViewPagerこれは、 がクリック/モーション イベントをキャッチすることに少し貪欲だからです。1 つの解決策ViewPagerは、のViewGroup.onInterceptTouchEvent(MotionEvent ev)をオーバーライドすることです。ただし、これは必ずしも必要ではありません。具体的には、これを行わないとページャーに onClickListener を設定できませんでしたが、ページャーのビューに onClickListener を設定すると完全に機能します (最後にコード サンプルを添付しました)。ただし、私はこれをGridView/onItemClickListener. あなたがしていることは基本的に、ページャー内のビュー内のビューのクリックリスナーを設定することです。これは別のレイヤーです。Android で物事をネストすると、システムがクリックを処理する方法が原因で、タッチ イベントの管理がより複雑になります。

あなたの状況の問題は、何かがリスト項目に渡さずにタッチイベントを消費していることです。基本的に、Android がタッチ イベントを処理する方法は、タッチ イベントが発生すると、それをトップレベル ビューのタッチ イベント ハンドラー関数に渡すことです。ビューがイベントを処理する場合、true が返され、システムはイベントが処理されたことを認識し、処理が完了します。ビューがイベントを処理したくない場合、false が返され、システムはイベントを階層内の次に高いビューに渡します。あなたの場合、何か (ViewPagerまたはおそらくGridView) がグリッド アイテムに到達する前にイベントを消費しているため、 onItemClickListener が起動されることはありません。

GridViewテストとして、 (ビュー全体のように) onClickListener を設定して適切に動作させることができれば、それは問題が にないことを意味しViewPagerます。この場合、おそらく独自のバージョンの を実装し、GridViewタッチ イベントの処理方法をオーバーライドして、イベントが確実に子アイテムに到達するようにする必要があります。ただし、これが機能しない場合はViewPager、前述のように を上書きする必要があります。

(注: 明らかに、これらの解決策は両方ともかなりの時間を必要とするため、実行する前に、Listener を間違ったビューに配置する、動作を読み間違える、そうでないと考えるなどの単純なエラーがないか再確認してください。ある場合に発砲するなど)

参考までに、動作する instanceiateItem メソッドのバージョンを次に示します (これは実際にはまだ進行中であるため、100% きれいではありません)。「メニューページ」ビューはLinearLayout.

public Object instantiateItem(View collection, int position) {
    LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    int page = R.layout.menu_page;
    String meal = "";
    switch (position) {
        case 0:
            meal = "Breakfast!";
            break;
        case 1:
            meal = "Lunch!";
            break;
        case 2:
            meal = "Dinner!";
            break;
    }

    View view = inflater.inflate(page, null);
    TextView mealTitle = (TextView) view.findViewById(R.id.meal_title);
    mealTitle.setText(meal);

    ((ViewPager) collection).addView(view, 0);
    final ViewPager pager = (ViewPager)collection;

    View menupage = view.findViewById(R.id.menu_page_ll);
    menupage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            int page = ((ViewPager) pager).getCurrentItem();
            Intent i = new Intent(getApplicationContext(), Menus.class);
            i.putExtra("page", page);
            startActivity(i);
        }
    });

    return view;
}
于 2012-10-10T06:20:42.303 に答える
0

listView 内にクリック可能なオブジェクトはありますか? listView または gridView アイテムにクリック可能なビュー (ボタン、チェック ボックスなど) が含まれている場合、OnItemClickListener は呼び出されません。

于 2015-03-20T17:51:07.347 に答える