Android

Java安卓学习总结(十二)

第八章 使用RecyclerView显示列表(2/2)

有关adb.exe start-server’ failed

昨天我在Android Studio启动完毕之前就率先尝试打开ADB,可能导致了进程冲突,反正就是报错:

\android-sdk-windows\platform-tools\adb.exe start-server' failed -- run manually if necessary

按照这个来解决

adb

看上去是端口已经被占用了但是没有启动成功。

有关RecyclerView显示乱序与缓存机制

直接抄过来,查看帖子

有关挑战练习 RecyclerView ViewType

在crime中新增一个变量mRequiresPolice以判断需不需要呼叫警察。

private boolean mRequiresPolice;

public boolean isRequiresPolice() {
return mRequiresPolice;
}

public void setRequiresPolice(boolean requiresPolice) {
mRequiresPolice = requiresPolice;
}

然后创建呼叫警察的ViewHolder极其对应的.xml文件,具体方法同之前是那个。

在Adapter中增加获取ViewType的方法,设置需要叫检查的ViewType=1,否则为0。然后在onCreateViewHolder()中根据ViewType的值来实例出ViewHolder。

在Adapter的onBindViewHolder()方法中,由于传进去的ViewHolder的最近父类RecyclerView.ViewHolder中没有bind方法,必须稍加处理。我使用的是构造一个继承RecyclerView.ViewHolder的抽象类Holder,让两个需要绑定的ViewHolder继承这个类。在Adapter的onBindViewHolder()中传入Holder类实现多态。

private abstract class Holder extends RecyclerView.ViewHolder
    {

        public Holder(View itemView) {
            super(itemView);
        }
        public void bind(Crime crime){}
    }
    private class CrimeHolder extends Holder implements View.OnClickListener
    {
        private TextView mTitleTextVIew;
        private TextView mDateTextVIew;
        
        ...

        public void bind(Crime crime)
        {
            mCrime=crime;
            mTitleTextVIew.setText(mCrime.getTitle());
            mDateTextVIew.setText(mCrime.getDate().toString());
        }

        ...
    }
    private  class CrimePoliceHolder extends Holder implements View.OnClickListener
    {
        private Button mButton;
        private TextView mTitleTextVIew;
        private TextView mDateTextVIew;

        ...

        public void bind(Crime crime)
        {
            mCrime=crime;
            mTitleTextVIew.setText(mCrime.getTitle());
            mDateTextVIew.setText(mCrime.getDate().toString());
        }
}

...

public void onBindViewHolder(Holder holder, int position) {

            Crime crime=mCrimes.get(position);
            holder.bind(crime);
        }

看了CZT做法,原帖,在Adapter的onBindViewHolder()可以传入向上转型的ViewHolder,再根据该Viewholder的ViewType来向下转型来使用对应的bind()方法。

有关itemView上的setOnClickListener()范围

itemView被ViewHolder引用,那么setOnClickListener()响应的鼠标点击事件范围应该是整个itemView。但是实际上运行的时候我发现点击Button时发现只弹出了button的toast,没有弹出itemView的toast。

GIF 2020 6 15 21 19 52

为了方便探究itemView上的setOnClickListener()的响应范围,现暂时删除Button的监听器,并稍微修改视图布局:

itemView

其中打五角星的区域是没有任何控件的,并且与Button属于同一行。如果打五角星的区域能有触发onClick(),说明Button不能触发itemView的监听器是因为Button本身的特性。

实验结果是,确实。。

GIF 2020 6 15 21 45 41

意思就是有Button等其它本身就有被点击属性的控件,会使得itemView上的那一片区域失效。

2 thoughts on “Java安卓学习总结(十二)

发表评论