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

Android RecycleView实现Item拖拽效果

34资源网2022-01-06649

基于公司产品的优化需求,其中一个需求涉及到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

分享给朋友:

相关文章

coco奶茶店加盟费大概多少钱?有哪些优势?

coco奶茶店加盟费大概多少钱?有哪些优势?

CoCo奶茶来自宝岛台湾的奶茶加盟连锁品牌,以绿色健康休闲奶茶饮品为主打的连锁机构,在中国及东南亚地区拥有众多加盟连锁店。相信很多人都想加盟这个奶茶店吧?那么,coco奶茶店加盟费大概多少钱?加盟有哪些优势呢?下面小编就详细和大家介绍下吧。…

年轻人不讲武德和耗子尾汁什么意思?什么梗?

年轻人不讲武德和耗子尾汁什么意思?什么梗?

最近经常在朋友圈,抖音上面刷到一些视频评论说年轻人不讲5的和耗子尾汁,小编看着感觉好奇怪,刚开始有点懵逼,结果去网上查了一下才知道,这是太极大师马保国老师讲的。究竟这个梗是怎么来的呢?其实,刚开始人家只是取笑这个马保国大师的梗,后面没有想到…

女人奋斗励志语录分享10句

女人奋斗励志语录分享10句

1、即便无人喝彩,也要守住自己的人生。每一次失败,都是成功的伏笔;每一次考验,都有一份收获;每一次泪水,都有一次醒悟;每一次磨难,都有生命的财富。每一次伤痛,都是成长的支柱。…

25句励志短句霸气,超励志的语录

25句励志短句霸气,超励志的语录

一、在人生的道路上,从来没有全身而退,坐享其成,不劳而获一说。你不努力,就得出局。…

联合国秘书长:新冠疫苗必须要成为全球公共产品

联合国秘书长:新冠疫苗必须要成为全球公共产品

当地时间3月11日,联合国启动“必须团结一致”(Only Together)公共宣传活动,呼吁新冠疫苗能够在联合国疫苗计划主导下,成为全球公共产品,向全球各地有需要的人提供。…

​50句名言警句摘抄大全

​50句名言警句摘抄大全

网上的名言警句有很多,相信大家想找的话,一下子就能找到几千上万句这类名言名句,这类名言名句只有短短的几个字,却蕴藏着巨大的人生哲理,有些可能对你的人生有很大帮助。喜欢名言警句的朋友,赶紧看下面小编摘录的50句名言警句吧,一定会对你有所帮助的…