1

У меня есть FAB в моей activity_main, и у меня есть 5 фрагментов ViewPager. У фрагментов есть RecyclerView. Как получить доступ к этому RecyclerView из основного действия и установить метод click для FAB, чтобы при нажатии FAB recyclerview в активном фрагменте прокручивался вверх. Я попытался использовать mRecyclerView.scrollToPosition(0) внутри фрагмента. Но он не работает для всех фрагментов. У меня есть этот внутренний фрагмент. Должен ли я разместить следующее в main activity.java? Как получить доступ к RecyclerView и прокрутить его до позиции 0 при нажатии FAB во фрагменте?Настройка на клик для кнопки плавающего действия

public void setFloatingActionButton(){ 
    fab = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mRecyclerView.scrollToPosition(0); 
     } 
    }); 
} 

ответ

0

Простейшее и простое решение - использовать EventBus.

Две лучшие библиотеки EventBus для Android: EventBus и Otto. Я использую отто.

Все, что вам нужно сделать, это зарегистрировать автобус в вашем фрагменте, где размещается вид репликации. И напишите способ, например,

public void scrollToStart(){ 
//body here. 
} 

Подпишите вышеуказанный метод на автобусе следующим образом.

@Subscribe // subscribing an event to the bus. 
public void scrollToStart(ScrollToStartEvent event){ //you need to create an event class e.g ScrollToStartEvent 
//body here. 
} 

Теперь FAB onClick Listner.

public void setFloatingActionButton(){ 
    fab = (android.support.design.widget.FloatingActionButton) 
    getActivity().findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      BUS.post(new ScrollToStartEvent()); //NOTICE 
     } 
    }); 
} 

Примечание: Все, что я сделал это отправил событие, в вашем случае ScrollToStartEvent(). Bus проверяет, подписан ли какой-либо метод этому событию, и вызовет этот конкретный метод. Вы должны прочитать документацию EventBus, чтобы понять это правильно.

Достоинства: Много меньше код и более читаемый код. Сложные объекты могут быть переданы (сериализация объектов не требуется).

Против: Вам нужно научиться использовать EventBus.

Надеюсь, это вам поможет.

0

Я не уверен, поможет ли это, но я установил FAB onClick в этой операции, и вот как я это сделал. У меня есть условные действия, основанные на просмотре позиции фрагмента.

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
     case R.id.fab: 
      if(viewPager.getCurrentItem()==0){ 
       Toast.makeText(this,"First",Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       Toast.makeText(this,"Second",Toast.LENGTH_LONG).show(); 
      } 
    } 
} 

В моем примере у меня есть только 2 фрагмента, поэтому я жестко закодировал 0 и сделал if if else. В вашем случае я бы использовал переключатель в коммутаторе. Кроме того, хороший способ организовать все фрагменты бы с private SparseArray<WeakReference<Fragment>> fragmentMap = new SparseArray<WeakReference<Fragment>>();

вы бы включать в себя следующее:

@Override 
public void onAttachFragment(Fragment fragment) { 
    Bundle bundle = fragment.getArguments(); 
    if(bundle!=null && bundle.containsKey(KEY_FRAGMENT_POSITION)){ 
     int position = bundle.getInt(KEY_FRAGMENT_POSITION); 
     fragmentMap.put(position, new WeakReference<Fragment>(fragment)); 
    } 
    super.onAttachFragment(fragment); 
} 

public Fragment getFragment(int type){ 
    WeakReference<Fragment> weakFrag = fragmentMap.get(type); 
    Fragment frag = null; 
    if (weakFrag != null) 
     frag = weakFrag.get(); 
    return frag; 
} 
0

Иногда, когда событие активность теряется в цепи из-за способа, что XML или события структурированы ниже - лучшая структура для обеспечения того, чтобы события шли в нужные места.

public class MainActivity extends AppCompatActivity implements View.OnClickListener 
{ 
    @Override 
     public void onClick(View v) { 
      Log.v(LOG_HEADER,"onClick");  
     } 
} 

public class SearchFragment extends Fragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.fragment_search, container, false); 
     ll.setOnClickListener((MainActivity)getActivity()); 
     return ll; 
    } 
} 
Смежные вопросы