关于 Item 无法matchparent 问题,网上其实已经有个答案,就是在onbinviewholder 方法里。你要把inflate方法参数修改一下。就是改成
LayoutInflater.from(context).inflate(getLayoudId(),parent,false)
经过修改发现 改成这样确实可以解决这个问题。那么这个问题的原因是什么 我查了查源码。发现了点不同 这里记录一下。
下面贴源码 源码当中我已经 贴了注释。大家 看的话应该能看明白。
LayoutInflater.from(context).inflate(getLayoudId(),null) 和 LayoutInflater.from(context).inflate(getLayoudId(),parent,false) 最终调用的都是一个方法
publicViewinflate(@LayoutResintresource,@NullableViewGrouproot,booleanattachToRoot) {
finalResources res= getContext().getResources();
if(DEBUG) {
Log.d(TAG,"INFLATING from resource:\""+res.getResourceName(resource) +"\"("
+Integer.toHexString(resource) +")");
}
finalXmlResourceParser parser=res.getLayout(resource);
try{
return inflate(parser,root,attachToRoot);
}finally{
parser.close();
}
接着看 return的 inflate 方法 一下是经过 省略的源码部分 我做了注释 大家看注释就能看到不同 了
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
final Context inflaterContext = mContext;
final AttributeSet attrs = Xml.asAttributeSet(parser);
View result = root;
try {
final String name = parser.getName();
if (TAG_MERGE.equals(name)) {
// 如果是 merge 标签 的 用另一个方法创建
rInflate(parser, root, inflaterContext, attrs, false);
} else {
// 普通布局 的创建 方法
final View temp = createViewFromTag(root, name, inflaterContext, attrs);
ViewGroup.LayoutParams params = null;
// 这里判断了root 是不是 空
if (root != null) {
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// 设置layoutparams 到这里不同了。不传root 是没有设置params的所以
设置的matchparent 应该就不好使了。
temp.setLayoutParams(params);
}
}
// 如果不传 root 那么会执行这里。
if (root == null || !attachToRoot) {
result = temp;
}
}
}
return result;
}
暂时这两个方法不用之处 就在这。但是 listview 的是没有问题的。暂时还没有研究 欢迎研究过的大神来解惑。
}