iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么利用RecyclerView实现今日头条频道管理功能
  • 795
分享到

Android中怎么利用RecyclerView实现今日头条频道管理功能

androidrecyclerview 2023-05-30 23:05:04 795人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Android中怎么利用RecyclerView实现今日头条频道管理功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现思路:通过ItemTouchHelper

这篇文章将为大家详细讲解有关Android中怎么利用RecyclerView实现今日头条频道管理功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

实现思路:

通过ItemTouchHelper来绑定RecyclerView的子控件触摸事件。
当滑动拖拽的时候,通知适配器来交换两个子控件的显示位置。
更改数据源,使数据源与子空间显示内容一致。
这就是实现的基本思路,是不是很简单?当然,首先要了解一下ItemTouchHelper这哥们儿是干啥的,有什么作用。

This is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.

It works with a RecyclerView and a Callback class, which configures what type of interactions are enabled and also receives events when user perfORMs these actions.

Depending on which functionality you support, you should override onMove(RecyclerView, ViewHolder, ViewHolder) and / or onSwiped(ViewHolder, int).

This class is designed to work with any LayoutManager but for certain situations, it can be optimized for your custom LayoutManager by extending methods in the ItemTouchHelper.Callback class or implementing ItemTouchHelper.ViewDropHandler interface in your LayoutManager.

By default, ItemTouchHelper moves the items' translateX/Y properties to reposition them. You can customize these behaviors by overriding onChildDraw(canvas, RecyclerView, ViewHolder, float, float, int, boolean) or onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int, boolean).

Most of the time you only need to override onChildDraw.

通过api文档的介绍,这个哥们儿是为RecyclerView工作的,他需要一个CallBack,可以回调RecyclerView的子控件滑动和拖拽事件,而且也可以通过这个CallBack重绘我们的子view。这就一目了然了嘛。通过使用ItemTouchHelper,可以很轻松的就实现了RecyclerView触摸事件的回调。换句话说,只要我们为RecyclerView 绑定了ItemTouchHelper之后,RecyclerView子控件的拖动和滑动事件已经帮我们实现了。我们所要做的就是在触摸事件之后,如何去改变去更新Adapter和改变我们的数据。

开始撸码:

public class ChannelActivity extends Activity {  public RecyclerView rv;  public List<DataBean> list = new ArrayList<>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_channel);    initData();    initView();  }  private void initView() {    rv = (RecyclerView) findViewById(R.id.rl_view);    rv.setLayoutManager(new GridLayoutManager(this, 4));    MyAdapter adapter = new MyAdapter(this, list);    rv.setAdapter(adapter);    //关联ItemTouchHelper    ItemTouchHelper touchHelper = new ItemTouchHelper(new MyItemTouchCallBack(adapter));    touchHelper.attachToRecyclerView(rv);  }  private void initData() {    DataBean bean1 = new DataBean("体育", 0, "url");    DataBean bean2 = new DataBean("新闻", 1, "url");    DataBean bean3 = new DataBean("影视", 2, "url");    DataBean bean4 = new DataBean("电视剧", 3, "url");    DataBean bean5 = new DataBean("热点", 4, "url");    DataBean bean6 = new DataBean("推荐", 5, "url");    DataBean bean7 = new DataBean("屌丝男士", 6, "url");    DataBean bean8 = new DataBean("音乐", 7, "url");    DataBean bean9 = new DataBean("电影", 8, "url");    list.add(bean1);    list.add(bean2);    list.add(bean3);    list.add(bean4);    list.add(bean5);    list.add(bean6);    list.add(bean7);    list.add(bean8);    list.add(bean9);  }}

自定义MyItemTouchCallBack

public class MyItemTouchCallBack extends ItemTouchHelper.Callback {  private TouchInterface touchInterface;  public MyItemTouchCallBack(TouchInterface touchInterface) {    this.touchInterface = touchInterface;  }  @Override  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {    //拖拽    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT;    //滑出屏幕    int swipeFlags = ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;    return makeMovementFlags(dragFlags, 0);  }  @Override  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {    int position_target = target.getLayoutPosition();    int position = viewHolder.getLayoutPosition();    //滑动事件回调到了Adapter,用来处理数据    touchInterface.onMove(position, position_target);    return true;  }  //标签动画持续时间,默认是250  @Override  public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {    return super.getAnimationDuration(recyclerView, animationType, animateDx, animateDy);  }    @Override  public boolean isLongPressDragEnabled() {    return super.isLongPressDragEnabled();  }    @Override  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {  }}

Adapter类中处理数据

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> implements TouchInterface {  private Context context;  //是否显示delete  public boolean isshow;  public List<DataBean> getList() {    return list;  }  public void setList(List<DataBean> list) {    this.list = list;  }  private List<DataBean> list;  public MyAdapter(Context context, List<DataBean> list) {    this.context = context;    this.list = list;  }  @Override  public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    MyViewHolder viewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false));    return viewHolder;  }  @Override  public void onBindViewHolder(MyViewHolder holder, final int position) {    holder.tv_des.setText(list.get(position).name);    holder.tv_des.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        DataBean bean = list.remove(position);        notifyDataSetChanged();        Toast.makeText(context,"删除了"+bean.name+"频道",Toast.LENGTH_SHORT).show();      }    });    holder.tv_des.setOnLonGClickListener(new View.OnLongClickListener() {      @Override      public boolean onLongClick(View v) {        isShow = true;        notifyDataSetChanged();        return true;      }    });    if (isShow) {      holder.iv_icon.setVisibility(View.VISIBLE);    } else {      holder.iv_icon.setVisibility(View.GoNE);    }  }  @Override  public int getItemCount() {    return list.size();  }  @Override  public void onMove(int currentPosition, int targetPosition) {    Collections.swap(list, currentPosition, targetPosition);    if (targetPosition < currentPosition) {      List<DataBean> subList = list.subList(targetPosition + 1, currentPosition + 1);      //向右移一位      rightStepList(0, subList);    } else {      List<DataBean> subList = list.subList(currentPosition, targetPosition);      //向左移一位      leftStepList(0, subList);    }    notifyItemMoved(currentPosition, targetPosition);  }}class MyViewHolder extends RecyclerView.ViewHolder {  public ImageView iv_icon;  public TextView tv_des;  public MyViewHolder(View itemView) {    super(itemView);    iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);    tv_des = (TextView) itemView.findViewById(R.id.tv_des);  }}

解释一下onMove方法,例如:我们的数据是[1,2,3,4,5,6],当6移动到3的位置时,那么数据源最后变化为[1,2,6,3,4,5]。但是在显示的时候我们先是将当前position和targetposition对调[1,2,6,4,5,3],然后取出[4,5,3]进行右移一位,这样数据源就对上了。如果是从3移动到6进行左移就可以了,数据排序算法,采用反转的思想。

public class DataUtils {    public static void reverseList(int start,int end,List list){    int count = (end+1-start)/2 ;    for(int i = 0;i< count;i++){      Object temp = list.get(start+i);      list.set(start+i,list.get(end-i));      list.set(end-i,temp);    }  }  public static void leftStepList(int step,List list){    int size = list.size() -1;    //左移    reverseList(0,step,list);    reverseList(step+1,size,list);    reverseList(0,size,list);  }  public static void rightStepList(int step,List list){    int size = list.size() -1;    //右移    reverseList(size-step,size,list);    reverseList(0,size-step-1,list);    reverseList(0,size,list);  }}

Activity布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/activity_channel"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.iwintrue.channe.ChannelActivity">  <android.support.v7.widget.RecyclerView    android:id="@+id/rl_view"    android:background="@color/white"    android:layout_width="match_parent"    android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></RelativeLayout>

子控件布局文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  >  <RelativeLayout    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:padding="10dp">    <TextView      android:id="@+id/tv_des"      android:layout_width="80dp"      android:layout_height="30dp"      android:text="屌丝男士"      android:gravity="center"      android:background="@drawable/rl_shape"      android:textColor="@color/textColor"      android:layout_marginTop="5dp"      android:layout_marginRight="5dp" />    <ImageView      android:layout_alignRight="@+id/tv_des"      android:layout_marginRight="-5dp"      android:id="@+id/iv_icon"      android:layout_width="20dp"      android:layout_height="20dp"      android:src="@mipmap/delete"      android:scaleType="fitXY"      android:visibility="gone" />  </RelativeLayout></LinearLayout>

关于Android中怎么利用RecyclerView实现今日头条频道管理功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Android中怎么利用RecyclerView实现今日头条频道管理功能

本文链接: https://www.lsjlt.com/news/222036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么利用RecyclerView实现今日头条频道管理功能
    这篇文章将为大家详细讲解有关Android中怎么利用RecyclerView实现今日头条频道管理功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现思路:通过ItemTouchHelper...
    99+
    2023-05-30
    android recyclerview
  • 怎么在Android中利用RecyclerView实现一个频道管理功能
    本篇文章给大家分享的是有关怎么在Android中利用RecyclerView实现一个频道管理功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需要在build里添加依赖 com...
    99+
    2023-05-31
    recyclerview android recycle
  • 怎么在Android中利用RecyclerView实现一个快速滚动功能
    本篇文章给大家分享的是有关怎么在Android中利用RecyclerView实现一个快速滚动功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,在 build.gradle...
    99+
    2023-05-30
    recyclerview android
  • 怎么在Android 中利用RecyclerView实现一个通用适配器功能
    怎么在Android 中利用RecyclerView实现一个通用适配器功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现代码:RViewHolderimport ...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android应用中利用RecyclerView实现一个分页滚动功能
    怎么在Android应用中利用RecyclerView实现一个分页滚动功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、需求分析最近公司项目要实现一个需求要满足以下功能...
    99+
    2023-05-31
    android recyclerview recycle
  • Android 中怎么利用Recyclerview实现水平分页
    Android 中怎么利用Recyclerview实现水平分页,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。解决思路既然打算用Recyclerview实现,很明显这就可以用Gr...
    99+
    2023-05-30
    recyclerview android
  • 如何在Android中利用Recyclerview实现一个上拉加载功能
    如何在Android中利用Recyclerview实现一个上拉加载功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android中利用Walle实现一个多渠道打包功能
    怎么在Android中利用Walle实现一个多渠道打包功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android是什么Android是一种基于Linux内核的自由及开...
    99+
    2023-06-14
  • Android中怎么利用RecyclerView实现列表嵌套效果
    Android中怎么利用RecyclerView实现列表嵌套效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 定义多布局对象的基类:public class...
    99+
    2023-05-30
    android recyclerview
  • Android中怎么实现多渠道打包功能
    这期内容当中小编将会给大家带来有关Android中怎么实现多渠道打包功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.生成签名文件点击 Build -> Generate Signed APK:...
    99+
    2023-05-30
    android
  • Android中怎么利用ProgressBar实现进度条
    这篇文章给大家介绍Android中怎么利用ProgressBar实现进度条,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。activity_main.xml<xml version="1.0&q...
    99+
    2023-05-30
    android progressbar
  • 怎么在Android中使用RecyclerView实现一个图标拖拽排序功能
    这期内容当中小编将会给大家带来有关怎么在Android中使用RecyclerView实现一个图标拖拽排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现的思路用两个RecyclerView实现,同时...
    99+
    2023-06-14
  • Android应用中怎么实现一个视频点播功能
    这篇文章给大家介绍Android应用中怎么实现一个视频点播功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。采用了本地代理服务的方式,通过原始url给播放器返回一个本地代理的一个url ,代理URL类似:http://...
    99+
    2023-05-31
    android roi
  • Android中怎么实现条目拖拽删除功能
    本篇文章给大家分享的是有关Android中怎么实现条目拖拽删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一步效果图0自定义控件 SwipeLayout 继承Frame...
    99+
    2023-05-30
    android
  • Android 中怎么利用ViewPager实现左右滑动功能
    本篇文章给大家分享的是有关Android 中怎么利用ViewPager实现左右滑动功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android ViewPager实现左右滑...
    99+
    2023-05-30
    android viewpager
  • Android中怎么利用AsyncTask实现下载文件动态更新进度条功能
    Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 泛型AysncTask<Params, Pro...
    99+
    2023-05-30
    android asynctask
  • Android中怎么利用MVP实现登录注册功能
    这篇文章给大家介绍Android中怎么利用MVP实现登录注册功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。model包:import com.bwei.mvps.bean.UserBean;public&...
    99+
    2023-05-30
    android mvp
  • Android中怎么利用item实现长按删除功能
    Android中怎么利用item实现长按删除功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一般写完之后都会调用 public void&...
    99+
    2023-05-30
    android item
  • Android中怎么利用AudioRecord实现暂停录音功能
    Android中怎么利用AudioRecord实现暂停录音功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。项目设计的思路:由于自带的AudioRecord没有pauseRec...
    99+
    2023-05-31
    android audiorecord
  • Android中怎么利用OKhttp3实现登录注册功能
    这期内容当中小编将会给大家带来有关Android中怎么利用OKhttp3实现登录注册功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、Android前端实现新建一个login的项目,主要的几个文件在这...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作