对于RecyclerView来说,网上都有需要做法,但是对于这个RecyclerView来说,其实我们都会发现,其实他并没有一个友好的解决点击的问题,那么今天这边是根据自己的一个例子的记录一下自己对应RecyclerView的一部分理解与使用
这部分是Fragment的代码
public class MyFragment extends BaseFragment { private View mView; private RecyclerView mRecyclerView; private LinearLayoutManager mLinearLayoutManager; private MyListAdapter mMyListAdapter; private List<MyModel> mDatas = new ArrayList<>(); private boolean isIMLogout = false; private boolean isMainLogout = false; private TextView mLogoutTv; private TextView mCarManager; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDatas.add(new MyModel(R.drawable.bottom_tab_my, MyListAdapter.ITEM_TEXT_MORE_TYPE, "个人信息")); mDatas.add(new MyModel(R.drawable.icon_collection, MyListAdapter.ITEM_TEXT_MORE_TYPE, "车辆管理")); mDatas.add(new MyModel(R.drawable.icon_business, MyListAdapter.ITEM_TEXT_MORE_TYPE, "交接事务")); mDatas.add(new MyModel(R.drawable.icon_log, MyListAdapter.ITEM_TEXT_MORE_TYPE, "当班日志")); mDatas.add(new MyModel(R.drawable.icon_manage, MyListAdapter.ITEM_TEXT_MORE_TYPE, "人员管理"));
}
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mView == null) { mView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_my, container, false); mRecyclerView = mView.findViewById(R.id.my_list); mMyListAdapter = new MyListAdapter(); mRecyclerView.setAdapter(mMyListAdapter); mLinearLayoutManager = new LinearLayoutManager(getContext()); mRecyclerView.setLayoutManager(mLinearLayoutManager); mRecyclerView.setAdapter(mMyListAdapter); mMyListAdapter.setItemClickListener(new OnRecyclerViewClickListener() { @Override public void onItemClickListener(View view) { int position = mRecyclerView.getChildAdapterPosition(view); switch (position){ case 0: Toast.makeText(getContext(),"暂时无功能,等待开发",Toast.LENGTH_SHORT).show(); break; case 1: Intent intent = new Intent(getContext(),CarManagerActivity.class); startActivity(intent); break; case 2: Toast.makeText(getContext(),"暂时无功能,等待开发",Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(getContext(),"暂时无功能,等待开发",Toast.LENGTH_SHORT).show(); break; case 4: Toast.makeText(getContext(),"暂时无功能,等待开发",Toast.LENGTH_SHORT).show(); break; } } @Override public void onItemLongClickListener(View view) { } }); mRecyclerView.addItemDecoration(new DividerItemDecoration()); mMyListAdapter.setmDatas(mDatas); mLogoutTv = mView.findViewById(R.id.my_logout);
也就是说我们需要这边设置一个Model,这个model也就是我们自己所用的那个item的信息,这边用一个List<Model>来存放,Model代码可以看下面的代码
public class MyModel { private int type; private String title; private int icon; public int getType() { return type; } public MyModel(int icon, int type, String title) { this.type = type; this.title = title; this.icon = icon; } public void setType(int type) { this.type = type; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } }
MyListAdapter也就是我们自己建立的一个适配器,具体代码可以看下面
public class MyListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public final static int ITEM_TEXT_TYPE = 0; public final static int ITEM_TEXT_MORE_TYPE = 1; private List<MyModel> mDatas; private OnRecyclerViewClickListener listener; public void setItemClickListener(OnRecyclerViewClickListener itemClickListener) { listener = itemClickListener; } public MyListAdapter() { this.mDatas = new ArrayList<>(); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view; // if (getItemViewType(i) == ITEM_TEXT_TYPE) { // view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_my_text_item, viewGroup, false);// // return new TextViewViewHolder(view); // } else { view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_my_text_more_item, viewGroup, false);//这边就是绑定了布局,布局下面有 if(listener != null){ view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onItemClickListener(v); } }); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { listener.onItemLongClickListener(v); return true; } }); } return new TextMoreViewHolder(view); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { if (viewHolder instanceof TextViewViewHolder) { final TextView textView = ((TextViewViewHolder) viewHolder).mTitle; textView.setText(mDatas.get(i).getTitle()); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { textView.setClickable(true); } }); } else if (viewHolder instanceof TextMoreViewHolder) { ((TextMoreViewHolder) viewHolder).mTitle.setText(mDatas.get(i).getTitle());//这边根据frgment那边传过来的东西来设置好数据 ((TextMoreViewHolder) viewHolder).mIcon.setImageResource(mDatas.get(i).getIcon()); } } public void setmDatas(List<MyModel> mDatas) { this.mDatas = mDatas; notifyDataSetChanged(); } @Override public int getItemCount() { return mDatas.size(); } @Override public int getItemViewType(int position) { LogUtils.DebugLog(MyListAdapter.class, String.valueOf(mDatas.get(position).getType())); return mDatas.get(position).getType(); } public class TextViewViewHolder extends RecyclerView.ViewHolder { private TextView mTitle; public TextViewViewHolder(@NonNull View itemView) { super(itemView); mTitle = itemView.findViewById(R.id.my_text_item_title); } } public class TextMoreViewHolder extends RecyclerView.ViewHolder { private TextView mTitle; private ImageView mIcon; public TextMoreViewHolder(@NonNull View itemView) { super(itemView); mTitle = itemView.findViewById(R.id.my_text_more_title);//这边来绑定我们下面设置的那个id mIcon = itemView.findViewById(R.id.my_list_item_icon); } } }
下面的是那个item的形成的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="wrap_content" xmlns:tools="http://schemas.android.com/tools" android:background="#ffffff"> <ImageView android:id="@+id/my_list_item_icon" android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/bottom_tab_my" android:layout_alignParentStart="true" android:layout_centerVertical="true" android:layout_marginStart="18dp"/> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:textColor="#303030" android:id="@+id/my_text_more_title" android:gravity="start|center_vertical" tools:text="个人资料" android:layout_marginStart="8dp" android:layout_toEndOf="@id/my_list_item_icon" /> <TextView android:layout_width="20dp" android:layout_height="20dp" android:background="@drawable/icon_more_1" android:layout_centerVertical="true" android:layout_alignParentEnd="true" android:layout_marginEnd="18dp"/> </RelativeLayout>
以后可以直接复用的
对于进行交流的问题,也就是我们需要来来要说的重点,具体的可以看下面的
①、创建接口类OnRecyclerViewClickListener
public interface OnRecyclerViewClickListener {
void onItemClickListener(View view);
void onItemLongClickListener(View view);
}
②、RecyclerView的Adapter中处理接口
- Adapter中创建方法setItemClickListener()
- private OnRecyclerViewClickListener listener;
public void setItemClickListener(OnRecyclerViewClickListener itemClickListener) {
listener = itemClickListener;
}
- 在Adapter中onCreateViewHolder()方法中将listener注册为Click回调监听
@Override
public FirstViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_first,null);
FirstViewHolder viewHolder = new FirstViewHolder(view);
//接口回调
if(listener != null){
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClickListener(v);
}
});
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listener.onItemLongClickListener(v);
return true;
}
});
}
return viewHolder;
}
- 索引可以通过RecyclerView.getChildAdapterPosition获取到当前点击的Item的列表索引
int position = recyclerView.getChildAdapterPosition(view);
③、在Activity或Fragment中使用
FirstViewAdapter adapter = new FirstViewAdapter(context,strings);
recyclerView.setLayoutManager(new GridLayoutManager(context,2));
//添加Android自带的分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
recyclerView.setAdapter(adapter);
adapter.setItemClickListener(new OnRecyclerViewClickListener() {
@Override
public void onItemClickListener(View view) {
int position = recyclerView.getChildAdapterPosition(view);
switch (position){
case 0:
startActivity(new Intent(context,MainActivity.class));
break;
case 1:
startActivity(new Intent(context,BottomNavigationActivity.class));
break;
case 2:
startActivity(new Intent(context,TopTabActivity.class));
break;
case 3:
startActivity(new Intent(context,ListActivity.class));
break;
case 4:
startActivity(new Intent(context,RecyclerViewActivity.class));
break;
case 5:
startActivity(new Intent(context,RefreshAndLoadMoreActivity.class));
break;
case 6:
startActivity(new Intent(context,TabStopActivity.class));
break;
case 7:
startActivity(new Intent(context,FragmentAndRecyclerActivity.class));
break;
}
}
@Override
public void onItemLongClickListener(View view) {
}
});