日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TabLayout+ViewPager更新fragment的ui数据

發布時間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TabLayout+ViewPager更新fragment的ui数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看下這樣一段代碼

private String titles[] = new String[]{"今天", "這周", "這月", "今年"};boolean[] fragmentsUpdateFlag = { false, false, false, false };StarFragment todatFragmet=new StarFragment(titles[0],starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);StarFragment weekFragmet=new StarFragment(titles[1],starDetailEntity, AppConstants.TYPE_CONTENT_WEEK);StarFragment monthFragmet=new StarFragment(titles[2],starDetailEntity, AppConstants.TYPE_CONTENT_MONTH);StarFragment yearFragmet=new StarFragment(titles[3],starDetailEntity, AppConstants.TYPE_CONTENT_YEAR);BaseFragment fragments[]={todatFragmet,weekFragmet,monthFragmet,yearFragmet};

我們定義了一些要使用的fragment,并且使用viewPager展示出來了。由于viewPager自身的緩存機制和預加載機制導致這樣的一個問題。

當我們請求接口請求一些數據回來要以后,想要更新某個fragment,但是界面數據總是更新失敗。

那么這樣的問題據我研究之后要這樣來解決:

原理就是把就舊的fragment去除掉,換成新的fragment就OK了。

具體實現方法為重寫adapter的 instantiateItem()方法。

@Overridepublic Object instantiateItem(ViewGroup container, int position) {//得到緩存的fragmentFragment fragment= (Fragment) super.instantiateItem(container, position);//獲取到tagString fragmentTag=fragment.getTag();if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]){//如果這個fragment需要更新android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();//移除舊的fragment ft.remove(fragment);//換成新的fragmentfragment = fragments[position % fragments.length];//添加新fragment時必須用前面獲得的tag,這點很重要ft.add(container.getId(), fragment, fragmentTag ==null? fragment.getClass().getName()+position : fragmentTag);ft.attach(fragment);ft.commit();//復位更新標志fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;}else{fragment = fragments[position];}return fragment;}

?

下面貼出這個activity的全部的代碼以供自己查閱:

import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.ViewGroup; import com.bingo.cqtimelottery.R; import com.bingo.cqtimelottery.api.ApiService; import com.bingo.cqtimelottery.api.RetrofitManager; import com.bingo.cqtimelottery.base.BaseActivity; import com.bingo.cqtimelottery.base.BaseFragment; import com.bingo.cqtimelottery.constants.ApiConstant; import com.bingo.cqtimelottery.constants.AppConstants; import com.bingo.cqtimelottery.starfortune.entity.StarDetailEntity; import com.bingo.cqtimelottery.util.DateUtil; import java.util.HashMap; import java.util.Map; import butterknife.BindView; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response;public class StarFortuneDetailActivity extends BaseActivity {@BindView(R.id.tabLayout)TabLayout mTabLayout;@BindView(R.id.viewPager)ViewPager mViewPager;private String titles[] = new String[]{"今天", "這周", "這月", "今年"};boolean[] fragmentsUpdateFlag = {false, false, false, false};StarFragment todatFragmet = new StarFragment(titles[0], starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);StarFragment weekFragmet = new StarFragment(titles[1], starDetailEntity, AppConstants.TYPE_CONTENT_WEEK);StarFragment monthFragmet = new StarFragment(titles[2], starDetailEntity, AppConstants.TYPE_CONTENT_MONTH);StarFragment yearFragmet = new StarFragment(titles[3], starDetailEntity, AppConstants.TYPE_CONTENT_YEAR);BaseFragment fragments[] = {todatFragmet, weekFragmet, monthFragmet, yearFragmet};private String starName;private String starId;public static StarDetailEntity starDetailEntity;StarPagerFragmentAdapter mainAdapter;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.arg1 == 100) {fragments[0] = new StarFragment(titles[0], starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);fragmentsUpdateFlag[0] = true;mainAdapter.notifyDataSetChanged();}}};public static StarDetailEntity getStarDetailEntity() {return starDetailEntity;}public static void setStarDetailEntity(StarDetailEntity starDetailEntity) {StarFortuneDetailActivity.starDetailEntity = starDetailEntity;}@Overridepublic int getLayoutRes() {return R.layout.activity_star_fortune_detail;}@Overridepublic void onCreateActivity(@Nullable Bundle savedInstanceState) {Bundle bundle = getIntent().getExtras();starName = bundle.getString("starName");starId = bundle.getString("starId");initToolbar(starName);initAdapter();getStarDetailInfo(starId);}private void initAdapter() {mainAdapter = new StarPagerFragmentAdapter(getSupportFragmentManager(), fragments, titles);mViewPager.setAdapter(mainAdapter);mTabLayout.setupWithViewPager(mViewPager);mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {// arg0 :當前頁面,及你點擊滑動的頁面;arg1:當前頁面偏移的百分比;arg2:當前頁面偏移的像素位置 }@Overridepublic void onPageSelected(int position) {// arg0是當前選中的頁面的Positionswitch (position) {case 0: //今天break;}}@Overridepublic void onPageScrollStateChanged(int state) {//arg0 ==1的時表示正在滑動,arg0==2的時表示滑動完畢了,arg0==0的時表示什么都沒做。 }});}/*** 請求網絡數據* @param lotteryid*/private void getStarDetailInfo(String lotteryid) {showLoading();Map<String, String> map = new HashMap<>();map.put("astroid", lotteryid);map.put("date", DateUtil.formateDateString().substring(0, 10));map.put("appkey", ApiConstant.API_KEY);RetrofitManager.getInstance().createReq(ApiService.class).loadStarDetailInfo(map).enqueue(new Callback<StarDetailEntity>() {@Overridepublic void onResponse(Call<StarDetailEntity> call, Response<StarDetailEntity> response) {dismissLoading();if (response.body() != null)starDetailEntity = response.body();//使用Handler發送數據跟新UIMessage message = new Message();message.arg1 = 100;mHandler.sendMessage(message);}@Overridepublic void onFailure(Call<StarDetailEntity> call, Throwable t) {}});}private void replaceTodayFragment() {}public class StarPagerFragmentAdapter<T extends Fragment> extends FragmentPagerAdapter {private BaseFragment[] mList;private String[] mTitles;private StarDetailEntity starDetailEntity;private FragmentManager fm;public StarDetailEntity getStarDetailEntity() {return starDetailEntity;}public void setStarDetailEntity(StarDetailEntity starDetailEntity) {this.starDetailEntity = starDetailEntity;}public StarPagerFragmentAdapter(FragmentManager fm, BaseFragment[] list, String[] titles) {super(fm);this.mList = list;this.mTitles = titles;this.fm = fm;}@Overridepublic Fragment getItem(int position) {Fragment fragment = fragments[position % fragments.length];Log.i("zzccbb", "getItem:position=" + position + ",fragment:"+ fragment.getClass().getName() + ",fragment.tag="+ fragment.getTag());return fragments[position % fragments.length];}@Overridepublic int getItemPosition(Object object) {return POSITION_NONE;}@Overridepublic int getCount() {return mList.length;}@Overridepublic CharSequence getPageTitle(int position) {return mTitles == null ? super.getPageTitle(position) : mTitles[position];}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//得到緩存的fragmentFragment fragment = (Fragment) super.instantiateItem(container, position);//獲取到tagString fragmentTag = fragment.getTag();if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {//如果這個fragment需要更新android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();//移除舊的fragment ft.remove(fragment);//換成新的fragmentfragment = fragments[position % fragments.length];//添加新fragment時必須用前面獲得的tag,這點很重要ft.add(container.getId(), fragment, fragmentTag == null ? fragment.getClass().getName() + position : fragmentTag);ft.attach(fragment);ft.commit();//復位更新標志fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;}else{
            fragment = fragments[position];

          }         return fragment;
    }
  }
}

?

轉載于:https://www.cnblogs.com/zhang-cb/p/7581187.html

總結

以上是生活随笔為你收集整理的TabLayout+ViewPager更新fragment的ui数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。