在ListView中实现排序

此处介绍的情境是:

(1)使用table布局ListView。

(2)ListView的数据源是List<T>。

(3)排序字段2个(帖子的回复次数和浏览次数),都是int类型。

基本思路:

ListView触发数据源排序,使用数据源(即List<T>)的Sort()方法,又一次绑定数据源到ListView。

实现步骤:

(1)可查知,List<T>的Sort()方法带有一个ICompare<T>泛型接口类型的形參。所以,首先构造继承该泛型接口的类型:

    /// <summary>
    /// 回复升序比較类
    /// </summary>
    public class PostReplyCountAscCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return x.ReplyCount.CompareTo(y.ReplyCount);
        }

        #endregion
    }
    /// <summary>
    /// 回复降序比較类
    /// </summary>
    public class PostReplyCountDescCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return y.ReplyCount.CompareTo(x.ReplyCount);
        }

        #endregion
    }

    /// <summary>
    /// 浏览升序比較类
    /// </summary>
    public class PostViewCountAscCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return x.ViewCount.CompareTo(y.ViewCount);
        }

        #endregion
    }
    /// <summary>
    /// 浏览降序比較类
    /// </summary>
    public class PostViewCountDescCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return y.ViewCount.CompareTo(x.ViewCount);
        }

        #endregion
    }

注意:上述的PostInfo模型类,读者能够杜撰,但要有ViewCount和ReplyCount属性(int类型)。

(2)因为有4个排序规则,相应上述(1)中的4个类。所以构造一个排序辅助类:SortHelper,代码例如以下:

    public class SortHelper
    {
        /// <summary>
        /// 对集合进行排序——泛型方法
        /// </summary>
        /// <typeparam name="T1">集合中的对象类型</typeparam>
        /// <typeparam name="T2">排序类型</typeparam>
        /// <param name="collection">要排序的集合</param>
        /// <param name="comparer">排序器</param>
        public static void Sort<T1,T2>(List<T1> collection,T2 comparer) where T2:IComparer<T1>
        {
            collection.Sort(comparer);
        }
    }

(3)设计ListView,构造排序字段

<LayoutTemplate>
                    <table class="PostList">
                        <tr class="PostListHeader">
                            <td colspan="2">
                                标题
                            </td>
                            <td>
                                公布日期
                            </td>
                            <td>
                                <asp:LinkButton runat="server" ID="lbtnReply" Text="回复" CommandName="Sort" CommandArgument="ReplyCount"
                                    CssClass="sortLink"></asp:LinkButton>
                            </td>
                            <td>
                                <asp:LinkButton runat="server" ID="lbtnView" Text="浏览" CommandName="Sort" CommandArgument="ViewCount"
                                    CssClass="sortLink"></asp:LinkButton>
                            </td>
                            <td>
                                最后发表
                            </td>
                            <td>
                                删除
                            </td>
                        </tr>
                        <tr runat="server" id="itemPlaceholder">
                        </tr>
                    </table>
                    <div class="pager">
                        <asp:DataPager ID="pagerBottom" runat="server" PageSize="5">
                            <Fields>
                                <asp:NextPreviousPagerField ButtonCssClass="command" FirstPageText="<<" PreviousPageText="<"
                                    RenderDisabledButtonsAsLabels="true" ShowFirstPageButton="true" ShowLastPageButton="false"
                                    ShowNextPageButton="false" ShowPreviousPageButton="true" />
                                <asp:NumericPagerField ButtonCount="7" CurrentPageLabelCssClass="current" NextPreviousButtonCssClass="command"
                                    NumericButtonCssClass="command" />
                                <asp:NextPreviousPagerField ButtonCssClass="command" LastPageText=">>" NextPageText=">"
                                    RenderDisabledButtonsAsLabels="true" ShowFirstPageButton="false" ShowLastPageButton="true"
                                    ShowNextPageButton="true" ShowPreviousPageButton="false" />
                            </Fields>
                        </asp:DataPager>
                    </div>
                </LayoutTemplate>

注意:上面LayoutTemplate中的两个LinkButton,用来作为用户排序接口。其CommandName属性为Sort(固定),CommandArgument分别为ReplyCount和ViewCount。

(4)ListView公开了两个与排序相关的事件:Sorting和Sorted。

        /// <summary>
        /// listview排序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lvPosts_Sorting(object sender, ListViewSortEventArgs e)
        {
            //推断是否指定了排序字段
            if (string.IsNullOrEmpty(e.SortExpression))
            {
                return;
            }
            //数据源
            if (ViewState["posts"] != null)
            {
                posts = ViewState["posts"] as List<PostInfo>;
            }
            else
            {
                posts = new PostInfoBLL().GetAllPosts(begin, end);
                ViewState["posts"] = posts;
            }
            //升序还是降序
            if (ViewState["SortDirection"] != null)
            {
                  e.SortDirection=(SortDirection)ViewState["SortDirection"];
            }

            //按哪个字段排序
            if (e.SortExpression == "ReplyCount")
            {
                if (e.SortDirection == SortDirection.Ascending)
                {
                    //泛型方法调用
                    SortHelper.Sort<PostInfo, PostReplyCountAscCompare>(posts, new PostReplyCountAscCompare());
                    ViewState["SortDirection"] = SortDirection.Descending;
                }
                else
                {
                    SortHelper.Sort<PostInfo, PostReplyCountDescCompare>(posts, new PostReplyCountDescCompare());
                    ViewState["SortDirection"] = SortDirection.Ascending;
                }
            }
            else if (e.SortExpression == "ViewCount")
            {
                if (e.SortDirection == SortDirection.Ascending)
                {
                    SortHelper.Sort<PostInfo,PostViewCountAscCompare>(posts, new PostViewCountAscCompare());
                    ViewState["SortDirection"] = SortDirection.Descending;
                }
                else
                {
                    SortHelper.Sort<PostInfo,PostViewCountDescCompare>(posts, new PostViewCountDescCompare());
                    ViewState["SortDirection"] = SortDirection.Ascending;
                }
            }
            BindPosts(true);
        }

注意:上述方法中的数据源的获取和BindPosts()方法,读者可自行杜撰。

(5)执行界面例如以下图:

时间: 2024-12-23 07:46:36

在ListView中实现排序的相关文章

ListView 字母导航排序

一.概述 ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的.  之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelistview + 字母导航的, 这里先抄袭一下 ListView的 字母导航, 此处没有实现挤压效果. 二.代码 package com.example.sortlistview; import android.content.Context; import android.graphics.Canv

ImageLoader在Listview中的使用

图片加载框架之ImageLoader 1_特点 1)多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2)支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 3)支持图片的内存缓存,文件系统缓存或者SD卡缓存 4)支持图片下载过程的监听 5)根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存 6)较好的控制图片的加载过程,例如暂停图片加载,重

Android入门 在ListView中如何进行精确的定位

在android的开发中,经常会遇到需要主动去设定某条ListItem的位置的需求.设置位置的函数有 ListView.setSelection(int position) ListView.setSelectionFromTop(int position, int y); 其中 position指的是指定的item的在ListView中的索引,注意如果有Header存在的情况下,索引是从Header就开始算的. y指的是到ListView可见范围内最上边边缘的距离. 函数有了,现在就是根据自身

C# 将Access中时间段条件查询的数据添加到ListView中

C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加Item. 首先,ListView的Item属性包括Items和SubItems.必须先实例化一个ListIteView对象.具体如下: ListViewItem listViewItem=new ListViewItem(); l

Xamarin.Forms listview中的button按钮,实现带着参数返回上一级页面

今天在做列表显示的时候遇到一个问题,就是在ListView中如何才能让一个button的按钮工作并且包含参数呢? 其实有点类似于rep里的控件无法起获取一样.在Xamarin中,当你button绑定事件并不包含在listview的数据源中,那么这个按钮的事件便是无效的. 那么该怎么解决呢?找了一下午终于找到了解决方案 xaml: <AbsoluteLayout IsVisible="True" HorizontalOptions="EndAndExpand"&

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a

PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)

前言:经常说follow your heart.但等到真到这么一天的时候,却很艰难 相关文章: 1.<PullScrollView详解(一)--自定义控件属性>2.<PullScrollView详解(二)--Animation.Layout与下拉回弹>3.<PullScrollView详解(三)--PullScrollView实现>4.<PullScrollView详解(四)--完全使用listview实现下拉回弹(方法一)>5.<PullScroll

android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?

根据这个方法检测: 1 getListView().setOnScrollListener(new OnScrollListener() { 2 @Override 3 public void onScrollStateChanged(AbsListView view, int scrollState) { 4 } 5 6 @Override 7 public void onScroll(AbsListView view, int firstVisibleItem, int visibleIte

.NET winform 在listview中添加progressbar

找了好长时间没找到,后来索性自己写了一个: 首先,在往listview加载数据的事件里添加progressbar: foreach (string d in arr) { int index = lv.Items.Count + 1; item = new ListViewItem(new string[] { index.ToString(), d, "", "", "", "" }); lv.Items.Add(item)