RecycleView的实现ABCDEFGH步骤

package com.

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class CrimeListFragment extends Fragment {
    private RecyclerView mCrimeRecyclerView;
    private CrimeAdapter mAdapter;

    private static final String TAG = "CrimeListFragment: ";

///


//    /
//    @Override
//    public void onCreate(Bundle saveInstanceState) {
//        super.onCreate(saveInstanceState);
        mCrime = new Crime();
保存和获取数据的Bundle
//        Log.i(TAG, "onCreate: 28");
//    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.i(TAG, "onCreateView: 23 ");

        View view = inflater.inflate(R.layout.fragment_crime_list, container, false);//
        Log.i(TAG, "onCreateView: 25");
        mCrimeRecyclerView = (RecyclerView) view
                .findViewById(R.id.crime_recycler_view);
        Log.i(TAG, "onCreateView: 39");
        mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        Log.i(TAG, "onCreateView:41 ");

//        updateUI();
        Log.i(TAG, "onCreateView: 43");
        return view;
    }
            @Override
        public void onResume(){
            super.onResume();
            updateUI();
        }
//在CrimeListFragment的onResume刷新ui
//    指返回listfragment界面时
//【D】绑定mAdapter与mCrimeRecyclerView
    private void updateUI() {
        CrimeLab crimeLab = CrimeLab.get(getActivity());
        List<Crime> crimes = crimeLab.getCrimes();

        if (mAdapter==null) {
            mAdapter = new CrimeAdapter(crimes);//创建CrimeAdapter
            mCrimeRecyclerView.setAdapter(mAdapter);//设置mAdapter给mCrimeRecyclerView
            Log.i(TAG, "updateUI: ");
        } else {mAdapter.notifyDataSetChanged();
        }
    }

    private class CrimeHolder extends RecyclerView.ViewHolder//ViewHolder只是容纳view视图
            implements View.OnClickListener {//让viewHolder监听用户触摸事件
        //这是一个内部类【A】定义viewholder内部类
        private Crime mCrime;

        private TextView mTitleTextView;
        private TextView mDateTextView;

        private ImageView mSolvedImageView;

        private CrimeHolder(LayoutInflater inflater, ViewGroup parent) {//传入itemview,引用
            super(inflater.inflate(R.layout.list_item_crime, parent, false));//实例化list_item_crime布局
        //【B】实例化list_item_crime布局,并传给super构造方法(CrimeHolder的构造方法)
            itemView.setOnClickListener(this);
    //注册监听器
            Log.i(TAG, "CrimeHolder: ");
    //         【E】   在CrimeHolder构造方法中实例化组件
            mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);//实例化xml控件
            mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);
            mSolvedImageView=(ImageView)itemView.findViewById(R.id.crime_solved);
        }

        public void bind(Crime crime) {//【F】定义bind CrimeHolder 刷新显示crime数据,被recycle调用

            Log.i(TAG, "bind:刷新显示crime数据 ");
            mCrime = crime;
            mTitleTextView.setText(mCrime.getTitle());
            mDateTextView.setText(mCrime.getDate().toString());
            mSolvedImageView.setVisibility(crime.isSolved()?View.VISIBLE:View.GONE);//怎样控制图片显示?二选一
        }

        @Override
        public void onClick(View view) {//【H】点击时弹出toast
//            Toast.makeText(getActivity(),
//                    mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
//                    .show();
//            Intent intent=new Intent(getActivity(),CrimeActivity.class);
            Intent intent= CrimeActivity.newIntent(getActivity(),mCrime.getID());
            Log.i(TAG, "onClick:newIntent, startActivity");//从fragment启动activity
//            实例mCrime的ID是【附加消息】,保存在intent,intent在crimeactivity中
//            crimefragment会从intent中直接或者间接bundle中给到【附加消息】,
//            这里会显示ID具体的犯罪记录,而不是list
            startActivity(intent);//fragment从viewholder通过intent启动CrimeActivity
//            通过getActivity()获取托管该frag的activity
        }
    }
//【C】定义Adapter,实现三个方法
    private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
        //适配recycleview和crmes之间,准确说 沟通RecyclerView和viewholder,创建vieholder
        private List<Crime> mCrimes;

        public CrimeAdapter(List<Crime> crimes) {
            mCrimes = crimes;
        }

        @NonNull
        @Override
        public CrimeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//Recy会调用来该方法创建viewholder,展示列表
//            一个界面内该方法被调用11次,显示11排数据!
//            不断被销毁和创建
//            LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()
//
//            LayoutInflater localinflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//
//            LayoutInflater inflater = LayoutInflater.from(context);
//            LayoutInflater layoutInflater=LayoutInflater().from(getActivity());
            LayoutInflater layoutInflater = getLayoutInflater();//通过layoutInflater创建crimeholder
            Log.i(TAG, "onCreateViewHolder: ");
            return new CrimeHolder(layoutInflater, parent);//recycleView 创建列表时调用该方法
        }

        @Override
        public void onBindViewHolder(@NonNull CrimeHolder holder, int position) {//绑定数据
            Log.i(TAG, "onBindViewHolder: 调用上面的bind方法");
            Crime crime = mCrimes.get(position);
            holder.bind(crime);
//         【G】   调用上面的bind方法,刷新数据

        }

        @Override
        public int getItemCount() {
            return mCrimes.size();
        }//列表总数
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值