Android ListView自定义Adapter的布局无法inflate

问题描述:我想做一个Adapter其作用是在原有SimpleAdapter基础上能显示RatingBar,但现在遇到一个问题,就是getView方法里inflate时得到... 问题描述:我想做一个Adapter其作用是在原有SimpleAdapter基础上能显示RatingBar,但现在遇到一个问题,就是getView方法里inflate时得到的view,经排查其值不为空,但无法通过它findViewById
问题代码片段如下:
public View getView(int position, View convertView, ViewGroup parent) {
return createViewFromResource(position, convertView, parent, mResource);
}

private View createViewFromResource(int position, View convertView,
ViewGroup parent, int resource) {
View v;
Log.d("begins", "createViewFromResource");
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
//此处得到的view,无法访问其组件,提示nullPointerException

final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];

for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}

v.setTag(holder);
} else {
v = convertView;
}
bindView(position, v);
Log.d("ends", "createViewFromResource");
return v;
}

整体代码参考:http://www.cnblogs.com/hellope/archive/2011/08/02/2124774.html 我是在这基础上修改的
我未加说明处请一定参考我给出的网址,如需要可问我索取完整Adapter代码,在您的IDE上试运行。(我的环境是ADT22.2,target是Android 4.2 API18)

会出现null的原因是在inflate后得到的layout,其组件的viewId已经变了,所以通过findViewById得不到组件,但是为什么组件ID会变呢?以及,怎样使用才能使之不变?
展开
 我来答
屮逆光屮
2014-04-15
知道答主
回答量:17
采纳率:0%
帮助的人:7.7万
展开全部
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.XXXX, null);

convertView.findViewById(R.id.xxxx)

试试用第一句来获取VIEW.

还有Adapter中如果不用ConvertView来做缓存,很容易出现内存溢出的
更多追问追答
追问
谢谢回答。

用第一句替换了原来的inflate,结果未变,仍然是null。

另外我有用ConvertView作缓存,且可以确信ConvertView未导致溢出(因为总共就4个数据项,可以一次全部显示)

如需要更详细的Log请说明。
追答
检查你的mResource是不是一个Layout里面的XML文件名

那个值不能是ID智能是Layout

话说,为什么不是BaseAdapter?
wds0422024
2014-04-15
知道答主
回答量:7
采纳率:0%
帮助的人:5.8万
展开全部
错在这里了:v = mInflater.inflate(resource, parent, false); 而且返回也不是v。

修改:convertView = mInflater.inflate(resource, parent, false); 返回 return convertView ;
更多追问追答
追问
呃。。这里没错,请看我定义的局部变量View v。

另外为防止我先入为主,按您的建议修改过,也提示null。。。
追答
public View getView(int position, View convertView, ViewGroup parent) {
return createViewFromResource(position, convertView, parent, mResource);
}

private View createViewFromResource(int position, View convertView,
ViewGroup parent, int resource) {
View v;
Log.d("begins", "createViewFromResource");
if (convertView == null) {
//v = mInflater.inflate(resource, parent, false);
convertView = mInflater.inflate(resource, parent, false);
v.组件 = (类型) convertView.findViewById(.....);写成这样呢?我就是这么用的,v组件可以获取id
//此处得view无法访问其组件提示nullPointerException

final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];

for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}

v.setTag(holder);
} else {
v = convertView;
}
bindView(position, v);
Log.d("ends", "createViewFromResource");
return convertView;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式