解釋下為什么會(huì)刷新失敺褂凇:原因是Fragment在adapter中會(huì)形成緩存翘簇,在每次創(chuàng)建前都會(huì)去對(duì)比一下此Fragment是否存在撬码,這就是造成刷新不是我們預(yù)想的情況出現(xiàn)
步驟如下:
1、新建類(lèi)并繼承Fragment版保,接受數(shù)據(jù)完善布局
2呜笑、創(chuàng)建類(lèi)并繼承 FragmentStatePagerAdapter 夫否,重寫(xiě)其內(nèi)部方法 ,并重寫(xiě)getItemPosition()將返回值設(shè)置為PagerAdapter.POSITION_NONE(此處解決刷新問(wèn)題)
3叫胁、程序中實(shí)現(xiàn)數(shù)據(jù)源凰慈、viewpager及其adapter配置即可
代碼如下:
1、新建類(lèi)并繼承Fragment驼鹅,接受數(shù)據(jù)完善布局
public class MyFragment extends Fragment {
public static Fragment newInstance(String content) {
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("content", content);
fragment.setArguments(bundle);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
String content = getArguments().getString("content");
View view = inflater.inflate(R.layout.fragment_base, container, false);
TextView textView = (TextView) view.findViewById(R.id.tvContent);
textView.setText(content);
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="20sp"
android:textColor="@color/colorAccent"/>
</RelativeLayout>
2微谓、創(chuàng)建類(lèi)并繼承 FragmentStatePagerAdapter ,重寫(xiě)其內(nèi)部方法
3输钩、程序中實(shí)現(xiàn)數(shù)據(jù)源豺型、viewpager及其adapter配置即可
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private List<String> contents = new ArrayList<>();
private MyFragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contents.add("one");
contents.add("two");
contents.add("three");
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
Button add = (Button) findViewById(R.id.btnAdd);
Button delete = (Button) findViewById(R.id.btnDelete);
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
add.setOnClickListener(this);
delete.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAdd:
contents.add("add");
adapter.notifyDataSetChanged();
break;
case R.id.btnDelete:
if (contents.size() > 0) {
contents.remove(contents.size() - 1);
adapter.notifyDataSetChanged();
}
break;
default:
break;
}
}
class MyFragmentPagerAdapter extends FragmentStatePagerAdapter{
private MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(contents.get(position));
}
@Override
public int getCount() {
return contents.size();
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
}
}
Kotlin代碼如下
class MyFragment : Fragment() {
fun newInstance(text:String):MyFragment{
val fragment = MyFragment()
val bundle = Bundle()
bundle.putString("content", text)
fragment.arguments = bundle
return fragment
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
val content = arguments.getString("content")
val view = inflater!!.inflate(R.layout.fragment_base, container, false)
val tvContent: TextView = view.tvContent
tvContent.text = content
return view
}
}
class MainActivity : AppCompatActivity() {
val list = mutableListOf<String>("one", "two", "three")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val adapter = MyFragmentPagerAdapter(supportFragmentManager, list)
viewPager.adapter = adapter
add.setOnClickListener {
list.add("add")
adapter.notifyDataSetChanged()
}
delete.setOnClickListener {
if (list.size > 0) {
list.removeAt(list.size-1)
adapter.notifyDataSetChanged()
}
}
}
class MyFragmentPagerAdapter(fm:FragmentManager,val list: List<String>) : FragmentStatePagerAdapter(fm){
/**
* Return the Fragment associated with a specified position.
*/
override fun getItem(position: Int): Fragment {
return MyFragment().newInstance(list[position])
}
/**
* Return the number of views available.
*/
override fun getCount(): Int {
return list.size
}
/**
* 必須重寫(xiě)此方法才能完全刷新
*/
override fun getItemPosition(`object`: Any?): Int {
return PagerAdapter.POSITION_NONE
}
}
}
還有一種處理情況繼承的是 FragmentPagerAdapter時(shí):
在Adapter中添加一個(gè)方法,手動(dòng)移除存在的Fragment
private void setFragments(List<OverlapFragment> fragments) {
FragmentManager fm = getFragmentManager();
if (mFragments != null) {
FragmentTransaction ft = fm.beginTransaction();
for (Fragment f : fragments) {
ft.remove(f);
}
ft.commit();
ft = null;
fm.executePendingTransactions();
}
mFragments = fragments;
notifyDataSetChanged();
}
贈(zèng)人玫瑰买乃,手有余香姻氨。您的支持是我創(chuàng)作最大的動(dòng)力!