《Android编程权威指南(第3版)》:8.8挑战练习:RecyclerView ViewType

  • 1、创建带联系警方按钮的新布局

list_item_crime_layour.xml

<?xml version="1.0" encoding="utf-8"?>
<!--列表项视图 -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical"
        >

    <TextView
        android:id="@+id/crime_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Crime Title"
        />

    <TextView
        android:id="@+id/crime_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Crime Date"
        />
    </LinearLayout>

    <Button
        android:id="@+id/police_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="8"
        android:text="@string/Police"
        />



</LinearLayout>
  • 2、在Crime.java中添加新变量mRequirePolie和相应的方法
public class Crime {

......
    private int mRequirePolice;

    public void setRequirePolice(int requirePolice){ mRequirePolice = requirePolice; }

    public int getRequirePolice() { return mRequirePolice; }
}

然后再CrimeLab中使用该变量(假设奇数时需要呼叫警察,只要能区分就行)

    private CrimeLab(Context context){
        mCrimes = new ArrayList<>();
        for (int i = 0; i < 100; i++){
            Crime crime = new Crime();
            crime.setTitle("Crime #" + i);
            crime.setSolved(i % 2 == 0);
            crime.setRequirePolice(i % 2);
            mCrimes.add(crime);
        }
    }
  • 3、创建新的容器用于显示新的视图
    //新建一个ViewHolder
    private class CrimePoliceHolder extends RecyclerView.ViewHolder{
        private TextView mTitleTextView;
        private TextView mDateTextView;
        private Crime mCrime;
        private Button mButton;

        public CrimePoliceHolder(LayoutInflater inflater, ViewGroup parent){
            super(inflater.inflate(R.layout.list_item_crime_police, parent, false));
            mTitleTextView = (TextView)itemView.findViewById(R.id.crime_title);
            mDateTextView = (TextView)itemView.findViewById(R.id.crime_date);
            mButton = (Button)itemView.findViewById(R.id.police_button);
        }

        public void bind(Crime crime){
            mCrime = crime;
            mTitleTextView.setText(mCrime.getTitle());
            mDateTextView.setText(mCrime.getDate().toString());
            mButton.setText(R.string.Police);
        }
    }
  • 4、再CrimeAdapter类中重写getItemView(int)方法 
        @Override
        public int getItemViewType(int postion){
            if (mCrimes.get(postion).getRequirePolice() == 1)
                return 1;
            else
                return 0;
        }
  • 5、根据不同的view type值使用不同的布局,通过修改CrimeAdapter实现

 根据不同的viewtype绑定不同的viewholder

    //创建Adapter
    private class CrimeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
        private List<Crime> mCrimes;

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

        @Override
        //RecyclerView需要新的ViewHolder显示列表时会调用onCreateViewHolder方法
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            if (viewType == 0)
                return new CrimeHolder(layoutInflater, parent);
            else
                return new CrimePoliceHolder(layoutInflater, parent);
        }

        @Override
        //每次RecyclerView需要CrimeHolder绑定对应的Crime时都会调用该方法
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){
            Crime crime = mCrimes.get(position);
            if (getItemViewType(position) == 0)
                ((CrimeHolder)holder).bind(crime);
            else
                ((CrimePoliceHolder)holder).bind(crime);
        }

        @Override
        public int getItemCount(){
            return mCrimes.size();
        }

        @Override
        public int getItemViewType(int postion){
            if (mCrimes.get(postion).getRequirePolice() == 1)
                return 1;
            else
                return 0;
        }
    }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值