【问题标题】:custom sticky gridview arrayIndexOutOfBound in adapter适配器中的自定义粘性 gridview arrayIndexOutOfBound
【发布时间】:2013-07-20 20:01:40
【问题描述】:

我正在使用下一个自定义网格视图:https://github.com/TonicArtos/StickyGridHeaders

我在接收 ArrayIndexOutOfBound 的适配器中遇到问题。 列表大小为 3,标题数量为 2。 getView() 方法适用于位置 3(第 4 个位置)。

The Exception is:
07-18 01:36:04.574: E/AndroidRuntime(27942): FATAL EXCEPTION: main
07-18 01:36:04.574: E/AndroidRuntime(27942): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.arrayIndexOutOfBoundsException(Vector.java:907)
07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.elementAt(Vector.java:328)
07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.get(Vector.java:442)
07-18 01:36:04.574: E/AndroidRuntime(27942): at fragments.SalesStickyGVAdapter.getItem(SalesStickyGVAdapter.java:39)
07-18 01:36:04.574: E/AndroidRuntime(27942): at fragments.SalesStickyGVAdapter.getView(SalesStickyGVAdapter.java:52)
07-18 01:36:04.574: E/AndroidRuntime(27942): at com.tonicartos.widget.stickygridheaders.StickyGridHeadersBaseAdapterWrapper.getView(StickyGridHeadersBaseAdapterWrapper.java:179)
07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.AbsListView.obtainView(AbsListView.java:2159)
07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.makeAndAddView(GridView.java:1341)
07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.makeRow(GridView.java:341)

我在适配器中的代码是:

public class SalesStickyGVAdapter extends BaseAdapter implements StickyGridHeadersBaseAdapter 
{
private Context mContext;
private Vector items;
private String [] headers;

public SalesStickyGVAdapter(Context mContext, String [] headers, Vector<SaleObj> sales)
{
    this.mContext = mContext;
    this.items = sales;

    this.headers = headers;
}

@Override
public int getCount()
{       
    return items.size();
}

@Override
public SaleObj getItem(int position) 
{   
    return items.get(position);
}

@Override
public long getItemId(int position) 
{       
    return items.get(position).hashCode();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{       
    ChildView holder;
    SaleObj currentSaleObj = getItem(position);

    if(convertView == null)
    {
        holder = new ChildView();
        convertView = LayoutInflater.from(mContext).inflate(R.layout.sale_row_child_layout, null);
        holder.tvPubName = (RobotoTextView)convertView.findViewById(R.id.tv_sale_pub_name);
        holder.tvSaleDescription = (RobotoTextView)convertView.findViewById(R.id.tv_sale_description);

        convertView.setTag(holder);
    }
    else
    {
        holder = (ChildView)convertView.getTag();
    }

    //get the pub name
    holder.tvPubName.setText(App.pubById.get(currentSaleObj.pubSaleRelation.toString()).pubName);
    holder.tvSaleDescription.setText(currentSaleObj.saleDescription);

    return convertView;
}

private class ChildView
{
    private RobotoTextView tvPubName;
    private RobotoTextView tvSaleDescription;
}

@Override
public int getCountForHeader(int position) 
{       
    int RetVal = 0;
    try 
    {
        boolean isSaleTemp = getItem(position).isTemporarySale;
        if(isSaleTemp)
        {
            RetVal = App.salesByType.get(headers[0]).size();
        }
        else
        {
            RetVal = App.salesByType.get(headers[1]).size();
        }
    }
    catch (Exception e) {}
    return RetVal;
}

@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) 
{       
    HeaderView holder;
    String currentHeader = headers[position];
    if(convertView == null)
    {
        holder = new HeaderView();
        convertView = LayoutInflater.from(mContext).inflate(R.layout.sales_header_view, null);
        holder.tvHeader = (RobotoTextView)convertView.findViewById(R.id.tv_header_text);

        convertView.setTag(holder);
    }
    else
    {
        holder = (HeaderView)convertView.getTag();
    }

    holder.tvHeader.setText(currentHeader);     

    return convertView;
}

private class HeaderView
{
    private RobotoTextView tvHeader;
}

@Override
public int getNumHeaders()
{
    int RetVal = 0;
    try
    {
        RetVal = App.salesByType.keySet().size();
    }
    catch (Exception e) {}
    return RetVal;
}
}

我将不胜感激。 谢谢大家。

【问题讨论】:

    标签: android gridview android-adapter


    【解决方案1】:

    问题出在这个方法上:

    @Override
    public int getCountForHeader(int position) 
    {       
        int RetVal = 0;
        try 
        {
            boolean isSaleTemp = getItem(position).isTemporarySale;
            if(isSaleTemp)
            {
                RetVal = App.salesByType.get(headers[0]).size();
            }
            else
            {
                RetVal = App.salesByType.get(headers[1]).size();
            }
        }
        catch (Exception e) {}
        return RetVal;
    }
    

    我应该做的是:

    @Override
    public int getCountForHeader(int position) 
    {       
        int RetVal = 0;
        try 
        {
           RetVal = App.salesByType.get(headers[position]).size()
        }
        catch (Exception e) {}
        return RetVal;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多