Java ExpandableListView中的Wierd NullPointer异常
因此,我使用以下适配器制作了一个可扩展的listView:Java ExpandableListView中的Wierd NullPointer异常,java,android,expandablelistview,expandablelistadapter,Java,Android,Expandablelistview,Expandablelistadapter,因此,我使用以下适配器制作了一个可扩展的listView: class SubcategoriesAdapter extends BaseExpandableListAdapter { @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View v=co
class SubcategoriesAdapter extends BaseExpandableListAdapter {
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View v=convertView;
if(v==null) v=layoutInflater.inflate(R.layout.tip_view, null, false);
((TextView)v.findViewById(R.id.title)).setText(data.subcategories.get(groupPosition).tips.get(childPosition).title);
((TextView)v.findViewById(R.id.content)).setText(data.subcategories.get(groupPosition).tips.get(childPosition).text);
return v;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public int getGroupCount() {
return data.subcategories.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return data.subcategories.get(groupPosition).tips.size();
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return data.subcategories.get(groupPosition).tips.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public Object getGroup(int groupPosition) {
return data.subcategories.get(groupPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View v=convertView;
Tips.TipsSubcategory me=data.subcategories.get(groupPosition);
if(v==null) v=LayoutInflater.from(getContext()).inflate(R.layout.tips_subcategory_view, null, false);
/* ((TextView)v.findViewById(R.id.title)).setText(me.title);
Picasso.with(getActivity()).load(me.ad_url).into(((ImageView) v.findViewById(R.id.adImageView)));
Picasso.with(getActivity()).load(me.image_url).into((ImageView)v.findViewById(R.id.image)); */
return v;
}
}
当我加载这个包含列表的片段时,我得到以下异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:715)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at biz.energit.cookingfridge.user.fragments.TipsCategory$SubcategoriesAdapter.getGroupView(TipsCategory.java:148)
它指向的这条线,148是我膨胀视图的那条线:
if(v==null) v=LayoutInflater.from(getContext()).inflate(R.layout.tips_subcategory_view, null, false);
我尝试移除I
,传递实际的父对象而不是null
,并从碎片或通过其他方式获取充气器。我不懂
更新:为了防止有人再次遇到这个问题,我不能写一个答案,因为有人将其标记为重复。
问题是使用
您还没有包括适配器构造函数,您将通过它将活动/片段上下文传递给适配器,并且在getGroupView()和getChildView()方法中膨胀视图时将使用相同的上下文。
请包括在内李>
让我为您提供我的工作代码片段
public class AccordionAdapter extends BaseExpandableListAdapter {
private Context mContext = null;
private LayoutInflater mInflater = null;
private ArrayList<SearchBean> mDataList = null;
public AccordionAdapter(Context iContext, ArrayList<SearchBean> iDataList) {
mContext = iContext;
mInflater = LayoutInflater.from(mContext);
mDataList = iDataList;
}
@Override
public Object getChild(int arg0, int arg1) {
return mDataList.get(arg0).getmChilds().get(arg1);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.new_child_item, null);
holder.mTextView = (TextView) convertView
.findViewById(R.id.new_child_itemtxv);
holder.mTextView
.setText(mDataList.get(groupPosition).getmChilds()
.get(childPosition)[0]
+ " - "
+ mDataList.get(groupPosition).getmChilds()
.get(childPosition)[1]);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return mDataList.get(groupPosition).getmChilds().size();
}
@Override
public Object getGroup(int groupPosition) {
return mDataList.get(groupPosition);
}
@Override
public int getGroupCount() {
return mDataList.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.new_group_item, null);
holder.mTextView = (TextView) convertView
.findViewById(R.id.new_grp_itemtxv);
holder.mTextView.setText(mDataList.get(groupPosition).getmGroup());
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
// Data part
class ViewHolder {
private TextView mTextView = null;
}
}
公共类AccordionAdapter扩展了BaseExpandableListAdapter{
私有上下文mContext=null;
私有LayoutInflater mInflater=null;
private ArrayList mDataList=null;
公共手风琴适配器(上下文iContext,数组列表iDataList){
mContext=iContext;
mInflater=LayoutInflater.from(mContext);
mDataList=iDataList;
}
@凌驾
公共对象getChild(int arg0,int arg1){
返回mDataList.get(arg0.getmChilds().get(arg1);
}
@凌驾
公共长getChildId(int-groupPosition,int-childPosition){
返回子位置;
}
@凌驾
公共视图getChildView(int-groupPosition、int-childPosition、,
布尔值isLastChild、视图转换视图、视图组父级){
ViewHolder=新的ViewHolder();
convertView=mInflater.充气(R.layout.new\u child\u item,空);
holder.mTextView=(TextView)convertView
.findViewById(R.id.new\u child\u itemtxv);
holder.mTextView
.setText(mDataList.get(groupPosition.getmChilds)()
.get(childPosition)[0]
+ " - "
+mDataList.get(groupPosition.getmChilds())
.get(childPosition)[1]);
返回视图;
}
@凌驾
公共整数getChildrenCount(整数组位置){
返回mDataList.get(groupPosition.getmChilds().size();
}
@凌驾
公共对象getGroup(int-groupPosition){
返回mDataList.get(groupPosition);
}
@凌驾
public int getGroupCount(){
返回mDataList.size();
}
@凌驾
公共长getGroupId(int-groupPosition){
返回组位置;
}
@凌驾
公共视图getGroupView(int-groupPosition,布尔值isExpanded,
视图(视图、视图组父级){
ViewHolder=新的ViewHolder();
convertView=mInflater.充气(R.layout.new\u group\u item,空);
holder.mTextView=(TextView)convertView
.findViewById(R.id.new\u grp\u itemtxv);
holder.mTextView.setText(mDataList.get(groupPosition.getmGroup());
返回视图;
}
@凌驾
公共布尔表ID(){
返回true;
}
@凌驾
公共布尔值isChildSelectable(int-groupPosition,int-childPosition){
返回true;
}
//数据部分
类视图持有者{
私有文本视图mTextView=null;
}
}
使用的模态类
public class SearchBean {
public String getmGroup() {
return mGroup;
}
public void setmGroup(String mGroup) {
this.mGroup = mGroup;
}
private String mGroup = null;
public ArrayList<String[]> getmChilds() {
return mChilds;
}
public void setmChilds(ArrayList<String[]> mChilds) {
this.mChilds = mChilds;
}
private ArrayList<String[]> mChilds = null;
}
公共类SearchBean{
公共字符串getmGroup(){
返回管理组;
}
公共void setmGroup(字符串mGroup){
this.mGroup=mGroup;
}
私有字符串mGroup=null;
公共数组列表getmChilds(){
返回mChilds;
}
public void setmChilds(ArrayList mChilds){
this.mChilds=mChilds;
}
private ArrayList mChilds=null;
}
为groupview和childview创建两个布局文件,每个文件中有一个textview
使用一些伪数据创建SearchBean的arraylist
然后使用此AccordionAdapter将数据设置为expandablelistview
希望有帮助。适配器类在Fragment类中编写。所以我基本上使用的是fragments布局充气器,我在onCreate期间将其存储在一个实例变量中。您应该使用调试器来了解为什么attrs.getAttributeValue(null,“class”)代码>返回null
。