ListView的item置顶

ListView的item设置置顶


1.activity

public class TopListViewActivity extends Activity {

    private static int ON_TOP = 1;

    private static int CANCEL_TOP = 0;

    public static String TOP_STATES = "TOP";

    private ListView mListView;

    private List<Session> sessionList;

    private SessionItemAdapter itemAdapter;

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_top_listview);

        initView();

        registerListener();

    }

    private void registerListener() {

        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override

            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

                final Session session = (Session) parent.getItemAtPosition(position);

                Bundle bundle = new Bundle();

                bundle.putInt(TOP_STATES, session.getTop());

                PopupDialogFragment popupDialog = new PopupDialogFragment();

                popupDialog.setArguments(bundle);

                popupDialog.setItemOnClickListener(new PopupDialogFragment.DialogItemOnClickListener() {

                    @Override

                    public void onTop() {

                        //置顶

                        session.setTop(ON_TOP);

                        session.setTime(System.currentTimeMillis());

                        refreshView();

                    }

                    @Override

                    public void onCancel() {

                        //取消

                        session.setTop(CANCEL_TOP);

                        refreshView();

                    }

                });

                popupDialog.show(getFragmentManager(), "POPUP");

return true;

            }

        });

    }

    private void initView() {

        mListView = (ListView) findViewById(R.id.lv);

        sessionList = new ArrayList<>();

        //简单实现Item数据

        TypedArray iconArray = getResources().obtainTypedArray(R.array.icon_array);

        for (int i = 0; i < 8; i++) {

            Session session = new Session();

            session.setAvatar(iconArray.getResourceId(i,R.mipmap.ic_launcher));

            sessionList.add(session);

        }

        itemAdapter = new SessionItemAdapter(this);

        mListView.setAdapter(itemAdapter);

        refreshView();

        iconArray.recycle();

    }

    private void refreshView() {

        //如果不调用sort方法,是不会进行排序的,也就不会调用compareTo

        Collections.sort(sessionList);

        itemAdapter.updateData(sessionList);

    }

}

2.fragment

public class PopupDialogFragment extends DialogFragment {

    private DialogItemOnClickListener itemOnClickListener;

@Nullable

@Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.popview, null);

        TextView onTopTv = (TextView) view.findViewById(R.id.on_top_tv);

        TextView cancelTv = (TextView) view.findViewById(R.id.cancel_top_tv);

        Bundle bundle = getArguments();

        int isTop = bundle.getInt(TopListViewActivity.TOP_STATES);

        //判断是否已经置顶

        if (isTop == 1) {

            onTopTv.setVisibility(View.GONE);

            cancelTv.setVisibility(View.VISIBLE);

        } else if (isTop == 0) {

            onTopTv.setVisibility(View.VISIBLE);

            cancelTv.setVisibility(View.GONE);

        }

        onTopTv.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                getDialog().dismiss();

                itemOnClickListener.onTop();

            }

        });

        cancelTv.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                getDialog().dismiss();

                itemOnClickListener.onCancel();

            }

        });

        getDialog().getWindow().requestFeature(STYLE_NO_TITLE);

        setStyle(STYLE_NO_FRAME, android.R.style.Theme_Light);

        setCancelable(true);

        getDialog().getWindow().setBackgroundDrawableResource(R.color.write_bg);

        return view;

    }

    public void setItemOnClickListener(DialogItemOnClickListener itemOnClickListener) {

        this.itemOnClickListener = itemOnClickListener;

    }

    public interface DialogItemOnClickListener {

        void onTop();

        void onCancel();

    }

}

3.itemview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:id="@+id/bg"

    android:orientation="horizontal">

    <ImageView

        android:id="@+id/avatar_img"

        android:layout_width="60dp"

        android:layout_height="60dp"

        android:layout_gravity="center_vertical" />

    <TextView

        android:id="@+id/textView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center_vertical"

        android:layout_marginLeft="30dp"

        android:text="hello word"

        android:textSize="20sp" />

</LinearLayout>


4.attrs

<string-array name="icon_array">

    <item>@mipmap/ic_ac_unit_black</item>

    <item>@mipmap/ic_airport_shuttle_black</item>

    <item>@mipmap/ic_all_inclusive_black</item>

    <item>@mipmap/ic_beach_access_black</item>

    <item>@mipmap/ic_casino_black</item>

    <item>@mipmap/ic_child_care_black</item>

    <item>@mipmap/ic_child_friendly_black</item>

    <item>@mipmap/ic_free_breakfast_black</item>

</string-array>


5.popview

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:layout_marginLeft="20dp"

    android:layout_marginRight="20dp"

    android:background="@color/write_bg"

    >

    <TextView

        android:id="@+id/on_top_tv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center_horizontal"

        android:padding="15dp"

        android:text="选择置顶"

        android:textSize="20sp"

        android:layout_gravity="center_horizontal"

        />

    <View

        android:layout_width="match_parent"

        android:layout_height="0.4dp"

        android:background="@color/common_line_color"/>

    <TextView

        android:id="@+id/cancel_top_tv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center_horizontal"

        android:padding="15dp"

        android:text="取消置顶"

        android:textSize="20sp"

        android:layout_gravity="center_horizontal"

        />

</LinearLayout>


6.session

package com.antquenn.demos.bean;

import java.io.Serializable;

import java.util.Calendar;

/**

* Created by ant_quenn on 2020/11/10.

*/

public class Session implements Serializable, Comparable {

    /**

* 是否置顶

*/

    public int top;

    /**

* 置顶时间

**/

    public long time;

    /**

* 头像

*/

    public int avatar;

    public long getTime() {

        return time;

    }

    public void setTime(long time) {

        this.time = time;

    }

    public int getTop() {

        return top;

    }

    public void setTop(int top) {

        this.top = top;

    }

    public int getAvatar() {

        return avatar;

    }

    public void setAvatar(int avatar) {

        this.avatar = avatar;

    }

    @Override

    public int compareTo(Object another) {

        if (another == null || !(another instanceof Session)) {

            return -1;

        }

        Session otherSession = (Session) another;

        /**置顶判断 ArrayAdapter是按照升序从上到下排序的,就是默认的自然排序

* 如果是相等的情况下返回0,包括都置顶或者都不置顶,返回0的情况下要

* 再做判断,拿它们置顶时间进行判断

* 如果是不相等的情况下,otherSession是置顶的,则当前session是非置顶的,

* 应该在otherSession下面,所以返回1

* 同样,session是置顶的,则当前otherSession是非置顶的,

* 应该在otherSession上面,所以返回-1

* */

        int result = 0 - (top - otherSession.getTop());

        if (result == 0) {

            result = 0 - compareToTime(time, otherSession.getTime());

        }

        return result;

    }

    /**

* 根据时间对比

* */

    public static int compareToTime(long lhs, long rhs) {

        Calendar cLhs = Calendar.getInstance();

        Calendar cRhs = Calendar.getInstance();

        cLhs.setTimeInMillis(lhs);

        cRhs.setTimeInMillis(rhs);

        return cLhs.compareTo(cRhs);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335