从另一个片段onClick更新片段中的RecyclerView

时间:2015-07-12 22:35:22

标签: android onclick android-viewpager android-recyclerview android-adapter

我有一个带有两个片段的ViewPager,其中包含显示位置和项目的RecyclerViews。每个位置包含不同的项目。现在,我想在LocationsFragment中选择位置时更新ItemsFragment中的recyclerView。我将onClick方法设置为location元素以更新activeLocation字段,但我不知道如何刷新items' recyclerView中的数据。

我需要提供一个从List到适配器的新getItems()对象,但只要ItemsFragment失去焦点或者使它成为每个重新创建片段,适配器就为null activeLocation更改的时间。

现在刷新的唯一时间是调用ItemsFragment onCreateView的时间。列表更新,因为创建了新的ItemAdapter并在构造函数中调用了getItems()。但这只发生在我滚动到第4个选项卡并返回时,以便从内存中清除itemsFragment(第2个)并重新加载。

的活动:

public class MainActivity extends AppCompatActivity implements     MaterialTabListener {
MaterialTabHost tabHost;
ViewPager pager;
ViewPagerAdapter adapter;
private final int[] icons = {R.drawable.icon_locations, R.drawable.icon_items};
public static Location activeLocation;

@Override
protected void onCreate(Bundle savedInstanceState) {

    Realm.setDefaultConfiguration(new RealmConfiguration.Builder(this).build());
    Realm realm = Realm.getDefaultInstance();
    activeLocation = realm.where(Location.class).findFirst();
    pager = (ViewPager) findViewById(R.id.view_pager);
    adapter = new ViewPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(adapter);
    tabHost = (MaterialTabHost) this.findViewById(R.id.materialTabHost);

    for (int i = 0; i < adapter.getCount(); i++) {
        tabHost.addTab(
                tabHost.newTab()
                        .setIcon(ResourcesCompat.getDrawable(getResources(), icons[i], null)).setTabListener(this)
        );
    }

}

ViewPager:

class ViewPagerAdapter extends FragmentPagerAdapter {

    private final String[] TITLES = {"Locations", "Items"};

    private final int[] ICONS = {R.drawable.icon_locations, R.drawable.icon_items};


    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case FragmentType.LOCATIONS: {
                fragment = LocationsFragment.newInstance();
                break;
            }
            case FragmentType.ITEMS: {
                fragment = ItemsFragment.newInstance();
                break;
            }
        }
        return fragment;
    }
}

LocationsFragment:

public class LocationsFragment extends Fragment {

   private RecyclerView recyclerView;

   private LocationAdapter adapter;

public static LocationsFragment newInstance() {
    return new LocationsFragment();
}

public LocationsFragment() {
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.fragment_locations, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.locations_recycler_view);
    adapter = new LocationAdapter(getActivity(), getLocations());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    return layout;
}

public List<Location> getLocations() {
    List<Location> locations;
    Log.d("null act", getActivity() == null? "null" : "not null");
    Realm realm =  Realm.getDefaultInstance();
    locations = realm.where(Location.class).findAll();

    return locations;
}


}

LocationAdapter:

public class LocationAdapter extends RecyclerView.Adapter<LocationAdapter.LocationHolder> {

List<Location> list = Collections.emptyList();
Context context;

private LayoutInflater inflater;

public LocationAdapter(Context context, List<Location> list) {
    this.list = list;
    this.context = context;
    inflater = LayoutInflater.from(context);
}

@Override
public LocationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.card_location, parent, false);
    return new LocationHolder(view);
}

@Override
public void onBindViewHolder(final LocationHolder holder, int position) {


    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("clicked", "Location " + location.getId() + " " + location.getName() + " pressed");
            if (context instanceof MainActivity) {
                MainActivity mainActivity = (MainActivity) context;
                MainActivity.activeLocation = location;
                mainActivity.setFragment(1);  //this changes the title on actionBar and tab highlights
            }
        }
    });
}

ItemsFragmentItemAdapter与地点相同。

0 个答案:

没有答案