4

アプリでスライド メニュー/ドロワー パターンを使用しています。したがって、メイン アクティビティには、一連のトピック アイテムをロードする topicFragment() という名前の ListFragment である leftView があります。アイテム/トピックがクリックされると、FeedsFragment(tag) を呼び出してメイン ビューのフラグメントを置き換えます。FeedsFragment は arraylist アダプターを使用して、各リスト項目にさまざまなクリック可能な項目を持つフィードを読み込みます。リスト項目内で項目がクリックされたときに、feedsFragment(tag) で別のインスタンスを取得したいと考えています。

    holder.contextView= (TextView) newsView.findViewById(R.id.arcHeader);
    if (item.hasArc()) {
        holder.contextView.setVisibility(View.VISIBLE);
        String arc;
        try {
            arc=item.getarc();
            holder.contextView.setText(arc);

            holder.contextView.setOnClickListener(new View.OnClickListener() {

                //currently it loads a class
                @Override
                public void onClick(View v) { 
                   Intent i = new Intent(context, SomeClass.class); 
                   i.putExtra("tag", arc);
                   context.startActivity(i);
                }
            });
        } catch (JSONException e) {

            e.printStackTrace();
        }

    } else {
        holder.contextView.setVisibility(View.GONE);
    }

現在、新しいクラスをロードします。フラグメントを定義し、メイン アクティビティに渡して現在のビューに置き換えたいのですが、アダプター クラス内では getSupportFragmentManager() を使用できませんが、フラグメントまたはフラグメント アクティビティ内でのみ使用できます。アダプターからフラグメントをスイープする代わりに何が必要ですか?

4

4 に答える 4

3

リストアダプターで渡されたコンテキストを使用して解決しました:

@Override
public void onClick(View v) {
    Fragment newFragment = new ListFragmentClass(tag);
    if (newFragment != null)
        switchFragment(newFragment);
}

private void switchFragment(Fragment newFragment) {
    if (context == null)
        return;
    if (context instanceof MainActivity) {
        MainActivity feeds = (MainActivity) context;
        feeds.switchContent(newFragment);
    }
}

ここで、switchContent は、Justin V の回答で示されているように、フラグメントを切り替える/置き換えるためのメイン アクティビティで定義されたメソッドです。

于 2013-02-11T22:08:54.570 に答える
3

私がしたことは、メイン アクティビティでこのメソッドを作成し、他のクラスから呼び出してフラグメントを変更することでした。

public void switchContent(Fragment fragment) {
        mContent = fragment;
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment).commit();

        slidemenu.showContent();

    }
于 2013-02-09T04:34:21.703 に答える
0

getFragmentManager()アダプターのコンストラクターでパラメーターとして渡し、それを使用します。

于 2014-06-27T13:10:11.577 に答える
0

を使用しInterfaceて、サイド ドロワーListFragmentをメイン アクティビティに接続します。例えば:

public class LeftDrawer extends ListFragment{

    private DrawerCallback mCallback;

    public interface DrawerCallback{
        public void onListClick(String tag);
    }

    public void setCallback(DrawerCallback callback){
        mCallback = callback;
    }

} 

空のコンストラクターを持つ必要があるため、ドロワーへの追加を完了する前に、Fragments内部でパブリック メソッドを使用してコールバックを設定します。この時点で残っているのは、クリックが発生したことを通知することだけです。アダプターのすべてのビューに onClickListener を追加するのではなく、実際にクリックを直接キャッチする必要があります。FragmentFragmentTransactionFragmentListFragment

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    /*
     * Get item at the clicked position from your adapter and
     * get its string tag before triggering interface
     */
   mCallback.onListClick(tag);
}

これを行うには、onListItemClick メソッドを使用します。クリックされたリストの位置を取得し、アダプターからそのアイテムを簡単に取得して、そのタグ値を取得してホスト アクティビティに戻すことができます。

于 2014-06-27T14:03:15.373 に答える