单击项目时,RecyclerView将重新加载

时间:2016-07-20 03:50:08

标签: android firebase android-recyclerview firebase-realtime-database otto

我正在使用 Firebase 作为我的应用后端,我正在检索我的数据为例外。在我检索数据后,我使用 otto bus 发布它,代码可以在下面看到。

@Subscribe
public void loadBrothers(ServiceCalls.SearchBrothersRequest request) {
  final ServiceCalls.SearchBrothersResponse response = new ServiceCalls.SearchBrothersResponse();
  response.Brothers = new ArrayList<>();
  Firebase reference = new Firebase("my data's url here");

  reference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      int index = 0;

      for (DataSnapshot brotherSnapchat : dataSnapshot.getChildren()) {
        BrotherFireBase bro = brotherSnapchat.getValue(BrotherFireBase.class);
        Log.i(LOG_TAG, bro.getName());
        Log.i(LOG_TAG, bro.getWhy());
        Log.i(LOG_TAG, bro.getPicture());
        Log.i(LOG_TAG, bro.getMajor());
        Log.i(LOG_TAG, bro.getCross());
        Log.i(LOG_TAG, bro.getFact());

        Brother brother = new Brother(
                        index,
                        bro.getName(),
                        bro.getWhy(),
                        bro.getPicture(),
                        bro.getMajor(),
                        bro.getCross(),
                        bro.getFact());

        response.Brothers.add(brother);
        index++;
      }

      bus.post(response);
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
  });

一旦数据在我的RecyclerView中,我就点击一个项目,它的相应活动将在自定义活动对话框中弹出。但是,由于活动是一个对话框,您可以在后台看到RecyclerView重新加载。当我不从互联网上检索数据时,这不会发生。点击几下后,应用程序因内存不足异常而崩溃。有什么我想念的吗?

以下是找到recyclerView的活动:

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_meet_a_brother, container, false);
  adapter = new BrotherRecycleAdapter((BaseActivity) getActivity(),this);
  brothers = adapter.getBrothers();
  recyclerView =(RecyclerView) view.findViewById(R.id.fragment_meet_a_brother_recycleView);
  recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),3));
  setUpAdapter();
  bus.post(new ServiceCalls.SearchBrothersRequest("Hello"));
  return view;
}

private void setUpAdapter(){
  if(isAdded()){
    recyclerView.setAdapter(adapter);
  }
}


@Subscribe
public void onBrosLoaded(final ServiceCalls.SearchBrothersResponse response){
  int oldBrotherLength = brothers.size();
  brothers.clear();
  adapter.notifyItemRangeRemoved(0, oldBrotherLength);
  brothers.addAll(response.Brothers);

  //Delete for Debug method...
  adapter.notifyItemRangeChanged(0,brothers.size());
  Log.i(LOG_TAG, Integer.toString(brothers.size()));
}


@Override
public void onBrotherClicked(Brother brother) {
  Intent intent = BrotherPagerActivity.newIntent(getActivity(),brother);
  Log.i(LOG_TAG,brother.getBrotherName() + " was Clicked");
  startActivity(intent);
}

以防万一,这里也是单击列表项时启动的活动,它是viewPager activity

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

  brothers = new ArrayList<>();
  bus.post(new ServiceCalls.SearchBrothersRequest("Hello"));

  FragmentManager fragmentManager = getSupportFragmentManager();
  viewPager = (ViewPager) findViewById(R.id.activity_brother_viewPager);
  viewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
    @Override
    public Fragment getItem(int position) {
      Brother brother = brothers.get(position);
      return BrotherDetailsFragment.newInstance(brother);
    }

    @Override
    public int getCount() {
      return brothers.size();
    }
  });

}

@Subscribe
public void onBrosLoad(final ServiceCalls.SearchBrothersResponse response){
  brothers.clear();
  brothers.addAll(response.Brothers);
  viewPager.getAdapter().notifyDataSetChanged();
  Brother brother = getIntent().getParcelableExtra(BROTHER_EXTRA_INFO);
  int brotherId = brother.getBrotherId();

  for(int i=0;i<brothers.size();i++){
    if(brothers.get(i).getBrotherId() == brotherId){
      viewPager.setCurrentItem(i);
      break;
    }
  }
  Log.i(LOG_TAG, Integer.toString(brothers.size()));
}

public static Intent newIntent(Context context, Brother brother){
  Intent intent = new Intent(context,BrotherPagerActivity.class);
  intent.putExtra(BROTHER_EXTRA_INFO,brother);
  return intent;
}

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

在RecyclerView所在的public void onBrotherClicked(Brother brother)中,您可以调用:

Intent intent = BrotherPagerActivity.newIntent(getActivity(),brother);

将调用

Intent intent = new Intent(context,BrotherPagerActivity.class);`

viewPager activity的新内容中。

这可能是递归电话。

尝试添加:

public static Intent newIntent(Context context, Brother brother){
  Intent intent = new Intent(context,BrotherPagerActivity.class);
  intent.putExtra(BROTHER_EXTRA_INFO,brother);
  return intent;
}
在您的RecyclerView所在的Activity中的

。并在那里调用您的ViewPage活动。

- 更新 -

使用以下代码调用您的viewpager活动(用于显示Brother数据):

private void showBrotherData(Brother brother){
  Intent intent = new Intent(this, BrotherPagerActivity.class);
  intent.putExtra(BROTHER_EXTRA_INFO, brother);
  this.startActivity(intent);
}

答案 1 :(得分:0)

我找到了答案!我将recyclerView更改为仅在数组大小为零时更新。

@Subscribe
public void onBrosLoaded(final ServiceCalls.SearchBrothersResponse response){
    int oldBrotherLength = brothers.size();
    Log.i(LOG_TAG, "Brother lists old size" + Integer.toString(oldBrotherLength));
    if(oldBrotherLength ==0){
        brothers.clear();
        adapter.notifyItemRangeRemoved(0, oldBrotherLength);
        brothers.addAll(response.Brothers);
        //Delete for Debug method...
        adapter.notifyItemRangeChanged(0,brothers.size());
    } else{
        return;
    }
    Log.i(LOG_TAG, Integer.toString(brothers.size()));
}

我不知道这个解决方案在清洁方面有多好,但它对我有用。我希望这可以帮助别人。