【问题标题】:Refresh ViewPager fragment doesn't work properly刷新 ViewPager 片段无法正常工作
【发布时间】:2016-06-23 16:34:42
【问题描述】:

我有三个选项卡,其中包含三个不同的片段,每个片段都有列表视图,它看起来像这样:

当我按下白色按钮时,列表项被添加到 tab2,如果我按下紫色按钮,列表项被添加到 tab3。 Tab3 已刷新,因为 viewPager 具有默认的屏幕外限制 1,因此当我导航到 tab3 时,它被创建并且当时它具有新的 listitem,但 tab2 在应用程序启动时已经创建,所以我需要通过某种方法刷新它。所以我在 tab2 片段中创建了 updateView() 方法,我在 OnPageChangeListener() 上调用该方法它更新视图,但是每次我导航到 tab2 时都会调用它并导致滞后。我想要做的就是删除该列表项目并将其添加到 tab2 并被删除并添加到 tab2 但是当我滑动到 tab2 时我看不到它,就在关闭应用程序后它出现或当 tab2 片段调用 onResume、onCreate...

在后台加载列表项的异步方法:

public class AchievedDreamFragment extends Fragment {

ListView achievedListView;
Activity activity;
ArrayList<AchievedCloud> achievedClouds;


AchievedListAdapter achievedListAdapter;
AchievedActionHandler achievedActionHandler;

private GetAvedTask atask;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = getActivity();
achievedActionHandler = new AchievedActionHandler(activity);

}


public class GetAvedTask extends AsyncTask<Void, Void, <AchievedCloud>> {

private final WeakReference<Activity> activityWeakRef;


public GetAvedTask(Activity context) {
    this.activityWeakRef = new WeakReference<Activity>(context);
}

@Override
protected ArrayList<AchievedCloud> doInBackground(Void... arg0) {
    Log.e(TAG,"do in background");
    //achievedActionHandler = new AchievedActionHandler(activity);
    ArrayList<AchievedCloud> dreamList = achievedActionHandler.getaDreams();
    return dreamList;
}

@Override
protected void onPostExecute(ArrayList<AchievedCloud> adrmList) {
    Log.e(TAG,"on Post execute");
    if (activityWeakRef.get() != null
            && !activityWeakRef.get().isFinishing()) {
        achievedClouds = adrmList;
        if (adrmList != null) {
            if (adrmList.size() != 0) {
                achievedListAdapter = new AchievedListAdapter(activity,
                        adrmList);
                achievedListView.setAdapter(achievedListAdapter);
                achievedListAdapter.notifyDataSetChanged();
            }
        }

    }
}
}

UpdateView() 方法在 asyncTask 所在的同一片段中:

 public void updateView() {

    atask = new GetAvedTask(activity);
    atask.execute((Void) null);

 }

viewpager OnPageChangeListener():

@Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {

        if(position == 1){
            achievedDreamFragment.updateView();

        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

我也在适配器 getItemPosition POSITION_NONE 上进行了尝试,但它没有解决这个问题我可以尝试什么?

【问题讨论】:

    标签: android listview android-fragments android-asynctask


    【解决方案1】:

    我不完全了解您想要实现的目标,但我认为您正在寻找这个:

    How to determine when Fragment becomes visible in ViewPager

    【讨论】:

    • 当我在按下白色按钮后滑动到 tab2 时,我想在那里看到该项目
    【解决方案2】:

    我也有同样的问题。我不确定这是否是最干净的方法,但它对我有用。

    我创建了一个 SharedPreferences 变量。在onClick 添加Fragment 中的列表项时,我将SharedPreferences 变量更新为“刷新”,并且还添加了一个Intent 返回到MainActivity。在 onCreate 的 MainActivity 中,我检查 SharedPreferences 变量的值。如果等于“刷新”,我将变量更新为“”,并添加了返回原始片段的Intent。

    【讨论】:

      【解决方案3】:

      你可以得到tab2片段的实例。然后直接在该实例上调用您的 updateView() 方法:

      Object anObject = viewPager.getAdapter().instantiateItem(viewPager, 1);
      // 1 is the Tab2; viewPager is the ViewPager in main activity
      if (anObject instanceof Tab2) {  // Tab2 is your tab2's fragment
          Tab2 tab2 = (Tab2) anObject;
          tab2.updateView();
      }
      

      【讨论】:

        【解决方案4】:

        对于这个问题之王,'EventBus' 是完美的。

        首先添加依赖: compile 'org.greenrobot:eventbus:3.0.0' 在您的 build.gradle 文件中。更多信息请看这里:EventBus

        在 Tab2 中添加这些方法:

        `
        @Override
        public void onStart(){
            super.onStart();
            EventBus.getDefault().register(this);
        }
        
        @Override
        public void onStop(){
            EventBus.getDefault().unregister(this);
            super.onStop();
        }
        public void onEventItemAdded(EventAddItemTab2 event){
                loadItems(); // reload items from DB/Web using asynctask and set these items to the adapter
        
        }
        

        `

        在包中新建一个类,名字为models,这个类: public class EventAddItemTab2{ // empty here }

        然后在 Tab1 中点击白色按钮时调用:

        EventBus.getDefault().post(new EventAddItemTab2());

        更多信息:当你调用 EventBus 的.post 方法时,它会自动调用 Tab2 中的onEventItemAdded 方法。您也可以将此模式用于 Tab3。该解决方案非常适合您必须分离逻辑的大型应用程序。 Tab1、Tab2 和 Tab3 应该不知道彼此的存在。

        【讨论】:

          【解决方案5】:

          很抱歉,我不清楚您的要求,但据我了解,如果您想使用 POSITION_NONE 标志来实现,那么您可以为 viewpager 适配器调用 adapter.notifyDatasetChanged() 。然后它将刷新所有视图,如果您在其中一个被覆盖的方法中调用了您的方法,它将被更新。因此您可以在单击按钮时调用它。

          【讨论】:

            【解决方案6】:

            我需要做的就是在我的 tab2 片段上调用这个方法。每次片段可见时都会调用它!

            @Override
            public void setMenuVisibility(boolean menuVisible) {
                super.setMenuVisibility(menuVisible);
                if(menuVisible){
            
                    //load listview
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-01
              • 1970-01-01
              • 2015-10-13
              • 1970-01-01
              相关资源
              最近更新 更多