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会变呢?以及,怎样使用才能使之不变? 展开
问题代码片段如下:
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会变呢?以及,怎样使用才能使之不变? 展开
2个回答
展开全部
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.XXXX, null);
convertView.findViewById(R.id.xxxx)
试试用第一句来获取VIEW.
还有Adapter中如果不用ConvertView来做缓存,很容易出现内存溢出的
convertView.findViewById(R.id.xxxx)
试试用第一句来获取VIEW.
还有Adapter中如果不用ConvertView来做缓存,很容易出现内存溢出的
更多追问追答
追问
谢谢回答。
用第一句替换了原来的inflate,结果未变,仍然是null。
另外我有用ConvertView作缓存,且可以确信ConvertView未导致溢出(因为总共就4个数据项,可以一次全部显示)
如需要更详细的Log请说明。
追答
检查你的mResource是不是一个Layout里面的XML文件名
那个值不能是ID智能是Layout
话说,为什么不是BaseAdapter?
展开全部
错在这里了:v = mInflater.inflate(resource, parent, false); 而且返回也不是v。
修改:convertView = mInflater.inflate(resource, parent, false); 返回 return convertView ;
修改: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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询