第八章 使用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按照这个来解决

看上去是端口已经被占用了但是没有启动成功。
有关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。

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

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

意思就是有Button等其它本身就有被点击属性的控件,会使得itemView上的那一片区域失效。
2 thoughts on “Java安卓学习总结(十二)”
ADB可以用一个叫ADB Wifi Connect插件
可以可以,不过我机器日常插得网线。