安卓:无尽的滚动 - ListView和光标光标、ListView

2023-09-05 11:26:16 作者:千年屌丝

我的数据库表,我要在列表视图显示〜15000行。我想显示第100时,应安装在用户向下滚动到最后一个项目的下一个100(一...等)。我已在OnScrollListener()的调用AsyncTask的负责加载更多的项目来实现。我有问题是,经过行添加到游标我SimpleCursorAdapter没有更新。我曾尝试adapter.notifyDataSetChanged();但是,这并不做任何事情。

I have DB table with ~15,000 rows which I want to display in the listview. I want to display first 100 and when the user scrolls down to the last item the next 100 should be loaded (an so on...). I have implemented on OnScrollListener() which calls AsyncTask responsible for loading more items. The problem I've got is that my SimpleCursorAdapter is not updated after more rows are added to the cursor. I have tried adapter.notifyDataSetChanged(); but that doesn't do anything.

这是列表监听器:

    myListView.setOnScrollListener(new OnScrollListener(){
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if(resultCursor != null){
                if(lastInScreen == totalItemCount && isLoadingMore == false){
                    isLoadingMore = true;
                    loadedPage ++;
                    new LoadBooks().execute();
                }
            }
        }
        public void onScrollStateChanged(AbsListView view, int scrollState) {}
    });

这是我的AsyncTask类:

This is my AsyncTask class:

private class LoadBooks extends AsyncTask<String, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(FullIndex.this);

    @Override
    protected void onPreExecute() {
       this.dialog.setMessage("Loading books...");
       this.dialog.show();
    }

    @Override
    protected Void doInBackground(String... arg0) {
        try{
            resultCursor = dbHelper.fetchBooks(0, loadedPage * LIMIT_RESULTS);
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(final Void unused){
        if(resultCursor != null){
            if(adapter == null){
                startManagingCursor(resultCursor);
                String[] from = new String[]{"name"};
                int[] to = new int[]{R.id.book_item_tbx};
                getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
                adapter = new SimpleCursorAdapter(FullIndex.this, R.layout.book_item, resultCursor, from, to);
                setListAdapter(adp);
            }else{
                adapter.notifyDataSetChanged();
            }
        }
        if(dialog != null && dialog.isShowing()){
            dialog.dismiss();
        }
        isLoadingMore = false;
    }
}

新行添加到resultCursor但列表不会被更新,我缺少什么?

New rows are added to resultCursor but the list is not updated, what am I missing?

推荐答案

我会后我所用填充10个记录每个上滚动事件code。

I will post a code which I have used to populated 10 records each on scroll event.

  /**
     * Called when the activity is first created.
     * 
     * @param savedInstanceState
     *            the saved instance state
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.view_checkin_checkout_history);

             Thread thread = new Thread() {

            public void run() {

                       synchronized (this) {
                    fetchHistory(0);

                    handler.post(new Runnable() {
                        public void run() {
                            pd.dismiss();

                            displayUI();
                        };
                    });
                }
            }
        };

        thread.start();
         }

       /**
     * Display the check in check out history list.
     */
    private void displayUI() {
        if ((checkInCheckOutHistoryList != null)
                && (checkInCheckOutHistoryList.size() > 0)) {
            historyArrayList = new ArrayList<HashMap<String, String>>();

            histroyListAdapter = new SimpleAdapter(
                    ViewCheckInCheckOutHistory.this, historyArrayList,
                    R.layout.multi_colummn_list_text_style_small, new String[] {
                            "assetTag", "gif" , "action", "actionTime"},
                    new int[] { R.id.list_content_column1,
                            R.id.list_content_imagecolumn,
                            R.id.list_content_column3,
                            R.id.list_content_column4});

            // To add more items to list view on scroll event.
            historyListView.setOnScrollListener(new OnScrollListener() {

                @Override
                public void onScrollStateChanged(AbsListView view,
                        int scrollState) {
                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {

                    int lastInScreen = firstVisibleItem + visibleItemCount;

                    if ((lastInScreen == totalItemCount) && !(loadingMore) && (lastInScreen < totalHistoryItemCount)) {

                        if (!firstInstance) {
                            openSlider();                           
                        }                           

                        fetchHistory(lastInScreen);     

                        Thread thread = new Thread(null, loadMoreListItems);
                        thread.start();
                    }
                }
            });
                     }
                  }

// Runnable to load the items

    private Runnable loadMoreListItems = new Runnable() {

        @Override
        synchronized public void run() {
            // Set flag so we cant load new items 2 at the same time
            loadingMore = true;

            HashMap<String, String> historyObjectMap;

            for (CheckInCheckOutHistory checkOutHistoryObj : checkInCheckOutHistoryList) {
                historyObjectMap = new HashMap<String, String>();
                historyObjectMap.put("assetTag",
                        checkOutHistoryObj.getAssetTag());
                historyObjectMap.put("action", checkOutHistoryObj.getAction());
                historyObjectMap.put("actionTime",
                        checkOutHistoryObj.getActionDate());

                if (checkOutHistoryObj.getAction().equals("Checked out")) {
                    historyObjectMap.put("gif", R.drawable.radio_button_yellow
                            + "");
                } else {
                    historyObjectMap.put("gif", R.drawable.radio_button_green
                            + "");
                }

                historyArrayList.add(historyObjectMap);
            }

            runOnUiThread(returnRes);
        }
    };

    // Since we cant update our UI from a thread this Runnable takes care of
    // that!
    private Runnable returnRes = new Runnable() {
        @Override
        public void run() {

            // Add the new items to the adapter
            if (historyArrayList != null && historyArrayList.size() > 0) {
                histroyListAdapter.notifyDataSetChanged();
            }

            if (firstInstance) {
                historyListView.setAdapter(histroyListAdapter);
                firstInstance = false;
            }

            historyListLayout.setVisibility(View.VISIBLE);

            // Done loading more.
            loadingMore = false;

            if ((slidingDrawer.isOpened()) && (!loadingMore)) {

                handler.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        slidingDrawer.close();
                        slidingDrawer.setVisibility(View.GONE);
                    }
                }, 1000);

            }
        }
    };

fetchHistory(诠释计数)是我用来设置值的方法 totalHistoryItemCount &放大器; checkInCheckOutHistoryList

fetchHistory(int count) is the method I have used to set the values for totalHistoryItemCount & checkInCheckOutHistoryList.

希望这会有所帮助。

 
精彩推荐
图片推荐