2012-04-21 69 views
0

我希望任何人都可以帮助我,因为我现在完全失去了。Android。与自定义列表视图中的适配器相关的错误

我做了这个自定义适配器,从给定列表填充列表视图。

问题出在减号&加上按钮。他们都有听众修改textview在1计数取决于哪一个被按下,它也修改源列表。

这是一张图片PIC ilishrate最后的看法。

如果从第一行开始每按一个按钮首先按下按钮,则可以使用其余的缺省问题。但是,如果按下的是其他按钮之一,则应用程序会崩溃。

给出的错误是试图添加+ 1或删除-1的原始名单上的特定列表项时,一个NullPointerException异常。

如果需要更多内容,请询问。感谢您的关注。

公共类MenuListAdapter延伸BaseAdapter {

private Context mContext; 
private int mLayoutResourceId; 

public MenuListAdapter(Context context, int textViewResourceId) { 
    mContext = context; 
    mLayoutResourceId = textViewResourceId; 
} 

public int getCount() { 
    return SavedMenuList.INSTANCE.size(); 
} 

public MenuListItem getItem(int position) { 
    return SavedMenuList.INSTANCE.getItem(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(mLayoutResourceId, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.checkBox = (CheckBox) rowView.findViewById(R.id.confirmation_list_row_check); 
     viewHolder.text = (TextView) rowView.findViewById(R.id.confirmation_list_row_name); 
     viewHolder.minus = (ImageButton) rowView.findViewById(R.id.confirmation_list_row_remove_button); 
     viewHolder.minus.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       MenuListItem item = (MenuListItem) viewHolder.minus.getTag(); 
       SavedMenuList.INSTANCE.removeOneItemCount(item); 
       notifyDataSetChanged(); 
      } 
     }); 
     viewHolder.count = (TextView) rowView.findViewById(R.id.confirmation_list_row_count); 
     viewHolder.plus = (ImageButton) rowView.findViewById(R.id.confirmation_list_row_add_button); 
     viewHolder.plus.setOnClickListener(new OnClickListener() {  
      public void onClick(View v) { 
       MenuListItem item = (MenuListItem) viewHolder.plus.getTag(); 
       SavedMenuList.INSTANCE.addOneItemCount(item); 
       notifyDataSetChanged(); 
      } 
     }); 
     viewHolder.itemid = (TextView) rowView.findViewById(R.id.confirmation_list_row_itemid); 
     viewHolder.typeid = (TextView) rowView.findViewById(R.id.confirmation_list_row_typeid); 
     rowView.setTag(viewHolder); 
    }else{ 
     rowView = convertView; 
     ((ViewHolder) rowView.getTag()).checkBox.setTag(getItem(position)); 
     ((ViewHolder) rowView.getTag()).minus.setTag(getItem(position)); 
     ((ViewHolder) rowView.getTag()).plus.setTag(getItem(position)); 
    } 
    ViewHolder holder = (ViewHolder) rowView.getTag(); 
    MenuListItem item = getItem(position); 

    holder.text.setText(item.getmItemName() + " (" + item.getmItemTypeName() + ")"); 
    holder.count.setText(String.valueOf(item.getmItemCount())); 
    holder.typeid.setText(String.valueOf(item.getmItemId())); 
    holder.typeid.setText(String.valueOf(item.getmItemTypeId())); 

    return rowView; 
} 

static class ViewHolder { 
    public CheckBox checkBox; 
    public TextView text; 
    public ImageButton minus; 
    public TextView count; 
    public ImageButton plus; 
    public TextView itemid; 
    public TextView typeid; 
} 

}

这是错误:

二月4日至22日:54:22.398:E/AndroidRuntime(7112):在GIORGI .betaproject.utils.SavedMenuList.addOneItemCount(SavedMenuList.java:34)

public enum SavedMenuList { 
    INSTANCE; 

    List <MenuListItem> mList = new ArrayList<MenuListItem>(); 

... 
    public boolean addOneItemCount(MenuListItem item) { 
     for (MenuListItem mItem: mList){ 
      if (item.equals(mItem)){ 
       mItem.addOneItemCount(); 
       return true; 
      } 
     } 
     return false; 
    } 
... 
} 
+0

嗯,它已经解决了。 谁能告诉我,为什么它的工作原理与此: '如果(mItem.equals(项))',而不是与 '如果(item.equals(MITEM))'????? – giorgiline 2012-04-22 02:10:34

+0

改变'如果(item.equals(MITEM))''来,如果(mItem.equals(项))'不解决您的问题,它只是隐藏您的问题。 'if(mItem.equals(item))'就像'mItem.equals(null)'一样,它总是返回** false **,显然不是你想要的。答案中提供了解决方案。 – neevek 2012-04-22 10:28:22

回答

0
public boolean addOneItemCount(MenuListItem item) { 
    for (MenuListItem mItem: mList){ 
     if (item.equals(mItem)){ 
      mItem.addOneItemCount(); 
      return true; 
     } 
    } 
    return false; 
} 

在上面的代码item是空的,因为你从来没有在您的getView方法对其进行设置。

viewHolder.plus.setOnClickListener(new OnClickListener() {  
    public void onClick(View v) { 
    MenuListItem item = (MenuListItem) viewHolder.plus.getTag(); 
    SavedMenuList.INSTANCE.addOneItemCount(item); 
    notifyDataSetChanged(); 
    } 
}); 

注意这一行:MenuListItem item = (MenuListItem) viewHolder.plus.getTag();,你从minus视图做getTag(),但你永远在你的代码,这肯定会导致NullPoinaterException做viewHolder.plus.setTag(...)