2 lijian0927 LIJIAN0927 于 2017.01.07 10:35 提问

android数组越界问题 怎么处理越界了

public class MyHorizontalScrollView extends HorizontalScrollView {
private int subChildCount = 0;
private ViewGroup firstChild = null;
private int downX = 0;
public int currentPage = 0;
int paddle;
private ArrayList pointList = new ArrayList();

public MyHorizontalScrollView(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public MyHorizontalScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyHorizontalScrollView(Context context) {
    super(context);
    init();
}

private void init() {
    setHorizontalScrollBarEnabled(false);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    receiveChildInfo();
}

public void receiveChildInfo() {

    firstChild = (ViewGroup) getChildAt(0);
    if (firstChild != null) {
        subChildCount = firstChild.getChildCount();
        for (int i = 0; i < subChildCount; i++) {
            if (((View) firstChild.getChildAt(i)).getWidth() > 0) {
                Log.i("hx",
                        "MyHorizontalScrollView---->receiveChildInfo:"
                                + i
                                + "  "
                                + ((View) firstChild.getChildAt(i))
                                        .getLeft());
                pointList.add(((View) firstChild.getChildAt(i)).getLeft());
            }
        }
    }

}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        downX = (int) ev.getX();
        Log.i("hx", "onInterceptTouchEvent---->ACTION_DOWN::" + downX);
        break;
    }
    return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // Log.i("PLJ", "MyHorizontalScrollView---->ACTION_DOWN::"+downX);
        break;
    case MotionEvent.ACTION_MOVE: {

    }
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL: {
        if (currentPage == 0) {
            paddle = getWidth() / 5;
        } else {
            paddle = getWidth() / 10;
        }
        if (Math.abs((ev.getX() - downX)) > paddle) {
            if (ev.getX() - downX > 0) {
                Log.i("hx", "MyHorizontalScrollView---->ACTION_UP:111:"
                        + (ev.getX() - downX) + "   " + ev.getX() + "   "
                        + downX + "  " + getWidth() + "  " + paddle);
                smoothScrollToPrePage((int) Math.abs((ev.getX() - downX)));
            } else {
                Log.i("hx", "MyHorizontalScrollView---->ACTION_UP:222:"
                        + (ev.getX() - downX) + "   " + ev.getX() + "   "
                        + downX + "  " + getWidth() + "  " + paddle);
                smoothScrollToNextPage((int) Math.abs((ev.getX() - downX)));
            }
        } else {
            Log.i("hx",
                    "MyHorizontalScrollView---->ACTION_UP:333:"
                            + (ev.getX() - downX) + "   " + ev.getX()
                            + "   " + downX + "  " + getWidth() + "  "
                            + paddle);
            smoothScrollToCurrent();
        }
        return true;
    }
    }
    return super.onTouchEvent(ev);
}

/** 当前页 **/
private void smoothScrollToCurrent() {
    smoothScrollTo(pointList.get(currentPage), 0);
}

/** 上一页 **/
private void smoothScrollToPrePage(int intPre) {
    Log.i("hx", "MyHorizontalScrollView---->smoothScrollToPrePage:111:"
            + (currentPage > 0) + "  " + currentPage);
    if (currentPage > 0) {
        currentPage -= Zoom(intPre);
        if (currentPage < 0) {
            currentPage = 0;
        }
        /* currentPage--; */Log.i("hx",
                "MyHorizontalScrollView---->smoothScrollToPrePage:222:"
                        + currentPage + "   " + pointList.get(currentPage));
        smoothScrollTo(pointList.get(currentPage), 0);
    }
}

// private int PreZoom(int intPre){
// int page = 0;
// for(int i=0;i<pointList.size();i++){
// if((pointList.get(i+1) > intPre) && (intPre > pointList.get(i))){
// //if(i != 0){
// page = i+1;
// //}
// break;
// }
// } Log.i("PLJ", "MyHorizontalScrollView---->PreZoom:"+intPre+"  "+page);
// return page;
// }

/** 下一页 **/
private void smoothScrollToNextPage(int intNext) {
    Log.i("hx", "MyHorizontalScrollView---->smoothScrollToNextPage:111:"
            + (currentPage < subChildCount - 1) + "  " + currentPage
            + "   " + (subChildCount - 1));
    if (currentPage < subChildCount - 1) {
        currentPage += Zoom(intNext);
        if (currentPage > subChildCount - 1) {
            currentPage = subChildCount - 1;
        }
        /* currentPage++; */Log.i("hx",
                "MyHorizontalScrollView---->smoothScrollToNextPage:222:"
                        + currentPage + "   " + pointList.get(currentPage));
        smoothScrollTo(pointList.get(currentPage), 0);
    }
}

private int Zoom(int intNext) {
    int page = 0;
    for (int i = 0; i < pointList.size(); i++) {
        if (!pointList.isEmpty()) {
            Log.i("hx", "pointList:isEmpty" + i);
        if ((pointList.get(i + 1) + 20 > intNext)
                && (intNext > pointList.get(i) + 20)) {
            Log.i("hx", "pointList.get(i + 1) : " + pointList.get(i + 1) + 20 +" : "+ intNext);

// if(i != 0){
page = i + 1;
Log.i("hx", "page = i + 1 : " + page);
// }
break;
}
}
}
Log.i("hx", "MyHorizontalScrollView---->Zoomm:" + intNext + " "
+ page);
return page;
}
说我Zoom方法里面的if那一行的list越界了 请问如何做处理

2个回答

u011686167
u011686167   2017.01.07 14:08

if ((pointList.get(i + 1) + 20 > intNext),这里i+1导致的。因为数组下标是从0开始的,在遍历时,到了最后一个,pointList.get(i + 1) 变成调用数组最后一个的下一个,引起越界。如果你一定要这样写,需要加上判断是否为数组最后一个。如果不是最后一个,才调用if这个语句。

LIJIAN0927
LIJIAN0927 那我怎么判断他是不是最后一个?
一年多之前 回复
u011686167
u011686167   2017.01.07 19:43

if(i != (pointList.size()-1)) { //不是最后一个
...
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
解决Android时时更新listview数组越界问题
解决Android时时更新listview数组越界问题   时时更新数据一般出现在金融、股票行业对数据的准确性要求极高情况下使用。 先来看看下面一段代码, 1 public class MainActivity extends Activity { 2 private RecyclerView listview; 3 private boole
解决数组越界问题
在数组的操作中难免会出现数组的越界问题,尤其是在我们用For循环对数组遍历又要删除数组元素的时候更容易出现数组越界的问题,我在找的过程中用到了OC的遍历数组的方法之后,发现没有再出现数组的越界问题,程序也不再闪退,下面的是我的代码//_RemoveArray是你要遍历的数组 [_RemoveArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NS
Java数组越界问题
测试了 好久 总有错误,后来才发现是数组越界了 分享一下,希望能对大家有帮助 //时间:2013.10.30 //程序功能: 对学生成绩排序并且对应输出  //通过两个数组分别存储名字 和 成绩  然后降序排列输出 import java.util.Scanner; public class StudentSort { public static void main(S
iOS中防止数组越界之后发生崩溃
在iOS开发中有时会遇到数组越界的问题,从而导致程序崩溃。为了防止程序崩溃,我们就要对数组越界进行处理。通过上网查资料,发现可以通过为数组写一个分类来解决此问题。 基本思路:为NSArray写一个防止数组越界的分类。分类中利用runtime将系统中NSArray的对象方法objectAtIndex:替换,然后对objectAtIndex:传递过来的下标进行判断,如果发生数组越界就返回nil,如果
iOS 数组越界 Crash处理经验
彻底解决数组越界 -[__NSArrayI objectAtIndex:]: index 100 beyond bounds [0 .. 1]' 错误。
C++字符数组越界问题的一个案例分析
我的学生yang1067155909给我来信,说的是C++第11周项目3 - CEmployee类继承自CPerson类中的一个细节:贺老师:  老师,m_szDepartment=new char[strlen(department)+1];为何需要+1呢?在测试里去掉+1后和这个效果一样啊,不太明白……求指教……  学生,杨腾飞  我回答:  要给'\0'占个座。是用别人的地盘(越界的部分)保
关于数组越界的一些保护措施
不知道你有没有发现过即使你有时数组越界也不会引发错误。。。这是为什么呢? 当你在程序中连续申请两块内存时,有没有认真计算过返回的地址加上申请大小是不是等于第二次申请后返回的地址? 这个正是操作系统防止程序员数组访问越界做出的一些调整。。。操作系统每次会在你申请的内存后面保留些许字节来防止这种危险行为。 下面是一个小小的测试 #include #include int main() { i
字符串初始化与数组越界问题。
string p1="abcd"; char *p2="abcd"; char p3[]="abcd";  //sizeof(p3)=5; 字符串结尾都有系统自动补‘\0’,可用作判断字符串结束标志 char p4[4]="abcd";//在定义时系统提示字符太长编译不通过。 字符数组并不要求最后一个字符为'\0'.是否加入'\0',完全由系统需要决定。但是字符数组初试化要求最后
Android 重写 getViewTypeCount()数组越界异常
这是我第一篇博客文章,排版那么浪费精力的事我从来不干~ 进入正题~ 由于自定义listview和多种item布局的需求,我一如既往的在我的适配器中重写了 getViewTypeCount()、getItemViewType(int position)、getView()等方法 在getView()中通过对不同类型值的item进行不同的布局处理,代码片段如下: @Override
android 二级列表 expandablelistview 下标越界的解决
expandablelistview 下标越界的完美解决,虽然我投机取巧了。。。。。。