我的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);
}
});
}
答案 0 :(得分:0)
最简单,最简单的解决方案是使用EventBus。
适用于Android的两个最佳EventBus库是EventBus和Otto。我用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;
}
}