最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用CardView作為RecyclerView的Item并實現(xiàn)拖拽和左滑刪除

 更新時間:2017年11月27日 17:18:27   作者:靜永萱  
這篇文章主要介紹了Android使用CardView作為RecyclerView的Item并實現(xiàn)拖拽和左滑刪除,具有一定的參考價值,感興趣的小伙伴們可以參考一下

引言

CardView是Android 5.0系統(tǒng)之后引入的眾多控件之一,實現(xiàn)之后的效果也是比較酷的,它經(jīng)常被用在RecyclerView和ListView中的Item中。今天我們就來了解一下CardView的屬性,然后使用CardView和RecyclerView結(jié)合實現(xiàn)一個可以拖拽Item的布局。

CardView的屬性

 CardView繼承自FrameLayout,所以子控件的布局規(guī)則和FrameLayout的一樣,是按照層次堆疊的

下面是CardView的一些常用屬性:

CardView的基本使用

先看一下效果:

這是一個CardView,多個羅列起來看起啦會更酷,好了,我們先看一下代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical" android:paddingTop="10dp"
  android:layout_width="match_parent" android:layout_height="wrap_content">
 
  <android.support.v7.widget.CardView
    android:layout_width="match_parent" android:layout_height="60dp"
    android:layout_marginLeft="10dp" android:layout_marginRight="10dp"
    app:contentPaddingLeft="20dp" app:cardBackgroundColor="@color/colorPrimary"
    app:cardCornerRadius="5dp" app:cardElevation="5dp"
    android:layout_marginBottom="10dp"
    app:cardPreventCornerOverlap="true">
    <LinearLayout
      android:layout_width="match_parent" android:layout_height="match_parent"
      android:orientation="horizontal" android:gravity="center_vertical">
      <!--左側(cè)圖片-->
      <ImageView
        android:layout_width="50dp" android:layout_height="50dp"
        android:src="@mipmap/ic_launcher"/>
      <LinearLayout
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:orientation="vertical" android:layout_marginLeft="10dp"
        android:gravity="center_vertical">
        <!--姓名-->
        <TextView
          android:id="@+id/txt_name" android:layout_width="wrap_content"
          android:layout_height="wrap_content" android:textSize="16sp"
          android:textColor="@android:color/white" android:text="王二"/>
        <!--描述-->
        <TextView
          android:id="@+id/txt_describe" android:layout_width="wrap_content"
          android:layout_height="wrap_content" android:layout_marginTop="5dp"
          android:textSize="12sp" android:textColor="@android:color/darker_gray"
          android:text="一個很厲害的人"/>
      </LinearLayout>
    </LinearLayout>
  </android.support.v7.widget.CardView>
</LinearLayout>

看完了布局文件,是不是覺得這個布局不僅炫酷而且使用簡單,下面我們把它應(yīng)用到RecyclerView中,看起來會更炫酷。

CardView應(yīng)用在RecyclerView中

CardView通常會應(yīng)用在RecyclerView和ListView中,今天我們就講一講如何應(yīng)用在RecyclerView中。我們現(xiàn)在在大多數(shù)應(yīng)用或者手機系統(tǒng)界面中會見到這樣的效果:

是不是覺得很棒,下面我們就用CardView和RecyclerView來實現(xiàn)一下這個效果。

布局文件

我們實現(xiàn)這個效果的第一步是先添加依賴庫:

implementation 'com.android.support:recyclerview-v7:26.+'
implementation 'com.android.support:cardview-v7:26.+'

然后寫一下布局文件,Item的布局文件我就直接采用上面的代碼了,然后再寫一個主界面的布局文件,比較簡單,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" android:paddingTop="10dp"
  tools:context="com.jyx.demo.myapplication.MainActivity">
 
  <android.support.v7.widget.RecyclerView
    android:id="@+id/my_recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
 
</LinearLayout>

Activity內(nèi)代碼

public class MainActivity extends AppCompatActivity {
  private RecyclerView mRecyclerView;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    mRecyclerView = (RecyclerView) findViewById(R.id.my_recyclerView);
    //設(shè)置LayoutManager
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(linearLayoutManager);
 
    //綁定adapter
    MyAdapter myAdapter = new MyAdapter(this);
    mRecyclerView.setAdapter(myAdapter);  
 
  }
  //adapter
  class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
 
    LayoutInflater mInflater;
    List<MData> mList = addData();
 
    public MyAdapter(Context context) {
      mInflater = LayoutInflater.from(context);
    }
 
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View view = mInflater.inflate(R.layout.item_my_recyclerview,parent,false);
      ViewHolder viewHolder = new ViewHolder(view);
      return viewHolder;
    }
 
    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
      holder.mName.setText(mList.get(position).getUserName());
      holder.mDescribe.setText(mList.get(position).getDescription());
    }
 
    @Override
    public int getItemCount() {
      return mList.size();
    }
 
    public class ViewHolder extends RecyclerView.ViewHolder {
      private TextView mName;
      private TextView mDescribe;
      public ViewHolder(View itemView) {
        super(itemView);
        mName = itemView.findViewById(R.id.txt_name);
        mDescribe = itemView.findViewById(R.id.txt_describe);
      }
    }
  }
  //制造一個數(shù)據(jù)源
  private class MData{
    String userName;
    String description;
 
    public String getUserName() {
      return userName;
    }
 
    public void setUserName(String userName) {
      this.userName = userName;
    }
 
    public String getDescription() {
      return description;
    }
 
    public void setDescription(String description) {
      this.description = description;
    }
  }
  private List<MData> addData(){
    List<MData> list = new ArrayList();
 
    MData mData = new MData();
    mData.setUserName("王二");
    mData.setDescription("一個很厲害的人");
    list.add(mData);
 
    mData = new MData();
    mData.setUserName("張三");
    mData.setDescription("呵呵");
    list.add(mData);
 
    mData = new MData();
    mData.setUserName("李四");
    mData.setDescription("嘻嘻");
    list.add(mData);
 
    mData = new MData();
    mData.setUserName("趙一");
    mData.setDescription("呵呵");
    list.add(mData);
 
    mData = new MData();
    mData.setUserName("錢多");
    mData.setDescription("地主家的傻兒子");
    list.add(mData);
    return list;
  }
}

好了,這就是一個沒有任何效果的列表界面,我一看一下效果:

ItemTouchHelper

想實現(xiàn)拖拽和滑動刪除的效果,很可惜RecyclerView并沒有提供現(xiàn)成的API供我們使用,但是SDK為我們提供了ItemTouchHelper這樣一個工具類幫助我們來輕松實現(xiàn)這些功能,我們先來了解一下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).

大致意思就是,這是個工具類,可以實拖拽移動和策劃刪除,使用這個工具需要RecyclerView和Callback。同時需要重寫onMove()和onSwiped()方法。接下來就講講如何使用ItemTouchHlper。

1.新建一個接口,并且讓Adapter實現(xiàn)

我們選擇使用一個接口來實現(xiàn)Adapter和ItemTouchHelper之間涉及數(shù)據(jù)的操作,因為ItemTouchHelper完成觸摸的各種動畫以后,就要對Adapter的數(shù)據(jù)進行操作,比如我們在側(cè)滑刪除以后,最后需要調(diào)用Adapter的notifyItemRemove()方法來移除該數(shù)據(jù)。所以我們可以把數(shù)據(jù)操作的部分抽象成一個接口方法,讓Callbac調(diào)用它即可。具體如下:

新建一個接口:

ItemTouchHelperAdapter

public interface ItemTouchHelperAdapter {
  //移動item
  public void onItemMove(int fromPosition,int toPosition);
  //刪除item
  public void onItemDelete(int position);
}

之后讓Adapter實現(xiàn)這個接口

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements ItemTouchHelperAdapter{
 
    LayoutInflater mInflater;
    List<MData> mList = addData();
 
    public MyAdapter(Context context) {
      mInflater = LayoutInflater.from(context);
    }
 
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View view = mInflater.inflate(R.layout.item_my_recyclerview,parent,false);
      ViewHolder viewHolder = new ViewHolder(view);
      return viewHolder;
    }
 
    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
      holder.mName.setText(mList.get(position).getUserName());
      holder.mDescribe.setText(mList.get(position).getDescription());
    }
 
    @Override
    public int getItemCount() {
      return mList.size();
    }
 
    @Override
    public void onItemMove(int fromPosition, int toPosition) {
      //交換位置
      Collections.swap(mList,fromPosition,toPosition);
      notifyItemMoved(fromPosition,toPosition);
    }
 
    @Override
    public void onItemDelete(int position) {
      //移除數(shù)據(jù)
      mList.remove(position);
      notifyItemRemoved(position);
    }
 
    public class ViewHolder extends RecyclerView.ViewHolder {
      private TextView mName;
      private TextView mDescribe;
      public ViewHolder(View itemView) {
        super(itemView);
        mName = itemView.findViewById(R.id.txt_name);
        mDescribe = itemView.findViewById(R.id.txt_describe);
      }
    }
  }

接下來我們直接在Callback中直接調(diào)用接口里的方法就可以了。

2.新建Callback方法,繼承ItemTouchHelper.Callback

官方文檔已經(jīng)告訴我們,使用ItemTouchHelper需要一個Callback,這個Callback是ItemTouchHelper.Callback的子類,我們需要新建一個類來繼承ItemTouchHelper.Callback,然后重寫一些方法來實現(xiàn)我們的需求。代碼如下:

public class myItemTouchHelperCallBack extends ItemTouchHelper.Callback{
  private ItemTouchHelperAdapter itemTouchHelperAdapter;
 
  public myItemTouchHelperCallBack(ItemTouchHelperAdapter itemTouchHelperAdapter) {
    this.itemTouchHelperAdapter = itemTouchHelperAdapter;
  }
 
  @Override
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    //允許上下拖動
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    //允許從右向左滑動
    int swipeFlags = ItemTouchHelper.LEFT;
    return makeMovementFlags(dragFlags,swipeFlags);
  }
 
  @Override
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    //onItemMove接口里的方法
    itemTouchHelperAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
    return true;
  }
 
  @Override
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    //onItemDelete接口里的方法
    itemTouchHelperAdapter.onItemDelete(viewHolder.getAdapterPosition());
  }
 
  @Override
  public boolean isLongPressDragEnabled() {
    //該方法返回值為true時,表示支持長按ItemView拖動
    return true;
  }
 
  @Override
  public boolean isItemViewSwipeEnabled() {
    //該方法返回true時,表示如果用戶觸摸并且左滑了view,那么可以執(zhí)行滑動刪除操作,就是可以調(diào)用onSwiped()方法
    return true;
  }
}

ItemTouchHelper.Callback還有其他幾個常用方法:

  1. public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState):從靜止狀態(tài)變?yōu)橥献Щ蛘呋瑒拥臅r候會調(diào)用該方法,參數(shù)actionState表示當前狀態(tài)。
  2. public void clearView(RecyclerView recyclerView, ViewHolder viewHolder):當用戶操作完某個item并且動畫也結(jié)束后會調(diào)用該方法,一般我們在該方法內(nèi)恢復(fù)ItemView的初始狀態(tài),防止由于復(fù)用而產(chǎn)生的錯亂問題。
  3. public void onChildDraw(…):我們可以在這個方法內(nèi)實現(xiàn)我們自定義的交互規(guī)則或者自定義動畫。

這樣下來我們就只剩下一步了。

3.為RecyclerView添加ItemTouchHelper

代碼如下:

  ItemTouchHelper.Callback callback = new myItemTouchHelperCallBack(myAdapter);
  ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
  touchHelper.attachToRecyclerView(mRecyclerView);

這樣,我們就實現(xiàn)了我們的需求,我們一起來看看效果:

好了,我們的需求完成了,效果是不是很炫酷,當然大家可以根據(jù)自己的需求做出更炫酷的效果,到時候別忘了與大家一起分享。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • android 仿微信demo——登錄功能實現(xiàn)(移動端)

    android 仿微信demo——登錄功能實現(xiàn)(移動端)

    本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助
    2021-06-06
  • Android實現(xiàn)新手引導(dǎo)半透明蒙層效果

    Android實現(xiàn)新手引導(dǎo)半透明蒙層效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)新手引導(dǎo)半透明蒙層效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Flutter持久化存儲之數(shù)據(jù)庫存儲(sqflite)詳解

    Flutter持久化存儲之數(shù)據(jù)庫存儲(sqflite)詳解

    這篇文章主要給大家介紹了關(guān)于Flutter持久化存儲之數(shù)據(jù)庫存儲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Android基礎(chǔ)之Activity生命周期

    Android基礎(chǔ)之Activity生命周期

    activity類是Android 應(yīng)用生命周期的重要部分。在系統(tǒng)中的Activity被一個Activity棧所管理。當一個新的Activity啟動時,將被放置到棧頂,成為運行中的Activity,前一個Activity保留在棧中,不再放到前臺,直到新的Activity退出為止。
    2016-05-05
  • Android控件之菜單的創(chuàng)建方式

    Android控件之菜單的創(chuàng)建方式

    本文給大家分享android控件菜單的兩種創(chuàng)建方式,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • Android源碼探究之BaseDexClassLoader的使用

    Android源碼探究之BaseDexClassLoader的使用

    今天解決一個插件化問題的時候,竟然發(fā)現(xiàn)SO沒有正常加載,很怪異,最終排查下來發(fā)現(xiàn)竟然是參數(shù)傳入錯誤導(dǎo)致的。這就扯到了本文的標題上了,BaseDexClassLoader中的4個參數(shù)該如何傳入,傳入的又是什么呢
    2022-08-08
  • Android  斷點續(xù)傳的原理剖析與實例講解

    Android 斷點續(xù)傳的原理剖析與實例講解

    這篇文章主要介紹了Android 斷點續(xù)傳的原理剖析與實例講解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android消息推送:手把手教你集成小米推送(附demo)

    Android消息推送:手把手教你集成小米推送(附demo)

    本篇文章主要介紹了Android消息推送:手把手教你集成小米推送,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • Android中WebView加載網(wǎng)頁設(shè)置進度條

    Android中WebView加載網(wǎng)頁設(shè)置進度條

    這篇文章主要為大家詳細介紹了Android中WebView加載網(wǎng)頁設(shè)置進度條的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android Button點擊事件的四種實現(xiàn)方法

    Android Button點擊事件的四種實現(xiàn)方法

    這篇文章主要為大家詳細介紹了Android Button點擊事件的四種實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

星座| 丽江市| 阜城县| 原阳县| 察哈| 高清| 孟州市| 星子县| 如皋市| 广丰县| 子长县| 雅江县| 宽城| 兰溪市| 罗定市| 呼和浩特市| 武宣县| 松江区| 宁南县| 宿迁市| 化隆| 广元市| 秦皇岛市| 汝州市| 马边| 桦甸市| 崇礼县| 运城市| 延吉市| 卢湾区| 天等县| 龙南县| 梧州市| 贺兰县| 拜泉县| 肇源县| 衡水市| 滕州市| 沈阳市| 当涂县| 新平|