android编程权威指南第八章-CriminalIntent应用

使用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就不放了

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值