0

リストビューを更新して「無限スクロール」を作成しようとしています。何が起こるかというと、最初の 40 件の結果が正常にロードされ、スクロールの一番下に到達すると、次の 40 件の結果が最初の 40 件を置き換えます...

私が望むのは、40 の結果の 2 番目のセットを最初の 40 に追加することです。これにより、無限のリストと、リストの最初にスクロールして戻ることができます。

以下にコードを掲載しています。ありがとうございました!

public class SearchResults extends Activity implements BannerAdListener, OnScrollListener{

    private LinearLayout bottomNav;
    private ListView ringtoneList;
    private int start = 0, num = 40, curPage = 1;
    private Handler handler = new Handler();
    private ProgressDialog progressDialog = null;
    private ArrayList<Ringtone> ringtones;
    private MoPubView moPubView;  
    private String searchString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            // no search string defined
            finish();
        } else {
            searchString = extras.getString("search_string");
        }

        setContentView(R.layout.search_results);    

        ringtoneList = (ListView)findViewById(R.id.ringtone_list);
        ringtoneList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> av, View view, int position, long id) {
                Intent i = new Intent(SearchResults.this, RingtoneView.class);
                i.putExtra("ringtone", ringtones.get(position));
                startActivity(i);
            }
        });

        performSearch();

        moPubView = (MoPubView) findViewById(R.id.adview);
        moPubView.setAdUnitId(Utils.MoPubBannerId);
        moPubView.loadAd();
        moPubView.setBannerAdListener(this);

        ringtoneList.setOnScrollListener(this);

    }

    public void onScroll(AbsListView view, int firstVisible, final int visibleCount, int totalCount) {

            Log.i("List", "firstVisible="+firstVisible+" visibleCount="+visibleCount+" totalCount="+totalCount);

            boolean loadMore = firstVisible + visibleCount >= totalCount;

            if(loadMore) {

                Log.i("List", "Loading More Results");                

                curPage++;
                start = num * (curPage-1);

                new Thread() {

                    public void run() {

                        ringtones = Utils.search(start, num, searchString);

                        if (ringtones != null && ringtones.size() > 0) {

                            handler.post(new Runnable() {
                                public void run() {
                                    ringtoneList.setAdapter(new RingtoneRowAdapter(SearchResults.this, ringtones));
                                }
                            });

                        } else {

                            handler.post(new Runnable() {
                                public void run() {
                                    new AlertDialog.Builder(SearchResults.this)
                                    .setTitle(getResources().getString(R.string.context_info)).setMessage(getResources().getString(R.string.context_noresult))
                                    .setPositiveButton(getResources().getString(R.string.context_ok), null).show();
                                }
                            });

                        }

                    }
                }

                .start();
         }
    }

    public void onScrollStateChanged(AbsListView v, int s) { } 

    private void performSearch() {
        progressDialog = ProgressDialog.show(SearchResults.this, getResources().getString(R.string.loading_message), getResources().getString(R.string.loading_search), true); 
        new Thread() {
            public void run() {
                ringtones = Utils.search(start, num, searchString);
                if (ringtones != null && ringtones.size() > 0) {
                    updateList();
                } else {
                    handler.post(new Runnable() {
                        public void run() {
                            new AlertDialog.Builder(SearchResults.this)
                            .setTitle(getResources().getString(R.string.context_info)).setMessage(getResources().getString(R.string.context_noresult))
                            .setPositiveButton(getResources().getString(R.string.context_ok), null).show();
                            ringtoneList.setVisibility(View.INVISIBLE);
                            bottomNav.setVisibility(View.INVISIBLE);
                        }
                    });
                }
                progressDialog.dismiss();
            }
        }.start();
    }

    private void updateList() {
        handler.post(new Runnable() {
            public void run() {
                //Log.d("search", "ringtones.size() " + ringtones.size());
                ringtoneList.setVisibility(View.VISIBLE);
                ringtoneList.setAdapter(new RingtoneRowAdapter(SearchResults.this, ringtones));
            }
        });
    }

}

助けてください!ありがとうございました!

4

2 に答える 2