【问题标题】:Android ListView - divider after nth elementAndroid ListView - 第n个元素后的分隔符
【发布时间】:2014-06-20 11:46:03
【问题描述】:

我需要在从 mysqli 游标生成的列表视图中的第 n 个元素之后放置一个分隔符。我创建了尝试这样做的自定义适配器,如下所示:

MyAdapter extends CursorAdapter {

     ...
     blablabla
     yadayadayada
     ...

     @Override
     public View newView(Context context, Cursor cursor, ViewGroup parent) {

         final View view;
         int pos = cursor.getPosition();
         int beforeLast = GameData.totalPlayers-1;
         if (pos == beforeLast) {
             view = mInflater.inflate(R.layout.player_details_divider, parent, false);
         } else {
             view = mInflater.inflate(R.layout.player_details, parent, false);
         }
         return view;
     }
}

所以你可以看到它应该为位置totalPlayers-1 上的元素膨胀不同的视图。当数字足够小时效果很好:1到6。但是当它更大时它就停止工作了。

我尝试调试这个东西,我注意到它呈现了 6 个项目 - 这是屏幕上适合多少列表元素 - 并通过循环 6 次递增 pos 到 5。然后它停止。当我开始滚动列表时,它再次运行循环,将 pos 增加到 6,然后停止。无论有多少元素,它永远不会将 pos 增加到 7(尽管所有数据都存在于列表中,所以 cursor 必须迭代到末尾)。

任何想法为什么它会这样?我不理解/做错了什么?

【问题讨论】:

    标签: java android listview android-cursor divider


    【解决方案1】:

    问题似乎是由于ListView 回收。 ListView 将尝试为项目重用相同的视图。因此,在您的情况下,前 6 个可见项目调用 newView,当您滚动 ListView 时,会为列表中的下 6 个项目调整相同的 6 个项目视图的大小。

    您需要更新 ListView,您有 2 个不同的项目视图,以便它知道您的最后一个项目视图与其他项目不同

    您需要 override getViewTypeCount 并返回您有 2 个不同的视图

    @Override
    public int getViewTypeCount() {
        return 2; // return the view type
    }
    

    另外,override getItemViewType 并告知 ListView last position view 是不同的。

    Override
    public int getItemViewType(int position){
        int beforeLast = GameData.totalPlayers-1;
        // return a unique number
        if(beforeLast == position) {
            return 1; // some unique id
        }else {
            return 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 2011-04-28
      • 2021-12-17
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多