刷新ViewPager片段无法正常工作

时间:2016-06-23 16:34:42

标签: android listview android-fragments android-asynctask

我有三个标签,其中包含三个不同的片段,每个片段都有listview,它看起来像这样:

enter image description here

当我按下白色按钮时,列表项目被添加到tab2,如果我按下紫色按钮,则列表项目被添加到tab3。 Tab3被刷新,因为viewPager具有默认的屏幕外限制1,所以当我导航到tab3时它被创建并且在那个时候它有新的listitem,但是当应用程序启动时已经创建了tab2所以我需要通过某种方法刷新它。所以我在tab2片段中创建了updateView()方法,并且我在OnPageChangeListener()上调用该方法更新了视图,但是每次导航到tab2时都会调用它,它会导致滞后。我想要做的就是删除该列表项并将其添加到tab2并将其删除并将其添加到tab2但是当我滑动到tab2时我无法看到它,只是在关闭app后它出现或者当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上尝试过,但它没有解决这个想法我能尝试什么?

6 个答案:

答案 0 :(得分:1)

我完全不了解你想要达到的目标,但我认为你正在寻找这个:

How to determine when Fragment becomes visible in ViewPager

答案 1 :(得分:0)

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

我创建了一个SharedPreferences变量。在onClick中添加Fragment中的列表项,我将SharedPreferences变量更新为&#34; refresh&#34;,并添加了一个Intent以返回MainActivity。在onCreate的MainActivity中,我检查SharedPreferences变量的值。如果它等于&#34;刷新&#34;,我将变量更新为&#34;&#34;,并添加了一个Intent以返回原始片段。

答案 2 :(得分:0)

您可以获取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();
}

答案 3 :(得分:0)

对于这个问题之王'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应该不知道彼此的存在。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

@Override
public void setMenuVisibility(boolean menuVisible) {
    super.setMenuVisibility(menuVisible);
    if(menuVisible){

        //load listview
    }
}