使用RecyclerView显示列表
步骤一:应用模型层将新增一个CrimeLab对象,该对象是一个数据集中存储池,用来存储Crime对象。将crime数组对象存储在一个单例里。
创建一个CrimeLab类,该类中能够返回并且创建实例。
步骤二:完成CrimeLab的创建之后,向数据集中存储池中存储Crime对象。
步骤三:使用抽象activity托管fragment
首先,需要先创建用于管理list的CrimeListActivity以及相对应的视图。向CrimeListActivity类中添加FragmentManager,与CrimeActivity类中的代码基本重复,所以把这部分的代码单独拿出来复用,新创建一个SingleFragmentActivity的抽象类。
添加了一个createFragment的抽象方法。
完成SingleFragmentActivity类之后,修改主活动的代码继承新类,刚开始修改会报红,只是因为刚开始继承还没有在类中使用,把代码写全了就行了。
新建控制list的CrimeListActivity和视图的CrimeListFragment
步骤四:使用recyclerView类回收和定位屏幕上的view,ViewHolder用来容纳View视图。使用Adapter控制器对象,从模型层获取数据,传送给RecyclerView显示,Adapter创建ViewHolder,然后ViewHolder使用itemView控制View视图。
首先要创建CrimeListFragment视图,这个视图要使用RecyclerView,那就要为RecyclerView类添加依赖库,我的安卓4.0不能像书上那样添加,所你以就百度了,我参考的是第三种方法
参考链接:Android Studio新版本导入Recyclerview库的依赖
然后要在CrimeListFragment类中添加相对应的视图,再把新添加的视图交给LayoutManager管理,(之前的那个是FragmentManager)
步骤五:完成Adapter和ViewHolder的实现
在新创建的list_item_crime.xml文件中新定义了两个textview的id分别是crime_title和crime_date,但是我发现这两个id和前面crime_fragment.xml文件中的id有重复。先记一下。
在CrimeLisFragment视图中添加ViewHolder内部类,创建Adapter。当Crime对象和ViewHolder相关联时,ViewHolder会自动调用Adapter的方法。
添加了ViewHolder之后还不能够直接使用,还需添加一个oncreateviewholder方法来创建layoutinflater,在创建crimeholder
将Adapter和RecyclerView关联起来,添加一个新的updateUI方法,创建CrimeAdapter,然后设置给recyclerview。
步骤六:试运行一下然后是这样的
阿欧出错了,怎么办呢,百度一下。
果然还是需要添加依赖库的,之前参考的博客说什么点一下就好了,骗我。需要在build.gradle中添加一句
implementation 'androidx.recyclerview:recyclerview:1.0.0'
这个就行了,试运行效果
补充:之前漏了一个地方,赶紧记上不然就忘了。才发现原来试运行的截图里,每一个item的内容都是一样的。。。。。。
赶紧绑定列表项,让java代码和组件关联起来。在CrimeHolder中实例化视图组件
然后需要一个bind方法,每次有新的Crime要在CrimeHolder中显示都调用一次。
最后修改Adapter类
步骤:响应点击弄好之后试运行就是这样了
结尾附上所有的源码,方便以后回来看
singleFragmentActivity
package com.bignerdranch.criminalintent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
public abstract class SingleFragmentActivity extends AppCompatActivity {
protected abstract Fragment createFragment();
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
//添加FragmentManager
FragmentManager fm = getSupportFragmentManager();
Fragment fragment= fm.findFragmentById(R.id.fragment_container);
if (fragment == null){
fragment = createFragment();
fm.beginTransaction().add(R.id.fragment_container,fragment).commit();
}
}
}
CrimeListFragment
在这里插入代码片package com.bignerdranch.criminalintent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class CrimeListFragment extends Fragment {
//使用recyclerview布局并找到布局中的视图
private RecyclerView mCrimeRecyclerView;
private CrimeAdapter mAdapter;
@Override//添加对应的视图
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
mCrimeRecyclerView=(RecyclerView)view.findViewById(R.id.crime_recycler_view);
mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateUI();
return view;
}
//添加ViewHolder的内部类,实例化并使用list_item_crime.xml文件
private class CrimeHolder extends RecyclerView.ViewHolder{
public CrimeHolder(LayoutInflater inflater,ViewGroup parent){
super(inflater.inflate(R.layout.list_item_crime,parent,false));
}
}
//创建Adapter
private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder>{
private List<Crime> mCrimes;
public CrimeAdapter(List<Crime> crimes){
mCrimes = crimes;
}
//使用onCreateViewHolder方法,在内部完成LayoutInflater的创建,和CrimeHolder
@Override
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
return new CrimeHolder(layoutInflater, parent);
}
@Override
public void onBindViewHolder(CrimeHolder holder, int position) {
}
@Override
public int getItemCount() {
return mCrimes.size();
}
}
public void updateUI(){
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
}
}
CrimeListActivity
package com.bignerdranch.criminalintent;
import androidx.fragment.app.Fragment;
public class CrimeListActivity extends SingleFragmentActivity{
@Override
protected Fragment createFragment(){
return new CrimeListFragment();
}
}
CrimeLab
package com.bignerdranch.criminalintent;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class CrimeLab {//实例存在使用get方法返回、实例不存在get方法调用构造方法创建实例
//s前缀为静态变量
private static CrimeLab sCrimeLab;
private List<Crime> mCrimes;//创建空list来保存crime对象
public static CrimeLab get(Context context){
if (sCrimeLab == null){
sCrimeLab = new CrimeLab(context);
}
return sCrimeLab;
}
//私有构造方法
private CrimeLab(Context context){
mCrimes = new ArrayList<>();
//生成100个crime
for (int i =0;i<100;i++){
Crime crime = new Crime();
crime.setTitle("Crime #"+i);
crime.setSolved(i %2 ==0);
mCrimes.add(crime);
}
}
//创建getCrimes用来获取整个crime数组
public List<Crime> getCrimes(){
return mCrimes;
}
//创建getCrime用来获取某个UUID
public Crime getCrime(UUID id){
for(Crime crime:mCrimes){
if (crime.getId().equals(id)){
return crime;
}
}
return null;
}
}
CrimeFragment
package com.bignerdranch.criminalintent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioGroup;
import androidx.fragment.app.Fragment;
public class CrimeFragment extends Fragment {
private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckBox;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrime = new Crime();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, container, false);
mTitleField =(EditText)v.findViewById(R.id.crime_title);
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override//用户输入的字符串
public void onTextChanged(CharSequence s, int start, int before, int count) {
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
mDateButton =(Button)v.findViewById(R.id.crime_date);
mDateButton.setText(mCrime.getDate().toString());
mDateButton.setEnabled(false);//禁用button,不响应点击,按钮灰色
//checkbox 按钮
mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mCrime.setSolved(isChecked);
}
});
return v;
}
}
Crime
package com.bignerdranch.criminalintent;
import java.util.Date;
import java.util.UUID;
public class Crime {
private UUID mId;
private String mTitle;
private Date mDate;
private boolean mSolved;
public Crime() {
mId = UUID.randomUUID();
mDate = new Date();
}
public UUID getId() {
return mId;
}
public void setId(UUID id) {
mId = id;
}
public String getTitle() {
return mTitle;
}
public void setTitle(String title) {
mTitle = title;
}
public Date getDate() {
return mDate;
}
public void setDate(Date date) {
mDate = date;
}
public boolean isSolved() {
return mSolved;
}
public void setSolved(boolean solved) {
mSolved = solved;
}
}
Mainactivity
package com.bignerdranch.criminalintent;
import androidx.fragment.app.Fragment;
public class MainActivity extends SingleFragmentActivity {
/*
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
FragmentManager fm= getSupportFragmentManager();//获取fragmentmanager
//添加需要管理的fragment,通过id
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null){//如果获取的fragment为空,就创建一个新的fragment
fragment = new CrimeFragment();
//方法创建并返回fragmenttransaction实例
fm.beginTransaction().add(R.id.fragment_container,fragment).commit();
}
}*/
@Override
protected Fragment createFragment() {
return new CrimeFragment();
}
}
先留一份备份这xml就不放了