recyclerview item点击无效_Android列表布局专题(一)RecyclerView
前言:RecyclerView是Android一個更強大的控件,其不僅可以實現和ListView同樣的效果,還有優化了ListView中的各種不足。
本文目的:通過簡單的例子,講解RecyclerView的使用、自定義RecyclerView子項的點擊事件以及長按事件
本文Demo下載地址:https://github.com/ShaoWangYun/SlideViewDemo
最終效果圖:
一、布局文件:
1.activity_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:padding="15dp" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".recyclerview.RecyclerViewActivity"> android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent">2.recycler_item.xml
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:padding="15dp" android:id="@+id/recycler_item" android:layout_width="match_parent" android:layout_height="wrap_content"> android:id="@+id/image" android:src="@mipmap/ic_launcher_round" android:layout_width="wrap_content" android:layout_height="wrap_content" /> android:id="@+id/text_recycler" android:layout_centerVertical="true" android:layout_toRightOf="@+id/image" android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" />二、數據實體類
public class RecyclerDataBean { private String Index; public String getIndex () { return Index; } public void setIndex (String index) { Index = index; } public RecyclerDataBean (String index) { Index = index; } public RecyclerDataBean () { } @Override public String toString () { return "RecyclerDataBean{" + "Index='" + Index + '\'' + '}'; }}三、適配器
public class RecyclerAdapter extends RecyclerView.Adapter{ public List recyclerDataBeans = new ArrayList<>(); private OnItemClickListener onItemClickListener; private OnItemLongClickListener onItemLongClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public interface OnItemClickListener{ void onItemClick (View view, int position); } public interface OnItemLongClickListener{ void onItemLongClick (View view, int position); } public RecyclerAdapter (List recyclerDataBeans) { this.recyclerDataBeans = recyclerDataBeans; } //創建新View,被LayoutManager所調用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item,viewGroup,false); ViewHolder vh = new ViewHolder(view); return vh; } //將數據與界面進行綁定的操作 @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) { viewHolder.Index.setText("序號:"+recyclerDataBeans.get(position).getIndex()); if(onItemClickListener!=null){ viewHolder.Recycler_item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(viewHolder.itemView,position); } }); viewHolder.Recycler_item.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClickListener.onItemLongClick(viewHolder.itemView,position); return false; } }); } } //獲取數據的數量 @Override public int getItemCount() { return recyclerDataBeans.size(); } public RecyclerDataBean getItem(int index) { return recyclerDataBeans.get(index); } //自定義的ViewHolder,持有每個Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView Index; private RelativeLayout Recycler_item; public ViewHolder(View view){ super(view); Index = view.findViewById(R.id.text_recycler); Recycler_item = view.findViewById(R.id.recycler_item); } }}注:RecyclerView的適配器相對于ListView和GridView是較復雜的,復雜之處在于,RecyclerView給了開發者充分的擴展性,所以對于子項的一些事件比如說OnItemClick、OnItemLongClick等回調方法,需要自己重新定義,此外為了在滑動的時候不必每次都重新創建對象從而提升整體性能,定義使用ViewHolder也是一個常用的解決方案。
四、主界面
public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView recycler_view; private RecyclerView.LayoutManager mLayoutManager; private List recyclerDataBeans = new ArrayList<>(); private RecyclerAdapter recyclerAdapter; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); initView(); } private void initView(){ recycler_view = findViewById(R.id.recycler_view); //創建默認的線性LayoutManager mLayoutManager = new LinearLayoutManager(this); recycler_view.setLayoutManager(mLayoutManager); //如果可以確定每個item的高度是固定的,設置這個選項可以提高性能 recycler_view.setHasFixedSize(true); makeData(); refreshRecyclerView(); } //循環生成一組假數據,作為RecyclerView的子項數據源,后續將會對recyclerDataBeans中的這20條數據進行操作 private void makeData(){ for(int i=0; i<20; i++){ RecyclerDataBean recyclerDataBean = new RecyclerDataBean(); recyclerDataBean.setIndex(String.valueOf(i)); recyclerDataBeans.add(recyclerDataBean); } recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); } //刷新recyclerview private void refreshRecyclerView() { recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); //定義recyclerview的子項點擊事件 recyclerAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Utils.showLog("單擊事件","click!!!"); Utils.showToast(RecyclerViewActivity.this,"您點擊了的子項的序號為:"+recyclerAdapter.getItem(position).getIndex(),0); } }); //定義recyclerview的子項長按時間 recyclerAdapter.setOnItemLongClickListener(new RecyclerAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, final int position) { Utils.showLog("長按事件","click!!!"); AlertDialog.Builder builder = new AlertDialog.Builder(RecyclerViewActivity.this); builder.setTitle("警告"); builder.setCancelable(false); builder.setMessage("你想要刪除序號為 " + recyclerAdapter.getItem(position).getIndex() + " 的數據么?"); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { //獲取position(便于局部刷新recyclerview) int deleteposition = getPositionFromList(recyclerAdapter.getItem(position).getIndex()); //刷新UI recyclerAdapter.notifyItemRemoved(deleteposition); recyclerDataBeans.remove(deleteposition); refreshRecyclerView(); //提示用戶 Utils.showToast(RecyclerViewActivity.this, "刪除成功", 1); } catch (Exception e) { e.printStackTrace(); Utils.showToast(RecyclerViewActivity.this, "刪除失敗", 1); } dialog.dismiss(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }); } //為了避免數據顯示重復,每次初始化時都對RecyclerView進行一次初始化 private void clearRecyclerView(){ recyclerDataBeans = new ArrayList<>(); recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); } //根據studentID獲取該條數據在list中的下標,便于對recyclerview進行局部刷新 private int getPositionFromList(String index){ List list = recyclerDataBeans; for(int i=0;i if(list.get(i).getIndex().equals(index)){ return i; } } return -1; }}五、寫到最后
到這里,基本上把RecyclerView的簡單用法就展示出來了,網上相關的教程和講解也有很多,我這里就不再贅述了,只展示用法和效果,希望能夠盡快的解決您的問題,不勝榮幸。下一期會講解ListView的簡單用法。
最后,歡迎大家在評論區留言。
總結
以上是生活随笔為你收集整理的recyclerview item点击无效_Android列表布局专题(一)RecyclerView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery生成一个li_jquery-
- 下一篇: r生成新的dataframe_2020-