Android StudioRecyclerView,fragment,adapter的用法

安卓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();//提交一个事务
    }
}

你可能感兴趣的:(android,移动开发)