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();
}//列表总数
}
}