日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网易栏目添加功能

發(fā)布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易栏目添加功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近發(fā)現(xiàn)一個小伙伴有需要做類似于網易新聞客戶端欄目拖拽添加的這種效果,自己動手做了類似效果,效果圖如下(文章結尾有源碼鏈接):


實現(xiàn)了點擊、長按刪除、添加等功能。其實就是利用RecycleView和ItemTouchHelper這兩個類來實現(xiàn)上面的效果

好了,內容正式開始……
1、添加依賴包
(app)build.gradle

implementation ‘com.android.support:recyclerview-v7:26.1.0’

2、實現(xiàn)布局
首先,在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的實現(xiàn)
使用過RecycleView的小伙伴都知道,RecyleView自身沒有回調接口,需要我們?yōu)槠涮砑?#xff0c;供外部調用,由于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;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);MyViewHolder viewHolder = new MyViewHolder(itemView);return viewHolder;}@Overridepublic 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() {@Overridepublic void onClick(View v) {if (mDeleteListener != null) {mDeleteListener.onDeleteIconClick(holder.getLayoutPosition());}}});if (mListener != null) {holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mListener.onItemClickListener(holder, position);}});holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {mListener.onItemLongClickListener(holder, position);return false;}});}}@Overridepublic int getItemCount() {return mDatas.size();}//根據用戶的手勢,交換Adapter數據集中item的位置@Overridepublic 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來實現(xiàn)點擊和長按的監(jiān)聽效果。
然后在MainActivity中的initEvent()方法實現(xiàn)該接口

mSelectedAdatper.setOnItemClickListener(new SelectedRecycleAdapter.OnItemClickListener() {@Overridepublic void onItemClickListener(SelectedRecycleAdapter.MyViewHolder viewHolder, int pos) {if (!isDeleteIconsShow) {Toast.makeText(MainActivity.this, mSelectedDatas.get(pos), Toast.LENGTH_SHORT).show();}}@Overridepublic void onItemLongClickListener(SelectedRecycleAdapter.MyViewHolder viewHolder, int pos) {if (!isDeleteIconsShow) {showAllDeleteIcons();mFinishedText.setVisibility(View.VISIBLE);}} });

代碼比較簡單那么到此為止就結束了,誒,別走啊你拖拽功能還沒有說怎么實現(xiàn)呢?
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#onMove(RecyclerView, ViewHolder, ViewHolder)} and / or* {@link Callback#onSwiped(ViewHolder, int)}.* <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#onChildDraw(Canvas, RecyclerView,* ViewHolder, float, float, int, boolean)}* or {@link Callback#onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,* boolean)}.* <p/>* Most of the time you only need to override <code>onChildDraw</code>.*/

大體說的就是:ItemTouchHelper是一個工具類,為RecyclerView提供拖拽、滑動的支持。并且有一個Callback回調類用于處理用戶的action操作
在ItemTouchHelperCallback中的結構圖中我們可以看到以下的一些方法

在此類中我們自定義一個Listener讓SelectedRecycleAdapter實現(xiàn)該監(jiān)聽方法,這樣我們就根據用戶的拖動的手勢改變數據位置了。
//根據用戶的手勢,交換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或關注一下吧。
最后,還沒有關注我的小伙伴可關注我的公眾號”猿份到

總結

以上是生活随笔為你收集整理的网易栏目添加功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。