Android 从onScrollListener追加ListView

Android 从onScrollListener追加ListView,android,listview,arraylist,Android,Listview,Arraylist,我正在尝试更新我的listview以制作一个“无休止的卷轴”。发生的事情是,前40个结果加载良好,当我到达滚动的底部,接下来的40个结果替换前40个 我想要的是将第二组40个结果添加到前40个结果中,这样我就有了一个无休止的列表,并且能够滚动到列表的开头 我在下面发布我的代码。谢谢大家! public class SearchResults extends Activity implements BannerAdListener, OnScrollListener{ private L

我正在尝试更新我的listview以制作一个“无休止的卷轴”。发生的事情是,前40个结果加载良好,当我到达滚动的底部,接下来的40个结果替换前40个

我想要的是将第二组40个结果添加到前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));
            }
        });
    }

}
public类SearchResults扩展活动实现BannerAdListener、OnScrollListener{
私人线路布局导航;
私有ListView铃声列表;
private int start=0,num=40,curPage=1;
私有处理程序=新处理程序();
private ProgressDialog ProgressDialog=null;
私人ArrayList铃声;
私有MoPubView-MoPubView;
私有字符串搜索字符串;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle extras=getIntent().getExtras();
如果(附加==null){
//未定义搜索字符串
完成();
}否则{
searchString=extras.getString(“搜索字符串”);
}
setContentView(R.layout.search_results);
ringtoneList=(ListView)findViewById(R.id.ringtone\u列表);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图av、视图视图、内部位置、长id){
意图i=新意图(SearchResults.this、RingtoneView.class);
i、 putExtra(“铃声”,ringtones.get(位置));
星触觉(i);
}
});
performSearch();
moPubView=(moPubView)findViewById(R.id.adview);
moPubView.setAdUnitId(Utils.mopubBannid);
moPubView.loadAd();
moPubView.setBannerAdListener(此);
ringtoneList.setOnScrollListener(此);
}
public void onScroll(AbsListView视图、int firstVisible、final int visibleCount、int totalCount){
Log.i(“列表”、“firstVisible=“+firstVisible+”visibleCount=“+visibleCount+”totalCount=“+totalCount”);
布尔loadMore=firstVisible+visibleCount>=totalCount;
如果(加载更多){
Log.i(“列表”,“加载更多结果”);
curPage++;
开始=数量*(第1页);
新线程(){
公开募捐{
ringtones=Utils.search(start、num、searchString);
if(ringtones!=null&&ringtones.size()>0){
handler.post(新的Runnable(){
公开募捐{
设置适配器(新的RingtoneRowAdapter(SearchResults.this,ringtones));
}
});
}否则{
handler.post(新的Runnable(){
公开募捐{
新建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_消息),getResources().getString(R.string.loading_搜索),true);
新线程(){
公开募捐{
ringtones=Utils.search(start、num、searchString);
if(ringtones!=null&&ringtones.size()>0){
updateList();
}否则{
handler.post(新的Runnable(){
公开募捐{
新建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();
设置可见性(视图不可见);
底部导航设置可见性(视图不可见);
}
});
}
progressDialog.disclose();
}
}.start();
}
私有void updateList(){
handler.post(新的Runnable(){
公开募捐{
//Log.d(“搜索”,“ringtones.size()”+ringtones.size());
设置可见性(View.VISIBLE);
设置适配器(新的RingtoneRowAdapter(SearchResults.this,ringtones));
}
});
}
}

请帮忙!谢谢大家!

虽然我不能百分之百确定,但我认为您的问题在于您正在设置一个新的适配器,该适配器只包含加载的铃声部分。这可能与以下代码片段有关:

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));
            }
        });
    }

}
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));
        }
    });

}
你应该在现有铃声的基础上再加上一组,而不是再加上一组全新的铃声。您的
ringtones
变量已经是一个实例变量,因此我确定您是否更改了此行:

ringtones = Utils.search(start, num, searchString);
对下列事项:

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

它可能会解决您的问题。

您的代码有点凌乱,但您的updateList方法正在创建一个新的RingtoneRowAdapter。您应该将项目添加到列表中并调用

mRingtoneRowAdapter.notifyDatasetChanged();
这将告诉适配器获取新视图(如果需要)以及大量内部内容
android:id="@android:id/empty"
public ArrayList<Ringtone> search(final int start, final int num, final String searchString) {

   if ( searchString == null ) {
       //DECIDE WHAT YOU WANT TO DO, EITHER:
       return null;
       // OR YOU CAN RETURN AN EMPTY ARRAY
       return new ArrayList<Ringtone>(); 
    }
   // You should check for these (change according to your rules)
   if (start < 0 ) {
      start = 0; // protect yourself from bad data.
   }
   if ( num < 0 ) {
       num = 0; 
   } 
    /// THE REST OF YOUR search FUNCTION

   return <your array>
}