在Activity中使用ArrayList作为frament中RecyclerView Adapter的内容

时间:2016-02-19 16:38:23

标签: android android-fragments arraylist static android-recyclerview

我有一个Activity,其中TabLayout中有两个片段。

在我的Activity中,有一个静态ArrayList。 我是我的拳头Fragment,我们称之为FragmentOne我有一个RecyclerView而第二个FragmentFragmentTwo我需要魔法发生。

FragmentTwo中,我从我的ArrayList调用相同的Activity并向其中添加一个或多个项目。在FragmentOne中,我也调用相同的ArrayList并将其值传递给非静态ArrayList,即RecyclerView适配器中使用的值。{/ p>

如何在我的第二个notifyDataSetChanged()中调用FragmentOne的{​​{1}} RecyclerView方法,以便Fragment更新内容?< / p>

或者有一种更有效的方式将项目发送到我在RecyclerView中使用的Fragment ArrayList

我的活动:

RecyclerView Adapter

FragmentOne RecyclerView:

public class MainActivity {

    TabLayout tabLayout;
    ViewPager viewPager;
    ViewPagerAdapter viewPagerAdapter;
    FragmentOne fragmentone;

    // The ArrayList used as FragmentOne RecyclerView's Adapter
    public static ArrayList<Contacts> contactsArrayList;

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

        fragmentOne = new FragmentOne();

        contactsArrayList = new ArrayList<>();

    }

}

我唯一需要的是如何在我的第二个片段中调用public class FragmentOne extends Fragment implements View.OnClickListener { // RecyclerView's adapter ContactsAdapter ctcAdapter; // RecyclerView RecyclerView rvContacts; public FragmentOne() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_one, container, false); // RecyclerView rvContacts = (RecyclerView) view.findViewById(R.id.rvContacts); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); rvContacts.setLayoutManager(linearLayoutManager); // Here I'm adding the static list from the Main Activity in the adapter ctcAdapter = new ContactsAdapter(getContext(), MainActivity.contactsArrayList); rvContacts.setAdapter(ctcAdapter); return view; } } ,之后我向ctcAdapter.notifyDataSetChanged()添加一个新项目,使第一个片段中的列表显示添加的项目。< / p>

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。一种方法是让FragmentOne实现一个监听器。类似的东西:

public interface ContactsChangedListener {
   void onContactsChanged();
}

public class FragmentOne implements ContactsChangedListener ... {
   ...
   @Override
   void onContactsChanged() {
     ctcAdapter.NotifyDataSetChanged();
   }
}

FragmentTwo中,提供一种传递侦听器的方法:

public class FragmentTwo ... {
   ...
   private ContactsChangedListener mContactsChangedListener;
   ...
   public void setContactsChangedListener(
     ContactsChangedListener listener) {
     mContactsChangedListener = listener;
   }
}

然后,在onCreate的{​​{1}}中,您可以将其作为接口传递给另一个:

MainActivity

没什么特别的。但它可以解决问题,并保持封装。