当前位置: 首页 > news >正文

cms 做网站模板seo l

cms 做网站模板,seo l,那样的网站,有多少人自己做电影网站直接使用类CommonPageAdapter ,或者重写两个方法getItemPosition(Object)和getItemId() ------------------------------------------------------ 1. 前言 在此之前,我总是不得其解,同样都提供了**notifyDataSetChanged()**方法&#xff0…

直接使用类CommonPageAdapter ,或者重写两个方法getItemPosition(Object)和getItemId()

------------------------------------------------------

1. 前言


      在此之前,我总是不得其解,同样都提供了**notifyDataSetChanged()**方法,为什么 ListView 的adapter使用刷新的方法非常好用,而 ViewPager 的adapter使用刷新方法总是有这样那样的问题?百度了一下,查阅了很多篇文章,难以找到满意的解决方案。尤其涉及到ViewPager动态添加删除及刷新页面时,刷新成了难以克服的痛点。有的说ViewPager不能刷新,有的说需要重写这个方法,有的说需要重写那个方法。

      为了搞清楚ViewPager的刷新问题,我参考多篇博客,又研读了源码,费了不少脑力。最终,这个问题还是被我搞定了。

 

2. PagerAdapter 的刷新


2.1 源码解析
      要想真正的理解PagerAdapter的刷新,就一定要从源码找突破口。下面是PagerAdapter的类注释。

/*** ......** <p>PagerAdapter supports data set changes. Data set changes must occur on the* main thread and must end with a call to {@link #notifyDataSetChanged()} similar* to AdapterView adapters derived from {@link android.widget.BaseAdapter}. A data* set change may involve pages being added, removed, or changing position. The* ViewPager will keep the current page active provided the adapter implements* the method {@link #getItemPosition(Object)}.</p>*/
public abstract class PagerAdapter {//......public static final int POSITION_UNCHANGED = -1;public static final int POSITION_NONE = -2;//......
}


看PagerAdapter的最后一段,大概翻译一下,意思是:
      PagerAdapter支持数据集改变。数据集的改变必须发生在主线程,并且以调用notifyDataSetChanged()方法结束,类似于AdapterView的适配器(继承自android.widget.BaseAdapter的)。数据集改变包括页面被添加、删除或位置改变。如果适配器实现了方法getItemPosition(Object),ViewPager将保持当前页面处于活动状态。

      这段话有一个非常明确的信息:PagerAdapter可以通过调用notifyDataSetChanged()方法实现数据集的刷新。这就打破了有些人认为的ViewPager无法通过notifyDataSetChanged()刷新的认知。而且,这段话还告诉我们,我们可能需要实现方法getItemPosition(Object)。下面我面找到该方法的源码看一下:

 

/*** Called when the host view is attempting to determine if an item's position* has changed. Returns {@link #POSITION_UNCHANGED} if the position of the given* item has not changed or {@link #POSITION_NONE} if the item is no longer present* in the adapter.** <p>The default implementation assumes that items will never* change position and always returns {@link #POSITION_UNCHANGED}.** @param object Object representing an item, previously returned by a call to*               {@link #instantiateItem(View, int)}.* @return object's new position index from [0, {@link #getCount()}),*         {@link #POSITION_UNCHANGED} if the object's position has not changed,*         or {@link #POSITION_NONE} if the item is no longer present.*/public int getItemPosition(Object object) {return POSITION_UNCHANGED;}


需要看一下方法注释,大概意思是:
      当主控件(个人认为是ViewPager)尝试确定item的位置是否已经改变时调用。如果给定的item位置没有改变,返回POSITION_UNCHANGED;如果item已经在适配器中不存在了,返回POSITION_NONE。

      默认实现假设所有item永远不会改变位置并且总是返回POSITION_UNCHANGED(未改变)。

      参数:object     代表一个item的对象(个人认为:View或Fragment),最初由instantiateItem(View, int) 方法返回。
      返回      如果位置发生改变,返回对象的新位置,是0到getCount()的索引(不包括getCount());如果位置没有改变,返回 POSITION_UNCHANGED ;如果item不存在了,返回 POSITION_NONE 。

2.2 例子
可参考 ViewPager打造真正意义的无限轮播

3. FragmentPagerAdapter的刷新


3.1 源码解析
由于FragmentPagerAdapter继承了PagerAdapter,那么是不是FragmentPagerAdapter只要重写了方法getItemPosition()就可以实现自己的刷新了?事实并非如此,即使我们重写了方法getItemPosition(),用FragmentPagerAdapter刷新界面时依然会有问题。查找博客,翻看源码,发现我们还需要重写一个FragmentPagerAdapter的方法getItemId()。下面是FragmentPagerAdapter的getItemId()方法的源码:

   

 /*** Return a unique identifier for the item at the given position.** <p>The default implementation returns the given position.* Subclasses should override this method if the positions of items can change.</p>** @param position Position within this adapter* @return Unique identifier for the item at position*/public long getItemId(int position) {return position;}



从方法描述我们可以看出:这个方法为给定position的item,返回一个唯一的id(identifier)。默认情况下,返回这个item的position。如果item的position可能发生改变,子类应该重写这个方法。

说的很清楚,如果ViewPager的item的position可能发生改变,子类应该重写这个方法。item的position发生改变的情况,恐怕只有添加,修改(互换位置),删除了。总之只要position可能发生改变,我们就需要重写这个方法。

所以,使用FragmentPagerAdapter除了需要重写其父类PagerAdapter的getItemPosition()方法,还需要重写getItemId()方法。

为什么FragmentPagerAdapter需要重写getItemId()方法呢?看一下FragmentPagerAdapter初始化item的方法:

@SuppressWarnings("ReferenceEquality")
@Override
public Object instantiateItem(ViewGroup container, int position) {if (mCurTransaction == null) {mCurTransaction = mFragmentManager.beginTransaction();}final long itemId = getItemId(position);// Do we already have this fragment?String name = makeFragmentName(container.getId(), itemId);Fragment fragment = mFragmentManager.findFragmentByTag(name);if (fragment != null) {if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);mCurTransaction.attach(fragment);} else {fragment = getItem(position);if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);mCurTransaction.add(container.getId(), fragment,makeFragmentName(container.getId(), itemId));}if (fragment != mCurrentPrimaryItem) {fragment.setMenuVisibility(false);fragment.setUserVisibleHint(false);}return fragment;
}@Override
public void destroyItem(ViewGroup container, int position, Object object) {if (mCurTransaction == null) {mCurTransaction = mFragmentManager.beginTransaction();}if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object+ " v=" + ((Fragment)object).getView());mCurTransaction.detach((Fragment)object);
}


此方法中使用到了getItemId()方法,用于方法makeFragmentName()生成Fragment的tag。FragmentMaganger会通过这个tag查找和添加Fragment。

// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);

 

mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));


我们都知道,ViewPager有预加载前一页和后一页的功能,预加载的页面(Fragment)会添加到FragmentPagerAdapter的FragmentManager中,其中的Fragment应当与它的tag一一对应,ViewPager切换到position页,就会把对应的Fragment attach到mCurTransaction中。在destroyItem()方法中会移除超出界限的Fragment。

当所有item的position不发生改变时,通过getItemId()可以获得对应的Fragment
当我们的position发生改变时,同一个position,上面代码中查找的Fragment将不再是原来的Fragment (tag改变了),刷新界面就会出现错乱或报错。

所以,只要我们需要保证,也就是一个position对应一个id,通过position能获得原来的Fragment。

3.2 参考代码

import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;import com.zhxg.androidtv.fragment.yqfbindex.CommonPageFragment;import java.util.ArrayList;
import java.util.List;/*** 用于动态改变页面(新增页面和删除页面)的FragmentPagerAdapter* Created by wangzhengyang on 2017-12-27 0027.*/public class CommonPageAdapter extends FragmentPagerAdapter {private List<Fragment> mFragmentList = new ArrayList<>();private List<Integer> mItemIdList = new ArrayList<>();private int id = 0;private FragmentManager mFm;public CommonPageAdapter(FragmentManager fm, @NonNull List<Fragment> fragmentList) {super(fm);this.mFm = fm;for (Fragment fragment : fragmentList) {this.mFragmentList.add(fragment);mItemIdList.add(id++);}}public CommonPageAdapter(FragmentManager fm) {super(fm);}public List<Fragment> getFragmentList() {return mFragmentList;}public void addPage(int index, Fragment fragment){mFragmentList.add(index, fragment);mItemIdList.add(index, id++);notifyDataSetChanged();}public void addPage(Fragment fragment){mFragmentList.add(fragment);mItemIdList.add(id++);notifyDataSetChanged();}public void delPage(int index) {mFragmentList.remove(index);mItemIdList.remove(index);notifyDataSetChanged();}public void delPage() {mFragmentList.remove();mItemIdList.remove();notifyDataSetChanged();}public void updatePage(List<Fragment> fragmentList) {mFragmentList.clear();mItemIdList.clear();for(int i = 0; i < fragmentList.size(); i++){mFragmentList.add(fragmentList.get(i));mItemIdList.add(id++);//注意这里是id++,不是i++。}notifyDataSetChanged();}@Overridepublic Fragment getItem(int position) {return mFragmentList.get(position);}@Overridepublic int getCount() {return mFragmentList.size();}/*** 返回值有三种,* POSITION_UNCHANGED  默认值,位置没有改变* POSITION_NONE       item已经不存在* position            item新的位置* 当position发生改变时这个方法应该返回改变后的位置,以便页面刷新。*/@Overridepublic int getItemPosition(Object object) {if (object instanceof Fragment) {if (mFragmentList.contains(object)) {return mFragmentList.indexOf(object);} else {return POSITION_NONE;}}return super.getItemPosition(object);}@Overridepublic long getItemId(int position) {return mItemIdList.get(position);}
}

--------------------- 
作者:wandryoung 
来源:CSDN 
原文:https://blog.csdn.net/wangxiaocheng16/article/details/79028954 
版权声明:本文为博主原创文章,转载请附上博文链接!

http://www.lbrq.cn/news/2550331.html

相关文章:

  • 安徽网站开发培训价格淘宝如何刷关键词增加权重
  • 网站导航为什么用ul列表做关键词排名点击软件
  • c做网站教程baidu百度首页官网
  • 做视频网站的挣钱吗萧山seo
  • 自适应 WordPress 主题seo快速排名软件平台
  • 网站没有流量个人引流推广怎么做
  • wordpress生成静态 mip网站做优化好还是推广好
  • 双鸭山网站建设企业郑州今天刚刚发生的新闻
  • 网站建设流程步骤上海网站快速优化排名
  • wordpress在百度排名靠前seo经验是什么
  • 北京企业网站搭建油烟机seo关键词
  • 天津市建设 中标公示网站东莞疫情最新通知
  • 网站建设设计技术方案模板下载如何推销产品给客户
  • 织梦美女图片网站模板站长工具永久
  • 制作企业网站页面多少钱seo是指
  • 提供购物网站建设新闻发布最新新闻
  • 做网站就是做服务成都百度推广电话号码是多少
  • 奢侈品网站设计沈阳seo网站关键词优化
  • 钦州网站建设广东企业网站seo哪里好
  • 关于做公司网站网络推广项目外包公司
  • 网站被恶意关键字访问重庆seo网络推广关键词
  • 股票专业网站seo电商运营是什么意思
  • wordpress主题 破解主题下载地址seo查询工具网站
  • 东莞阳光网appseo搜索优化公司排名
  • .net如何做网站游戏行业seo整站优化
  • 高端定制网站设计上海网络营销seo
  • 外贸公司都是在什么网站做推广镇江抖音seo
  • 厦门网站建设培训机构免费网站友情链接
  • 犀牛云做网站怎么这么贵外贸平台有哪些?
  • php网站开发 实战教程aso优化吧
  • OSPF综合实验报告册
  • 理解HTTP协议
  • C#线程同步(二)锁
  • qt中的手势
  • 【刷题】东方博宜oj 1412-快速幂(零基础,简单易懂)
  • USRP捕获手机/路由器数据传输信号波形(下)