本文主要是介绍RecyclerView下拉刷新,左滑删除和项目点击事件的监听,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
RecyclerView下拉刷新,左滑删除和项目点击事件的监听
上篇介绍RecyclerView基本用法及通用adapter的配置,可以方便的进行开发,下面基于一些具体需求对RecyclerView进行扩展,本文可实现其配合下啦刷新,左滑删除及点击的监听,代码可直接粘贴使用;
效果图
1.配置gradle这个:
compile 'com.jakewharton:butterknife:5.1.1'compile 'com.android.support:recyclerview-v7:23.1.0'
2.Activity中的XML:
activity_recycler_view_demo.xml <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipeRefreshLayout"android:layout_width="wrap_content"android:layout_height="wrap_content" ><android.support.v7.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerHorizontal="true"android:layout_centerVertical="true"/></android.support.v4.widget.SwipeRefreshLayout></RelativeLayout>
3.ACTIVITY代码:
public class RecyclerViewDemo extends AppCompatActivity implements NormalRecyclerViewAdapter.IonSlidingViewClickListener, SwipeRefreshLayout.OnRefreshListener {@InjectView(R.id.swipeRefreshLayout)SwipeRefreshLayout mSwipeRefreshLayout;private String TAG = "RecyclerViewDemo";@InjectView(R.id.recycler_view)RecyclerView mRecyclerView;NormalRecyclerViewAdapter adapter;private static final int REFRESH_STATUS = 0;private int j = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recycler_view_demo);ButterKnife.inject(this);initView();}private void initView() {mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//这里用线性显示 类似于listview//下面的两种方式自己可以试试看下效果就知道了//mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//这里用线性宫格显示 类似于grid view//mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,OrientationHelper.VERTICAL));//这里用线性宫格显示 类似于瀑布流adapter = new NormalRecyclerViewAdapter(this);//设置Item增加、移除动画mRecyclerView.setItemAnimator(new DefaultItemAnimator());mRecyclerView.setAdapter(adapter);mSwipeRefreshLayout.setOnRefreshListener(this);mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light);mSwipeRefreshLayout.post(new Runnable() {@Overridepublic void run() {mSwipeRefreshLayout.setRefreshing(true);}});onRefresh();}@Overridepublic void onItemClick(View view, int position) {Toast.makeText(RecyclerViewDemo.this, "单击" + position, Toast.LENGTH_SHORT).show();}@Overridepublic void onDeleteBtnCilck(View view, int position) {Toast.makeText(RecyclerViewDemo.this, "删除" + position, Toast.LENGTH_SHORT).show();adapter.removeData(position);}@Overridepublic void onRefresh() {refreshHandler.sendEmptyMessageDelayed(REFRESH_STATUS, 2000);}private Handler refreshHandler = new Handler(){public void handleMessage(Message msg) {switch (msg.what) {case REFRESH_STATUS://下拉刷新执行的操作,刷新数据mSwipeRefreshLayout.setRefreshing(false);List<String> strings = new ArrayList<>();for (int i = 0; i < 10; i++) {j++;strings.add("测试" + j);}adapter.updateData(strings);break;}}};}
4.适配器代码(NormalRecyclerViewAdapter)
public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.MyViewHolder> implements SlidingButtonView.IonSlidingButtonListener {private Context mContext;private IonSlidingViewClickListener mIDeleteBtnClickListener;private List<String> mDatas = new ArrayList<String>();private SlidingButtonView mMenu = null;public NormalRecyclerViewAdapter(Context context) {mContext = context;mIDeleteBtnClickListener = (IonSlidingViewClickListener) context;for (int i = 0; i < 20; i++) {mDatas.add("第"+i+"个测试");}}public void updateData( List<String> mDatas){this.mDatas = mDatas;notifyDataSetChanged();}@Overridepublic int getItemCount() {return mDatas.size();}@Overridepublic void onBindViewHolder(final MyViewHolder holder, int position) {holder.textView.setText(mDatas.get(position)); //设置内容布局的宽为屏幕宽度///获取屏幕信息holder.layout_content.getLayoutParams().width = getScreenWidth(mContext);holder.textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//判断是否有删除菜单打开if (menuIsOpen()) {closeMenu();//关闭菜单} else {int n = holder.getLayoutPosition();mIDeleteBtnClickListener.onItemClick(v, n);}}});holder.btn_Delete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int n = holder.getLayoutPosition();mIDeleteBtnClickListener.onDeleteBtnCilck(v, n);}});}/*** 获取屏幕宽度* @param context* @return*/public static int getScreenWidth(Context context) {WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = manager.getDefaultDisplay();return display.getWidth();}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, arg0,false);MyViewHolder holder = new MyViewHolder(view);return holder;}class MyViewHolder extends RecyclerView.ViewHolder {public TextView btn_Delete;public TextView textView;public ViewGroup layout_content;public MyViewHolder(View itemView) {super(itemView);btn_Delete = (TextView) itemView.findViewById(R.id.tv_delete);textView = (TextView) itemView.findViewById(R.id.text);layout_content = (ViewGroup) itemView.findViewById(R.id.layout_content);((SlidingButtonView) itemView).setSlidingButtonListener(NormalRecyclerViewAdapter.this);}}public void removeData(int position){mDatas.remove(position);notifyItemRemoved(position);}/** * 删除菜单打开信息接收 */@Overridepublic void onMenuIsOpen(View view) {mMenu = (SlidingButtonView) view;}/*** 滑动或者点击了Item监听* @param slidingButtonView*/@Overridepublic void onDownOrMove(SlidingButtonView slidingButtonView) {if(menuIsOpen()){if(mMenu != slidingButtonView){closeMenu();}}}/** * 关闭菜单 */public void closeMenu() {mMenu.closeMenu();mMenu = null;}/** * 判断是否有菜单打开 */public Boolean menuIsOpen() {if(mMenu != null){return true;}return false;}public interface IonSlidingViewClickListener {void onItemClick(View view, int position);void onDeleteBtnCilck(View view, int position);}}
5.适配器的布局
layout_item.xml <?xml version="1.0" encoding="utf-8"?><com.tianqihulian.getui_test.recycleview.SlidingButtonViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp"android:layout_marginBottom="1dp"android:background="@android:color/white"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent" ><RelativeLayoutandroid:id="@+id/layout_content"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:gravity="center_vertical"android:textColor="#DD000000"android:textSize="16dp" /></RelativeLayout><TextViewandroid:id="@+id/tv_delete"android:layout_width="80dp"android:layout_height="match_parent"android:layout_toRightOf="@+id/layout_content"android:background="@color/red"android:gravity="center"android:text="删 除"android:textColor="#DDFFFFFF"/></RelativeLayout></com.tianqihulian.getui_test.recycleview.SlidingButtonView>
6.适配器布局里面我们使用了一个自定义的HorizontalScrollView---SlidingButtonView用来实现左滑删除
public class SlidingButtonView extends HorizontalScrollView {private TextView mTextView_Delete;private int mScrollWidth;private IonSlidingButtonListener mIonSlidingButtonListener;private Boolean isOpen = false;private Boolean once = false;public SlidingButtonView(Context context) {this(context, null);}public SlidingButtonView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SlidingButtonView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.setOverScrollMode(OVER_SCROLL_NEVER);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (!once) {mTextView_Delete = (TextView) findViewById(R.id.tv_delete);once = true;}}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);if (changed) {this.scrollTo(0, 0);//获取水平滚动条可以滑动的范围,即右侧按钮的宽度mScrollWidth = mTextView_Delete.getWidth();}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:if(mIonSlidingButtonListener != null) {mIonSlidingButtonListener.onDownOrMove(this);}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:changeScrollx();return true;default:break;}return super.onTouchEvent(ev);}/*** 按滚动条被拖动距离判断关闭或打开菜单*/public void changeScrollx() {if (getScrollX() >= (mScrollWidth / 2)) {this.smoothScrollTo(mScrollWidth, 0);isOpen = true;mIonSlidingButtonListener.onMenuIsOpen(this);} else {this.smoothScrollTo(0, 0);isOpen = false;}}/*** 打开菜单*/public void openMenu() {if (isOpen) {return;}this.smoothScrollTo(mScrollWidth, 0);isOpen = true;mIonSlidingButtonListener.onMenuIsOpen(this);}/*** 关闭菜单*/public void closeMenu() {if (!isOpen) {return;}this.smoothScrollTo(0, 0);isOpen = false;}public void setSlidingButtonListener(IonSlidingButtonListener listener) {mIonSlidingButtonListener = listener;}public interface IonSlidingButtonListener {void onMenuIsOpen(View view);void onDownOrMove(SlidingButtonView slidingButtonView);}}基于此就可以实现上述功能了 具体需求再根据需求添加即可
这篇关于RecyclerView下拉刷新,左滑删除和项目点击事件的监听的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!