Android ListView - 第n个元素后的分隔符

时间:2014-05-03 23:53:53

标签: java android listview android-cursor divider

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

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(尽管所有数据都存在于列表中,因此游标必须迭代到最后)。

为什么它的行为像这样?什么是我不理解/做错了?

1 个答案:

答案 0 :(得分:1)

问题似乎是由于ListView回收。 ListView会尝试为项目重复使用相同的视图。因此,在您的情况下,newView将被调用前6个可见项目,当您滚动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;
    }
}