安卓recyclerview使用方法:
1、新建一个适配器类继承RecyclerView.Adapter泛型是内部类的ViewHolder,然后重写onCreateViewHolder(返回一个新的ViewHolder对象)、onBindViewHolder(绑定ViewHolder)、getItemCount(此方法返回子项目的条数)方法。
2、新建内部类ViewHolder继承RecyclerView.ViewHolder重写构造方法,用于存储实例对象,加强性能。
原文链接:https://blog.csdn.net/weixin_41127625/article/details/78591272
1,2两点可以在下面的代码中体现:
***//新建一个适配器类继承RecyclerView.Adapter泛型是内部类的ViewHolder***
public class FriendAdapter extends
RecyclerView.Adapter<FriendAdapter.ViewHolder> {
Context context;
List<FriendsModel.Friend> friends;
public FriendAdapter(List<FriendsModel.Friend> friends, Context context){
this.context=context;
this.friends=friends;
}
***//重写onCreateViewHolder(返回一个新的ViewHolder对象)上面虽然写出了ViewHolder类但是还没有生成实例,这里用LayoutInflater加载布局,最后返回ViewHolder***
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_friends,parent,false);
return new ViewHolder(view);
}
***//绑定ViewHolder,这里面有两个参数ViewHolder holder 的holder是你生成的ViewHolder实例, int i 代表目前是哪一行,所以这个方法是来给ViewHolder里面的控件赋值的,会在每个子项被滚动到屏幕内时执行***
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final FriendsModel.Friend friend=friends.get(position);
holder.activityTitleSingle.setText(friend.getName());
if(!friend.getProfileUrl().isEmpty()){
Picasso.with(context).load(friend.getProfileUrl()).networkPolicy(NetworkPolicy.OFFLINE).placeholder(R.drawable.img_default_user).into(holder.activityProfileSingle,new com.squareup.picasso.Callback(){
@Override
public void onSuccess() {
}
@Override
public void onError() {
Picasso.with(context).load(friend.getProfileUrl()).placeholder(R.drawable.img_default_user).into(holder.activityProfileSingle);
}
});
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.startActivity(new Intent(context, ProfileActivity.class).putExtra("uid",friend.getUid()));
}
});
}
***//此方法返回子项目的条数***
@Override
public int getItemCount() {
return friends.size();
}
***//新建内部类ViewHolder继承RecyclerView.ViewHolder重写构造方法,用于存储实例对象,加强性能***
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.activity_profile_single)
CircleImageView activityProfileSingle;
@BindView(R.id.activity_title_single)
TextView activityTitleSingle;
@BindView(R.id.action_btn)
Button actionBtn;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
actionBtn.setVisibility(View.GONE);
}
}
}
关于recyclerview更详细的介绍,以及更多的布局介绍:
链接:https://www.jianshu.com/p/b4bb52cdbeb7
3.经过1,2,我们已经将安卓适配器建立好了,接下来可以直接在activity中setadapter,这里还涉及到LayoutManager,详细内容可以在下面的链接中看到:
https://www.cnblogs.com/todaylovegoaway/p/5166970.html
这次在学习安卓开发的时候,还用到了fragment,并在fragment中设置了适配器,在这里还要加入fragment的知识学习。下面的链接中已经有很详细的fragment使用方法了,分为上下部分:
链接:https://blog.csdn.net/lmj623565791/article/details/37970961
https://blog.csdn.net/lmj623565791/article/details/37992017?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
在这两个链接里,有一个知识点是看了很多遍的:
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。在第二个链接中,作者举的例子是将FragmentOne作replace操作后,再用tx.addToBackStack(null),将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView。另外,作者提到了一种方法:如果不希望视图重绘该怎么做,可以先将当前的Fragment2隐藏后,再添加一个新的Fragment3,然后把Fragment2放到回退栈里。
看完上面的东西,发现自己又有新的东西可以学了,关于屏幕旋转以及屏幕旋转时,数据加载的问题:
链接:https://blog.csdn.net/lmj623565791/article/details/37936275
看完这篇博文后,发现自己真的是菜鸟,其实一直有听过回调的说法,好吧,之前太懒了,今天才知道回调的真正含义,请看链接:
https://www.jianshu.com/p/e61e9665bb7f
public class FriendsFragment extends Fragment {
Context context;
@BindView(R.id.defaultTextView1)
TextView defaultTextView1;
@BindView(R.id.request_title)
TextView requestTitle;
@BindView(R.id.friend_reqst_rcy)
RecyclerView friendReqstRcy;
@BindView(R.id.friend_title)
TextView friendTitle;
@BindView(R.id.friends_rcy)
RecyclerView friendsRcy;
@BindView(R.id.defaultTextView)
TextView defaultTextView;
Unbinder unbinder;
FriendAdapter friendAdapter;
FriendRequestAdapter friendRequestAdapter;
List<FriendsModel.Friend> friends=new ArrayList<>();
List<FriendsModel.Request> requests=new ArrayList<>();
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_friends, container, false);
unbinder= ButterKnife.bind(this,view);
friendAdapter=new FriendAdapter(friends,context);
friendRequestAdapter=new FriendRequestAdapter(requests,context);
LinearLayoutManager linearLayoutManager1=new LinearLayoutManager(context);
LinearLayoutManager linearLayoutManager2=new LinearLayoutManager(context);
//有两个recyclerview
friendReqstRcy.setLayoutManager(linearLayoutManager1);
friendsRcy.setLayoutManager(linearLayoutManager2);
friendsRcy.setAdapter(friendAdapter);
friendReqstRcy.setAdapter(friendRequestAdapter);
return view;
}
@Override
public void onStart() {
super.onStart();
getListData();
}
private void getListData() {
UserInterface userInterface= ApiClient.getApiClient().create(UserInterface.class);
Map<String,String> params=new HashMap<String, String>();
params.put("userId", FirebaseAuth.getInstance().getCurrentUser().getUid());
Call<FriendsModel> call=userInterface.loadFriendsData(params);
call.enqueue(new Callback<FriendsModel>() {
@Override
public void onResponse(Call<FriendsModel> call, Response<FriendsModel> response) {
if(response!=null){
//getFriends方法在FriendsModel里
if(response.body().getFriends().size()>0){
//清除friendslist中的数据
friends.clear();
friends.addAll(response.body().getFriends());
friendAdapter.notifyDataSetChanged();
//当一切处理过程正常,friendtitle正常显示
friendTitle.setVisibility(View.VISIBLE);
}else{
friendTitle.setVisibility(View.GONE);
}
if(response.body().getRequests().size()>0){
requests.clear();
requests.addAll(response.body().getRequests());
friendRequestAdapter.notifyDataSetChanged();
friendTitle.setVisibility(View.VISIBLE);
}else{
requestTitle.setVisibility(View.GONE);
}
if(response.body().getRequests().size()==0&&response.body().getFriends().size()==0){
defaultTextView.setVisibility(View.VISIBLE);
}
}
}
@Override
public void onFailure(Call<FriendsModel> call, Throwable t) {
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
//解绑
unbinder.unbind();
}
@Override
public void onPause() {
super.onPause();
//记得数据更新
requests.clear();
friendRequestAdapter.notifyDataSetChanged();
friends.clear();
friendAdapter.notifyDataSetChanged();
}
}
4.在fragment中设置好adapter后,我们可以在activity中设置fragment了,代码不完整,只放了friendsfragment相关,完整代码中在该活动中,按不同的案件,回转到不同的fragment中,因此写了一个setfragment函数,来进行切换。
public class MainActivity extends AppCompatActivity {
@BindView(R.id.toolbar_title)
TextView toolbarTitle;
@BindView(R.id.search)
ImageView search;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.framelayout)
FrameLayout framelayout;
@BindView(R.id.fab)
FloatingActionButton fab;
@BindView(R.id.bottom_navigation)
BottomNavigationView bottomNavigation;
FriendsFragment friendsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
friendsFragment = new FriendsFragment();
bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.newsfeed_fragment:
setFragment(newsFeedFragment);
break;
case R.id.profile_fragment:
//putextra中放的是要传递的数据
startActivity(new Intent(MainActivity.this, ProfileActivity.class).putExtra("uid", FirebaseAuth.getInstance().getCurrentUser().getUid()));
break;
case R.id.profile_friends:
setFragment(friendsFragment);
break;
case R.id.profile_notification:
setFragment(notificationFragment);
break;
}
return true;
}
});
}
public void setFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();//开启一个事务
fragmentTransaction.replace(R.id.framelayout, fragment);//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
fragmentTransaction.commit();//提交一个事务
}
}