第八章 使用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插件
可以可以,不过我机器日常插得网线。