【问题标题】:Android: how can I create a ListView header outside of a list?Android:如何在列表之外创建 ListView 标头?
【发布时间】:2014-03-13 08:18:52
【问题描述】:

这是我的情况:

我希望列表将“标题”和选项卡部分视为列表标题,这样“标题”和选项卡就不会固定在屏幕上,它们都会与列表一起滚动。

我不能简单地通过mListView.addHeaderView() 将标题和选项卡添加为列表的 headerView,因为按下时选项卡将换出“列表”内容区域。其他选项卡的内容区域将包含其他列表,标题和选项卡也应随着新列表滚动。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • @dcow 基本上没什么,我正在考虑考虑
  • @James 你实现了那个设计吗?

标签: android android-layout android-listview android-tabs


【解决方案1】:

您可以覆盖 getViewType 方法,以精确确定您的 listview 有多少行。

看看here

【讨论】:

    【解决方案2】:

    将整个事物视为 ListView。您可以根据需要多次调用addHeaderView(),这样您就可以拥有两个标题视图(“标题”和“Tab | Tab | Tab”)。

    回复:

    我不能简单地通过 mListView.addHeaderView() 将标题和选项卡添加为列表的 headerView,因为选项卡在按下时会换出“列表”内容区域。

    是的,你可以。

    更新对列表数据的引用并调用mAdapter.notifyDataSetChanged()

    【讨论】:

      【解决方案3】:

      我和你有同样的需要,我发现这个项目完全实现了你的需要,加上一些更吸引眼球的技巧。

      https://github.com/kmshack/Android-ParallaxHeaderViewPager

      神奇的是将片段列表中发生的滚动绑定到活动中定义的标题。在选项卡的选择和列表中的滚动位置之间也存在基本绑定,以便在滑动时调整列表。 此代码基于该 github 存储库,但更简单(因此不太健壮),阅读它只是为了了解发生了什么,然后阅读存储库中的源代码。

      public class MyFragment extends Fragment implements OnScrollListener {
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            ((MyParentActivity) getActivity()).onScrollFragment(view, mTabPosition);
        }
      
        public void adjustScroll(int scrollHeight) {
          if (scrollHeight == 0 && fragmentListView.getFirstVisiblePosition() >= 1) {
              return;
          }
      
          officesListView.setSelectionFromTop(1, scrollHeight);
        }
      }
      

      那么在activity中你只需要这两个具体的方法

      public class MyParentActivity implements ViewPager.OnPageChangeListener{
        @Override
        public void onPageSelected(int position)
                  myFragmentPagerAdapter.getFragmentAt(position)
                                        .adjustScroll((int) (mHeader.getHeight() + ViewHelper.getTranslationY(mHeader)));      
        }
      
        public void onScrollFragment(AbsListView view, int tabPosition) {
      
              if (mViewPager.getCurrentItem() == tabPosition) {
                  int scrollY = getScrollY(view);
                  ViewHelper.setTranslationY(mHeader, Math.max(-scrollY, mMinHeaderTranslation));
              }
        }
      }
      

      感谢 NineOldAndroids 的 ViewHelper,这段代码可以达到 API 8 的要求

      【讨论】:

        猜你喜欢
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多