当前位置:首页 > 谈天说地

Android RecycleView实现Item拖拽效果

34资源网2022-01-06630

基于公司产品的优化需求,其中一个需求涉及到recycleview的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效。我写了一个小demo用作演示效果。

先看效果(只看效果,不看颜值)

步骤1、建接口文件itemtouchhelperviewholder,该接口文件中描述的是选中和放开当前item调用的方法。

public interface itemtouchhelperviewholder {
    void onitemselected(); //选中item
    void onitemcleared();//放开item
}

步骤2、写item得viewholder的类,该类需要继承recyclerview.viewholder类,同时要实现步骤中的接口。

public class itemviewholder extends recyclerview.viewholder implements itemtouchhelperviewholder {
 
    private textview tvname;
 
    public textview gettvname() {
        return tvname;
    }
 
    public void settvname(textview tvname) {
        this.tvname = tvname;
    }
 
    public itemviewholder(@nonnull view itemview) {
        super(itemview);
        tvname = itemview.findviewbyid(r.id.tv_item_name);
    }
 
    @override
    public void onitemselected() {
        tvname.setbackgroundcolor(color.gray);
    }
 
    @override
    public void onitemcleared() {
        tvname.setbackgroundcolor(color.yellow);}
}

步骤3、建立接口文件itemtouchhelperadapter,该文件中描写的是移动recycleview的item时会调用的方法。

public interface itemtouchhelperadapter {
    void onitemmove(int fromposition,int toposition);
}

步骤4、实现一个适配器,继承recyclerview.adapter<itemviewholder>,同时实现步骤3的接口。

public class recyclergridadapter extends recyclerview.adapter<itemviewholder> implements itemtouchhelperadapter {
    private arraylist<string> localdataset;
    private sharedpreferences sp;
    private sharedpreferences.editor speditor;
    final static  string save_key = "star_sort";
    final static string user_preference = "user_preference";
    private context context;
 
    public recyclergridadapter(arraylist<string> dataset,context context) {
        string defaultstr = dataset.tostring();
        if(context != null){
            this.context = context;
            sp = context.getsharedpreferences(user_preference,context.mode_private);
            speditor = sp.edit();
            string savestring = sp.getstring(save_key,defaultstr);
            //考虑,若要更改数据源,需要怎么实现 todo
            string[] splitstr = savestring.replace("[","").replace("]","").replace(" ","").split(",");
            localdataset = new arraylist();
            localdataset.addall(arrays.aslist(splitstr));
        }
    }
 
 
    @nonnull
    @override
    public itemviewholder oncreateviewholder(@nonnull viewgroup parent, int viewtype) {
        view view = layoutinflater.from(parent.getcontext()).inflate(r.layout.item_view_holder_layout, parent, false);
        return new itemviewholder(view);
    }
 
    @override
    public void onbindviewholder(@nonnull itemviewholder holder, int position) {
        holder.gettvname().settext(localdataset.get(position));
    }
 
    @override
    public int getitemcount() {
        return localdataset.size();
    }
 
    @override
    public void onitemmove(int fromposition, int toposition) {
        string prve = localdataset.remove(fromposition);
        if((toposition > fromposition) && (localdataset.size() <= toposition)){
            //将当前item移至最后一位
            localdataset.add(prve);
        }else{
            localdataset.add(toposition, prve);
        }
        notifyitemmoved(fromposition, toposition);
        speditor.putstring(save_key,localdataset.tostring());
        speditor.apply();
    }
}

步骤5、实现itemtouchhelper.callback接口,至于什么是itemtouchhelper,网上一查很多解释,我这不做阐述了。

public class simpleitemtouchhelpercallback extends itemtouchhelper.callback {
 
    private itemtouchhelperadapter adapter;
 
    public simpleitemtouchhelpercallback(itemtouchhelperadapter adapter) {
        this.adapter = adapter;
    }
 
    @override
    public int getmovementflags(@nonnull recyclerview recyclerview, @nonnull recyclerview.viewholder viewholder) {
        final int dragflags = itemtouchhelper.up | itemtouchhelper.down | itemtouchhelper.left | itemtouchhelper.right;
        return makeflag(itemtouchhelper.action_state_drag, dragflags);
    }
 
    @override
    public boolean onmove(@nonnull recyclerview recyclerview, @nonnull recyclerview.viewholder viewholder, @nonnull recyclerview.viewholder target) {
        if (viewholder.getitemviewtype() != target.getitemviewtype()) {
            return false;
        }
        adapter.onitemmove(viewholder.getadapterposition(), target.getadapterposition());
        return true;
    }
 
    @override
    public void onswiped(@nonnull recyclerview.viewholder viewholder, int direction) {
 
    }
 
 
    @override
    public void onselectedchanged(@nullable recyclerview.viewholder viewholder, int actionstate) {
        if (actionstate == itemtouchhelper.action_state_drag) {
            itemtouchhelperviewholder itemtouchhelperviewholder = (itemtouchhelperviewholder) viewholder;
            itemtouchhelperviewholder.onitemselected();
        }
        super.onselectedchanged(viewholder, actionstate);
    }
 
    @override
    public void clearview(@nonnull recyclerview recyclerview, @nonnull recyclerview.viewholder viewholder) {
        super.clearview(recyclerview, viewholder);
        itemviewholder itemviewholder = (itemviewholder) viewholder;
        itemviewholder.onitemcleared();
    }
}

步骤6,现在就可以调用啦,基于步骤5实现的itemtoucherhelper.callback实例构建itemtouchhelper实例,然后attach给recycleview就好啦。

class mainactivity : appcompatactivity() {
    override fun oncreate(savedinstancestate: bundle?) {
        super.oncreate(savedinstancestate)
        val viewbinding = databindingutil.setcontentview<activitymainbinding>(this,r.layout.activity_main)
        with(viewbinding){
            var data = arraylist<string>()
            var index = 10
            while (index-- >0){
                data.add(index.tostring())
            }
            var adapter = recyclergridadapter(data,this@mainactivity)
            recycletest.layoutmanager = gridlayoutmanager(this@mainactivity,4)
            recycletest.adapter = adapter
            var callback = simpleitemtouchhelpercallback(adapter)
            var itemtouchhelper = itemtouchhelper(callback)
            itemtouchhelper.attachtorecyclerview(recycletest)
        }
    }
}

以上就是android recycleview实现item拖拽效果的详细内容,更多关于android recycleview拖拽item的资料请关注萬仟网其它相关文章!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/4892.html

分享给朋友:

相关文章

50句非常励志的短句,正能量的励志句子

50句非常励志的短句,正能量的励志句子

1、人非要经历一番不同平时的劫难才能脱胎换骨,成为真正能解决问题的人。…

现在开一家vr游戏体验馆投资创业要多少钱?

现在开一家vr游戏体验馆投资创业要多少钱?

现在开一家vr游戏体验馆投资创业要多少钱?这个涉及到的东西很多,比如你的店铺开在市区还是乡下,是开在热闹地方还是比较冷清的地方,另外还要看你的店面有多大,设备有多少台,以及其他的零零碎碎加起来,就能知道开一家vr游戏体验馆需要多少钱了。…

天上的孩子电影好看吗?看豆瓣网友如何评价的吧

天上的孩子电影好看吗?看豆瓣网友如何评价的吧

由胡玫监制许磊导演编剧的电影《天上的孩子》。电影主要讲述了来自贵州的夫妻老何、玲霞5岁的独子查出绝症,不久于人世。为了让儿子的名字刻在纪念碑上,夫妻俩决定捐献儿子的器官却困难重重。…

腾讯奖励员工21亿港元股票;爱奇艺被曝大规模裁员;抖音短剧开启付费模式;豆瓣被约谈,所有小组回复功能已暂停丨文娱周报

腾讯奖励员工21亿港元股票;爱奇艺被曝大规模裁员;抖音短剧开启付费模式;豆瓣被约谈,所有小组回复功能已暂停丨文娱周报

整理丨解夏 编辑丨及轶嵘 本周(2021.11.26-12.3)值得关注的文娱热点新闻:微信可直接打开淘宝、抖音;抖音短剧开启付费模式 ;爱奇艺被曝大规模裁员;腾讯两大事业群同时调整副总裁;腾讯发21亿港元股票奖励;豆瓣被约谈,所有小组回复…

mariadb安装教程(数据库安装图解教程)

MariaDB 和 MySQL 都是使用 SQL 的开源数据库,并且共享相同的初始代码库。MariaDB 是 MySQL 的替代品,你可以使用相同的命令(mysql)与 MySQL 和 MariaDB 数据库进行交互。因此,本文同时适用于…

小红书回应被曝存未成年人性暗示(部分内容已被回查处理)

小红书回应被曝存未成年人性暗示(部分内容已被回查处理)

小红书被曝存未成年人性暗示近日,媒体报道称,小红书涉嫌泄露未成年隐私及内容审核不严问题。 对此,小红书对报道提及审核漏放情况致歉,并透露平台将于近期启动新一轮未成年治理专项。对于报道中提及的部分内容,小红书表示在平台此前的未成年专项回查中已…