Как передать информацию фрагменту при нажатии элемента в фрагменте списка

У меня есть список фрагментов SecondActivityListFragment, который содержит список элементов. Если щелкнуть элемент в списке, я бы хотел передать информацию об этом выбранном элементе другому фрагменту под названием ItemViewFragment. Я создал интерфейсный класс под названием Communicator, но не знаю, как передать информацию.

SecondActivityListFragment

public class SecondActivityListFragment extends ListFragment {

Communicator communicator;

private ArrayList<SubNote> subNotes;
private SubNoteAdapter subNoteAdapter;

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

    communicator = (Communicator) getActivity();
    subNotes = new ArrayList<SubNote>();
    subNotes.add(new SubNote("Product X", "wow", "booo", new     BigDecimal(10212).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.HEALTHCARE));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));
    subNotes.add(new SubNote("Product Y", "wow", "booo", new BigDecimal(107866.23).setScale(2, BigDecimal.ROUND_FLOOR), SubNote.Category.DENTAL));

    subNoteAdapter = new SubNoteAdapter(getActivity(), subNotes);
    setListAdapter(subNoteAdapter);
}

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



    launchNoteDetailActivity(position);

}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Communicator) {
        communicator = (Communicator) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement Communicator");
    }
}

private void launchNoteDetailActivity(int position){


    ItemViewFragment itemViewFragment = new ItemViewFragment();
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_main, itemViewFragment, itemViewFragment.getTag()).commit();

    //communicator.respond(position);

    // Grab the note information associated with whatever note item we clicked on
    //SubNote subNote = (SubNote) getListAdapter().getItem(position);

}
}

Основная деятельность

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, Communicator {

//public static final String SUB_NOTE_NAME_EXTRA = "com.example.khalid.myapplication2.SubNote Title";
//public static final String SUB_NOTE_BRIEFDESCRIPTION_EXTRA = "com.example.khalid.myapplication2.SubNote BriefDescription";
//public static final String SUB_NOTE_FULLDESCRIPTION_EXTRA = "com.example.khalid.myapplication2.SubNote FullDescription";
//public static final String SUB_NOTE_PRICE_EXTRA = "com.example.khalid.myapplication2.SubNote Price";
//public static final String SUB_NOTE_CATEGORY_EXTRA = "com.example.khalid.myapplication2.SubNote Category";

// ViewPager viewPager;
// CustomSwipeAdapter imgadapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    MainActivityListFragment mainActivityListFragment = new MainActivityListFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_main, mainActivityListFragment, mainActivityListFragment.getTag()).commit();



   // viewPager = (ViewPager) findViewById(R.id.viewpager1);
   // imgadapter = new CustomSwipeAdapter(this);
   // viewPager.setAdapter(imgadapter);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}



@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);

    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    return true;
}


  /*  @Override
      public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
 }*/

  @SuppressWarnings("StatementWithEmptyBody")
  @Override
  public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_home) {
        MainActivityListFragment mainActivityListFragment = new MainActivityListFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, mainActivityListFragment, mainActivityListFragment.getTag()).commit();
        setTitle("ThimarAljazirah");
    } else if (id == R.id.nav_notification) {

        NotificationsFragment notificationsFragment = new NotificationsFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, notificationsFragment, notificationsFragment.getTag()).commit();
        setTitle("Notifications");

    } else if (id == R.id.nav_messages) {

    } else if (id == R.id.nav_categories) {

    } else if (id == R.id.nav_deals) {

    } else if (id == R.id.nav_settings) {
        SettingFragment settingFragment = new SettingFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, settingFragment, settingFragment.getTag()).commit();
        setTitle("Settings");
    } else if (id == R.id.nav_help_contact) {

    } else if (id == R.id.nav_profile) {
        MyProfile myProfile = new MyProfile();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, myProfile, myProfile.getTag()).commit();
        setTitle("My Profile");

    } else if (id == R.id.nav_signout) {
        SingOutFragment singOutFragment = SingOutFragment.newInstance("1", "2");
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main,singOutFragment, singOutFragment.getTag()).commit();

    } else if (id == R.id.nav_about_us) {
        AboutUsFragment aboutUsFragment = new AboutUsFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main,aboutUsFragment, aboutUsFragment.getTag()).commit();
        setTitle("About Thimar Aljazirah");
    }


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


@Override
public void respond(int position) {

    ItemViewFragment itemViewFragment = new ItemViewFragment();



}
}

ItemViewFragment

public class ItemViewFragment extends Fragment {


public ItemViewFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    return inflater.inflate(R.layout.fragment_item_view, container, false);
}

}

коммуникатор

public interface Communicator {
public void respond (int position);
}

2 ответа

Решение

Если оба фрагмента находятся в одном и том же действии, в этом действии может быть реализован прослушиватель (интерфейс), который прослушивает щелчок фрагмента A и передает данные во фрагмент B.

 public interface Communicator{
     void onResponse(YourData data);
 }

 public class MainActivity extends AppCompatActivity implements Communicator {

     @Override
     public void onResponse(Your data) {
         // add data to other fragment
     }
 }

Чтобы передать данные в упражнение, вы должны получить слушателя из фрагмента.

 YourFragment extends Fragment {
    private Communicator communicator;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Object host = getHost();
        if (host instanceof Communicator) {
            communicator= (Communicator) host;
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        communicator= null;
    }
}

Затем, когда onClick происходит для просмотра списка. Ты должен сделать.

onClick {
    communicator.onResponse(//your data here);
}

В другом фрагменте B вы должны создать метод newInstance(// Ваши данные), подобный этому.

public static YourFragment newInstance(String string) {
    Bundle args = new Bundle();
    args.putString(STRING_KEY, string);
    YourFragment fragment = new YourFragment ();
    fragment.setArguments(args);
    return fragment;
}

а затем при создании вы можете получить данные, данные фрагменту

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String string = getArguments().getString(STRING_KEY);

}

Вы не должны использовать конструктор по умолчанию для создания экземпляра фрагмента из-за способа, которым Android воссоздает фрагменты и действия. Вот почему мы создаем метод newInstance.

Общение с другими фрагментами деятельности

1>. Определить интерфейс

public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

...

}

2>. Реализовать интерфейс в Activity.

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article
}

}

3>. Деятельность хоста может доставлять сообщения во фрагмент, захватывая экземпляр Fragment с помощью findFragmentById(), а затем напрямую вызывать открытые методы фрагмента.

Другие вопросы по тегам