0

Я использую Firebase для моих приложений назад, и я извлекаю свои данные как исключенные. После получения моих данных я отправляю его, используя otto bus, и этот код можно увидеть ниже.RecyclerView перезагружается, когда нажимается элемент.

@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; 
} 

Любая помощь с благодарностью благодарит вас!

ответ

0

в public void onBrotherClicked(Brother brother) где RecyclerView проживает, вы звоните:

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

, который будет вызывать

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

в newIntent вашего 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 проживает. И назовите свою деятельность ViewPage.

- ОБНОВЛЕНИЕ -

Обратитесь к ViewPager активности (который используется для отображения данных Brother) со следующим кодом:

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

поэтому я должен поместить метод newIntent, где находится recyclerview, а затем вызвать метод OnBrotherClicked? –

+0

Я попробовал не повезло): –

+0

Вы должны поместить его туда, где находится ваш RecyclerView. Btw, 'Я забываю добавить context.startActivity (намерение),' в newIntent, обновит его. –

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())); 
} 

Я не знаю, насколько хорошо это решение с точки зрения чистоты, но оно работает для меня. Я надеюсь, что это помогает кому-то.

+0

Рад, что вы нашли ответ :). Но ваше решение, возможно, не работает, когда в RecyclerView уже есть данные. –

+0

Я закрыл приложение и переиздал его, и до сих пор ничто не разбилось, что является началом LOL, если вы можете сказать мне другой способ проверить, буду ли я участвовать в каких-либо пробках, это будет очень полезно. –

+0

Пока что я 't: P. Просто создайте еще один вопрос, если у вас есть проблемы. ;) –

Смежные вопросы