对于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) {
}
});