最近發現一個小伙伴有需要做類似于網易新聞客戶端欄目拖拽添加的這種效果,自己動手做了類似效果,效果圖如下(文章結尾有源碼鏈接): 實現了點擊、長按刪除、添加等功能。其實就是利用RecycleView和ItemTouchHelper這兩個類來實現上面的效果
好了,內容正式開始…… 1、添加依賴包 (app)build.gradle
implementation ‘com.android.support:recyclerview-v7:26.1.0’
2、實現布局 首先,在drawable文件夾下新建tv_bg.xml文件作為樣式文件。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android ="http://schemas.android.com/apk/res/android" android:shape ="rectangle" > <stroke android:width ="1dp" android:color ="#aaa" /> <solid android:color ="#eee" /> <corners android:radius ="5dp" /> </shape >
矩形的shape,stoke為邊框,solid為背景色,corners為圓角矩形的半徑。 其次在layout文件夾下新建item.xml(Recycleview的Item布局)和tv.xml文件(文字效果),具體代碼參詳源碼 3、加載數據 在MainActivity中的onCreate方法中初始化數據initData()方法加載默認數據
@Override
protected void onCreate(Bundle savedInstanceState) {super
.onCreate (savedInstanceState)setContentView(R
.layout .activity _main)mRecycleSelected = (RecyclerView) findViewById(R
.id .recycle _selected)mRecycleUnSelected = (RecyclerView) findViewById(R
.id .recycle _unselected)mFinishedText = (TextView) findViewById(R
.id .tv _finish)initData()initView()initEvent()
}
initView()主要為RecycleView設置LayoutManager以及分割線的功能 4、RecycleViewAdapter的實現 使用過RecycleView的小伙伴都知道,RecyleView自身沒有回調接口,需要我們為其添加,供外部調用,由于SelectedRecycleAdapter和UnSelectedRecycleAdapter代碼類似,就只分析SelectedRecycleAdapter這個類了
public class SelectedRecycleAdapter extends RecyclerView .Adapter <SelectedRecycleAdapter .MyViewHolder >implements ItemTouchHelperCallback .OnItemPositionChangeListener {private List<String> mDatas;
private MainActivity mContext;
public interface OnItemClickListener {void onItemClickListener(MyViewHolder viewHolder,
int pos);
void onItemLongClickListener(MyViewHolder viewHolder,
int pos);}
public interface OnDeleteIconClickListener {void onDeleteIconClick(
int pos);}
private OnItemClickListener mListener;
private OnDeleteIconClickListener mDeleteListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this .mListener = listener;}
public void setOnDeleteIconClickListener(OnDeleteIconClickListener listener) {mDeleteListener = listener;}
public SelectedRecycleAdapter(Context context, List<String> datas) {mDatas = datas;mContext = (MainActivity) context;}@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item, parent,
false );MyViewHolder viewHolder =
new MyViewHolder(itemView);
return viewHolder;}@Override
public void onBindViewHolder(
final MyViewHolder holder,
final int position) {holder.tv.setText(mDatas.get(position));
if (mContext.isDeleteIconsShow()) {holder.ivDelete.setVisibility(View.VISIBLE);}
else {holder.ivDelete.setVisibility(View.INVISIBLE);}holder.ivDelete.setOnClickListener(
new View.OnClickListener() {@Override
public void onClick(View v) {
if (mDeleteListener !=
null ) {mDeleteListener.onDeleteIconClick(holder.getLayoutPosition());}}});
if (mListener !=
null ) {holder.itemView.setOnClickListener(
new View.OnClickListener() {@Override
public void onClick(View v) {mListener.onItemClickListener(holder, position);}});holder.itemView.setOnLongClickListener(
new View.OnLongClickListener() {@Override
public boolean onLongClick(View v) {mListener.onItemLongClickListener(holder, position);
return false ;}});}}@Override
public int getItemCount() {
return mDatas.size();}@Override
public boolean onItemMove(
int fromPos,
int toPos) {Collections.swap(mDatas, fromPos, toPos);notifyItemMoved(fromPos, toPos);
return true ;}
public void addData(String data,
int pos) {mDatas.add(pos, data);notifyItemInserted(pos);}
public void removeData(
int pos) {mDatas.remove(pos);notifyDataSetChanged();notifyItemRemoved(pos);}
class MyViewHolder extends RecyclerView .ViewHolder {TextView tv;ImageView ivDelete;
public MyViewHolder(View itemView) {
super (itemView);tv = (TextView) itemView.findViewById(R.id.tv);ivDelete = (ImageView) itemView.findViewById(R.id.delelte);}}
}
在這個類中我定義了一個接口,OnItemClickListener來實現點擊和長按的監聽效果。 然后在MainActivity中的initEvent()方法實現該接口
mSelectedAdatper.setOnItemClickListener(
new SelectedRecycleAdapter.OnItemClickListener() {
@Override public void onItemClickListener (SelectedRecycleAdapter.MyViewHolder viewHolder,
int pos) {
if (!isDeleteIconsShow) {Toast.makeText(MainActivity.
this , mSelectedDatas.get(pos), Toast.LENGTH_SHORT).show();}}
@Override public void onItemLongClickListener (SelectedRecycleAdapter.MyViewHolder viewHolder,
int pos) {
if (!isDeleteIconsShow) {showAllDeleteIcons();mFinishedText.setVisibility(View.VISIBLE);}}
});
代碼比較簡單那么到此為止就結束了,誒,別走啊你拖拽功能還沒有說怎么實現呢? 5、ItemTouchHelper 還記得上面我所說的一個類嗎?ItemTouchHelper對,沒錯就是這個,根據官方說明如下:
/*** This
is a utility
class to add swipe
to dismiss
and drag & drop support
to RecyclerView.* <p>* 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.* <p>* Depending
on which functionality you support, you should override* {@link Callback* {@link Callback* <p>* 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 * {@link ItemTouchHelper.Callback}
class or implementing {@link ItemTouchHelper.ViewDropHandler}* interface
in your LayoutManager.* <p>* By default, ItemTouchHelper moves
the items' translateX/Y properties
to reposition them. You can* customize these behaviors
by overriding {@link Callback* ViewHolder, float, float, int,
boolean )}*
or {@link Callback*
boolean )}.* <p/>* Most
of the time you only need
to override <code>onChildDraw</code>.*/
大體說的就是:ItemTouchHelper是一個工具類,為RecyclerView提供拖拽、滑動的支持。并且有一個Callback回調類用于處理用戶的action操作 在ItemTouchHelperCallback中的結構圖中我們可以看到以下的一些方法
在此類中我們自定義一個Listener讓SelectedRecycleAdapter實現該監聽方法,這樣我們就根據用戶的拖動的手勢改變數據位置了。 //根據用戶的手勢,交換Adapter數據集中item的位置
@Override
public boolean onItemMove (
int fromPos,
int toPos) {Collections.swap(mDatas, fromPos, toPos);notifyItemMoved(fromPos, toPos);
return true ;
}
6、源碼下載地址: https://github.com/GHpeter/DragRecycleView,覺得不錯的小伙伴給個star或關注一下吧。 最后,還沒有關注我的小伙伴可關注我的公眾號”猿份到 ”
總結
以上是生活随笔 為你收集整理的网易栏目添加功能 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。