簡體   English   中英

使用ListView的事件滾動加載更多數據時出錯

[英]Error when load more data with event scroll of listview

我在滾動列表視圖時遇到問題。 我有一個像這樣的課程:

private int itemsPerPage = 6;
private int count = 0;
private boolean loadingMore = false;
private ArrayList<Item> item;
private ListItemAdapter adapter;
View footerView;
private JSONArray array;
private String json;

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menu);
    lvListItem = (ListView) findViewById(R.id.lvListItem);
    item = new ArrayList<Item>();
    footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_footer, null, false);

    json = new JSONParse()
                    .getData("....");
    array = new JSONArray(json);

    load();
    adapter = new ListItemAdapter(this, 0, item);
    lvListItem.addFooterView(footerView);
    lvListItem.setAdapter(adapter);

    lvListItem.setOnScrollListener(new OnScrollListener() {

        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub

        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
            int lastInScreen = firstVisibleItem + visibleItemCount;

            // is the bottom item visible & not loading more already ? Load
            // more !
            if ((lastInScreen == totalItemCount) && !(loadingMore)) {
                Thread thread = new Thread(null, loadData);
                thread.start();
            }
        }
    });
    }

public void load(){
for (int i = 0; i < itemsPerPage; i++) {
    if (count == array.length()) {
        lvListItem.removeFooterView(footerView);
        break;
    }
    /*****Code to load data*******/
}
}


private Runnable loadData = new Runnable() {
    @Override
    public void run() {

        loadingMore = true;


        item = new ArrayList<Item>();


        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }

        load();


        runOnUiThread(returnRes);

    }
};


private Runnable returnRes = new Runnable() {
    @Override
    public void run() {


        if (item != null && item.size() > 0) {
            for (int i = 0; i < item.size(); i++)
                adapter.add(item.get(i));
        }


        if (count == array.length())
            lvListItem.removeFooterView(footerView);
        adapter.notifyDataSetChanged();

        // Done loading more.
        loadingMore = false;
    }
};

如果我只是使用load() ,它將運行,並且listview顯示數據正常。 但是當我滾動列表視圖時,它會拋出錯誤:

  D/AndroidRuntime(1635): Shutting down VM W/dalvikvm(1635): threadid=1: thread exiting with uncaught exception (group=0x40a13300) E/AndroidRuntime(1635): FATAL EXCEPTION: main E/AndroidRuntime(1635): java.lang.IndexOutOfBoundsException: Invalid index 6, size is 6 E/AndroidRuntime(1635): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) E/AndroidRuntime(1635): at java.util.ArrayList.get(ArrayList.java:304) 

我需要幫助

看來您的數組只有6個元素,並且您正在嘗試訪問索引為6的元素,實際上它是第7個元素,因此

更改

itemsPerPage = 5;` 

您的代碼根本不是線程安全的。 您正在從多個線程訪問共享數據,而沒有任何類型的鎖定。 在從resultRes可運行(在主線程上運行)中讀取item數組時,可能會在工作線程中將item數組重新初始化,這將導致看似不可能的超出范圍的異常。

創建一個用作互斥對象的對象:

private final Object monitor = new Object(); // an ivar in your Activity

然后,當訪問共享數據(例如itemloadingMore )時,創建一個關鍵部分,例如:

synchronized(monitor) {
    item = new ArrayList<Item>();
}

synchronized(monitor) {
    if (item != null && item.size() > 0) {
        for (int i = 0; i < item.size(); i++)
            adapter.add(item.get(i));
    }
}

synchronized(monitor) {
    if ((lastInScreen == totalItemCount) && !(loadingMore)) {
        Thread thread = new Thread(null, loadData);
        thread.start(); // will exit critical section before new thread execution begins
    }
}

等等。 我將把它留作練習,讓您弄清楚應該在哪里進行其余的鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM