设置单击“浮动操作”按钮

时间:2015-08-25 16:01:16

标签: android android-fragments android-activity android-recyclerview

我的activity_main中有一个FAB,我有5个ViewPager片段。片段有RecyclerView。如何从Main活动访问此RecyclerView并设置FAB的click方法,以便在单击FAB时,活动片段中的recyclerview滚动到顶部。我尝试在片段内使用mRecyclerView.scrollToPosition(0)。但它不起作用对于所有片段。我有这个内部片段。我应该将以下内容放在main activity.java中吗?如何访问RecyclerView并在单击片段中的FAB时将其滚动到位置0?

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

3 个答案:

答案 0 :(得分:0)

最简单,最简单的解决方案是使用EventBus。

适用于Android的两个最佳EventBus库是EventBusOtto。我用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()中发布了一个事件。总线将检查是否有任何方法订阅此事件并将调用该特定方法。您已经阅读了EventBus文档以正确理解这一点。

优点:代码更少,代码更易读。可以传递复杂对象(不需要对象序列化)。

缺点:您需要了解如何使用EventBus。

我希望它可以帮到你。

答案 1 :(得分: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 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;
}

答案 2 :(得分: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;
    }
}