Android ViewPager重排序与更新深度解析

1星 3 下载量 161 浏览量 更新于2024-09-03 收藏 58KB PDF 举报
在Android开发中,ViewPager是一个非常常用的组件,用于实现平滑的页面切换,常用于展示列表或者卡片式的视图。当需要对ViewPager中的内容进行重排序或更新时,开发者可能会遇到挑战,因为默认情况下,仅仅调用PagerAdapter的notifyDataSetChanged方法可能不足以触发视图的更新。本文将深入解析Android中ViewPager的重排序与更新机制。 首先,当我们在项目中遇到需要对栏目内容进行调整的情况,例如用户管理频道位置,我们通常会通过改变数据模型(如List或Array)来反映新的布局顺序。然后,为了通知ViewPager数据已经变化,我们会调用PagerAdapter的notifyDataSetChanged方法。然而,这个方法本身并不直接导致视图的更新,它只是告诉适配器数据集合发生了变化。 在ViewPager内部,当notifyDataSetChanged被调用时,会触发DataSetChanged方法。这个方法会检查以下几点: 1. 检查观察者是否已连接(即Adapter非空),确保适配器能够接收到数据变化的通知。 2. 确定新旧适配器的大小(adapterCount),用于后续比较。 3. 判断是否需要填充额外的offscreen pages,这是为了提供更好的用户体验,预加载可能显示的页面。 4. 遍历mItems列表,找到每个Item的位置变化。如果位置未变,则跳过。 5. 如果某个Item的位置变为POSITION_NONE,表示该Item不再存在,需要从列表中移除,并可能需要更新当前显示的item(mCurItem)。 6. 在处理过程中,如果发现有页面需要销毁或添加,会调用Adapter的相应方法(destroyItem和startUpdate)。 7. 如果发现整个视图需要刷新,标记needPopulate为true。 总结来说,重排序后,真正的视图更新是在DataSetChanged方法的逻辑执行过程中完成的,包括但不限于销毁、添加页面,以及根据新数据调整当前显示的页面。开发者需要理解并掌握这些步骤,以确保在进行数据结构修改后,视图能准确地反映出新的布局状态。这通常涉及到对PagerAdapter接口的深入理解和适配器的具体实现,因为适配器的startUpdate方法是关键,它负责调度页面的重建和绘制。通过这种方式,我们可以实现像网易新闻那样的频道管理功能,保证用户体验流畅。
2019-09-24 上传
仿zaker效果的拖拽排序。可以动态设置列数,动态增加或者减少item,当一页填满自动增加到下一页,当页数大于1,可以左右翻页。项目地址:https://github.com/zzhouj/Android-DraggableGridViewPager 效果图:  如何使用:xml中创建<com.coco.draggablegridviewpager.DraggableGridViewPager><com.coco.draggablegridviewpager.DraggableGridViewPager         android:id="@ id/draggable_grid_view_pager"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:paddingBottom="20dp"         android:paddingLeft="20dp"         android:paddingRight="60dp"         android:paddingTop="20dp" >     </com.coco.draggablegridviewpager.DraggableGridViewPager>2. 为DraggableGridViewPager设置AdaptermAdapter = new ArrayAdapter<String>(this, 0) {     @Override     public View getView(int position, View convertView, ViewGroup parent) {         final String text = getItem(position); if (convertView == null) {     convertView = (TextView) getLayoutInflater().inflate(R.layout.draggable_grid_item, null); } ((TextView) convertView).setText(text); return convertView;     } }; mDraggableGridViewPager.setAdapter(mAdapter);3. 为DraggableGridViewPager设置监听器mDraggableGridViewPager.setOnPageChangeListener(new OnPageChangeListener() {//页面滚动监听 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//页面正在滚动时触发     //System.out.println("onPageScrolled 滚动了"); } @Override public void onPageSelected(int position) {//由于页面滚动,导致页面发生变化     //System.out.println("onPageScrolled 页面变化了 position="   position); } @Override public void onPageScrollStateChanged(int state) {//滚动时,监听滚动状态的变化     //System.out.println("onPageScrolled 滚动状态state="   state); } }); mDraggableGridViewPager.setOnItemClickListener(new OnItemClickListener() {//单击某一item时触发 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { showToast(((TextView) view).getText().toString()); } }); mDraggableGridViewPager.setOnItemLongClickListener(new OnItemLongClickListener() {//长按某一item触发 @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { showToast(((TextView) view).getText().toString()   " long clicked!!!"); return true; } }); mDraggableGridViewPager.setOnRearrangeListener(new OnRearrangeListener() {//拖动导致重新排序触发 @Override public void onRearrange(int oldIndex, int newIndex) { System.out.println("onPageScrolled OnRearrangeListener.onRearrange from="   oldIndex   ", to="   newIndex); String item = mAdapter.getItem(oldIndex); mAdapter.setNotifyOnChange(false); mAdapter.remove(item); mAdapter.insert(item, newIndex); mAdapter.notifyDataSetChanged(); } });