91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

發布時間:2021-08-05 15:10:42 來源:億速云 閱讀:164 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除”這篇文章吧。

CardView的屬性

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

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

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

CardView的基本使用

先看一下效果:

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

這是一個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">
      <!--左側圖片-->
      <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>

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

CardView應用在RecyclerView中

CardView通常會應用在RecyclerView和ListView中,今天我們就講一講如何應用在RecyclerView中。我們現在在大多數應用或者手機系統界面中會見到這樣的效果:

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

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

布局文件

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

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內代碼

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);
    //設置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);
      }
    }
  }
  //制造一個數據源
  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;
  }
}

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

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

ItemTouchHelper

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

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

新建一個接口:

ItemTouchHelperAdapter

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

之后讓Adapter實現這個接口

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) {
      //移除數據
      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中直接調用接口里的方法就可以了。

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

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

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,那么可以執行滑動刪除操作,就是可以調用onSwiped()方法
    return true;
  }
}

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

  1. public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState):從靜止狀態變為拖拽或者滑動的時候會調用該方法,參數actionState表示當前狀態。

  2. public void clearView(RecyclerView recyclerView, ViewHolder viewHolder):當用戶操作完某個item并且動畫也結束后會調用該方法,一般我們在該方法內恢復ItemView的初始狀態,防止由于復用而產生的錯亂問題。

  3. public void onChildDraw(…):我們可以在這個方法內實現我們自定義的交互規則或者自定義動畫。

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

3.為RecyclerView添加ItemTouchHelper

代碼如下:

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

這樣,我們就實現了我們的需求,我們一起來看看效果:

Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除

以上是“Android如何使用CardView作為RecyclerView的Item并實現拖拽和左滑刪除”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赫章县| 应城市| 惠水县| 昌吉市| 芜湖县| 贺兰县| 郯城县| 平湖市| 拉萨市| 瓦房店市| 乐至县| 东山县| 水城县| 静海县| 南丰县| 五家渠市| 佳木斯市| 腾冲县| 纳雍县| 横山县| 炉霍县| 个旧市| 玉林市| 获嘉县| 诸暨市| 甘德县| 龙门县| 铁力市| 专栏| 灵川县| 沈阳市| 岚皋县| 灌南县| 阜平县| 利津县| 九龙城区| 琼海市| 西吉县| 皋兰县| 洪江市| 澄江县|