繁体   English   中英

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

[英]Android ListView - divider after nth element

我需要在由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(尽管列表中存在所有数据,所以必须将游标迭代到最后)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM