Android Listview loadmore on scroll执行三次
我有一个在CrollListener上实现的listview,因此当列表到达底部时,将加载更多数据。但在我的例子中,列表加载数据不止一次(三次),我找不到导致这种情况的原因。有人能帮帮我吗 代码如下:Android Listview loadmore on scroll执行三次,android,android-listview,android-asynctask,onscroll,Android,Android Listview,Android Asynctask,Onscroll,我有一个在CrollListener上实现的listview,因此当列表到达底部时,将加载更多数据。但在我的例子中,列表加载数据不止一次(三次),我找不到导致这种情况的原因。有人能帮帮我吗 代码如下: public class GameListing extends FragmentActivity implements OnScrollListener { private ListView list; private GameListingAdapter adapter;
public class GameListing extends FragmentActivity implements OnScrollListener {
private ListView list;
private GameListingAdapter adapter;
private ArrayList<Game> games;
private TextView title;
private ImageView back, menu;
private SlidingMenu slidingMenu;
private int jsonStart = 20;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_listing);
initWidgets();
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
Intent i = new Intent(GameListing.this, GameDetails.class);
i.putExtra("game_details", games.get(position));
startActivity(i);
}
});
}
@SuppressWarnings("unchecked")
private void initWidgets() {
menu = (ImageView) findViewById(R.id.game_listing_menu);
list = (ListView) findViewById(R.id.game_listing_list);
title = (TextView) findViewById(R.id.game_listing_title);
back = (ImageView) findViewById(R.id.game_listing_back);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
try {
games = (ArrayList<Game>) getIntent().getSerializableExtra(
"selectedGames");
title.setText(games.get(0).getBelongTo().toUpperCase());
adapter = new GameListingAdapter(this, games);
list.setAdapter(adapter);
list.setOnScrollListener(this);
} catch (Exception e) {
e.printStackTrace();
}
displayMenu();
}
private void displayMenu() {
slidingMenu = new SlidingMenu(this);
slidingMenu.setMode(SlidingMenu.RIGHT);
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
slidingMenu.setShadowWidthRes(R.dimen.slidingmenu_shadow_width);
slidingMenu.setShadowDrawable(R.drawable.slidingmenu_shadow);
slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
slidingMenu.setFadeDegree(0.35f);
slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
slidingMenu.setMenu(R.layout.slidingmenu);
menu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
slidingMenu.toggle();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
slidingMenu.toggle();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
if (slidingMenu.isMenuShowing()) {
slidingMenu.toggle();
} else {
super.onBackPressed();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (list.getFirstVisiblePosition() > (games.size() - 7)) {
try {
loadJSON();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void loadJSON() throws JSONException {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
JSONArray json = new JSONParser()
.getJSONFromUrl(AppConstants.JsonURL
+ games.get(0).getBelongTo()
+ AppConstants.JsonLimit + jsonStart + ","
+ (jsonStart + 20));
loadGamesJson(json);
jsonStart += 20;
Log.v("--", jsonStart + " jsonStart");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
adapter.notifyDataSetChanged();
}
};
task.execute();
}
private void loadGamesJson(JSONArray json) {
try {
for (int i = 0; i < json.length(); i++) {
JSONObject gameObj = json.getJSONObject(i)
.getJSONObject("game");
int id = gameObj.getInt("id");
String name = gameObj.getString("name");
String date = gameObj.getString("release_date");
String timeStamp = gameObj.getString("timeStamp");
String rating = gameObj.getString("rating");
String description = gameObj.getString("description");
String belongsTo = gameObj.getString("belongto");
String publisher = gameObj.getString("publisher")
.replace("\"", "").replace("[", "").replace("]", "");
String platform = gameObj.getString("platform")
.replace("\"", "").replace("[", "").replace("]", "");
String genre = gameObj.getString("genre").replace("\"", "")
.replace("[", "").replace("]", "");
String developer = gameObj.getString("developer")
.replace("\"", "").replace("[", "").replace("]", "");
String video = "";
for (int n = 1; n <= 3; n++) {
video += gameObj.getString("video" + n) + ",";
}
video = video.substring(0, video.length() - 1);
String gameImage = gameObj.getString("game_img");
games.add(new Game(id, name, date, timeStamp, rating,
description, publisher, gameImage, developer, platform,
genre, belongsTo, video, false));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
公共类GameListing扩展了FragmentActivity实现OnScrollListener{
私有列表视图列表;
私人游戏列表适配器;
私人ArrayList游戏;
私有文本视图标题;
私有图像查看后退,菜单;
私人滑动菜单滑动菜单;
私有int jsonStart=20;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.game_列表);
initWidgets();
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、,
整数位置,长arg3){
意图i=新意图(GameListing.this、GameDetails.class);
i、 putExtra(“游戏详细信息”,games.get(位置));
星触觉(i);
}
});
}
@抑制警告(“未选中”)
私有void initWidgets(){
菜单=(ImageView)findViewById(R.id.game\u列表\u菜单);
list=(ListView)findViewById(R.id.game\u listing\u list);
title=(TextView)findViewById(R.id.game\u list\u title);
back=(ImageView)findViewById(R.id.game\u listing\u back);
back.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图arg0){
完成();
}
});
试一试{
games=(ArrayList)getIntent().getSerializableExtra(
“选定名称”);
title.setText(games.get(0.getBelongTo().toUpperCase());
适配器=新游戏列表适配器(此,游戏);
list.setAdapter(适配器);
list.setOnScrollListener(此);
}捕获(例外e){
e、 printStackTrace();
}
显示菜单();
}
私有void显示菜单(){
滑动菜单=新的滑动菜单(本);
slidingMenu.setMode(slidingMenu.RIGHT);
slidingMenu.SetTouchMode高于(slidingMenu.TOUCHMODE\u全屏);
滑动菜单。设置阴影宽度(R.dimen.滑动菜单\u阴影\u宽度);
slidingMenu.setShadowDrawable(R.drawable.slidingMenu\U shadow);
滑动菜单设置偏移量(R.尺寸滑动菜单\U偏移量);
滑动菜单。设置淡入淡出度(0.35f);
slidingMenu.attachToActivity(此为slidingMenu.SlidingU内容);
slidingMenu.setMenu(R.layout.slidingMenu);
menu.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
滑动菜单。切换();
}
});
}
@凌驾
公共布尔onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode_菜单){
滑动菜单。切换();
返回true;
}
返回super.onKeyDown(keyCode,event);
}
@凌驾
public void onBackPressed(){
if(slidengmenu.ismenushipping()){
滑动菜单。切换();
}否则{
super.onBackPressed();
}
}
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
if(list.getFirstVisiblePosition()>(games.size()-7)){
试一试{
loadJSON();
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
}
public void loadJSON()抛出JSONException{
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
JSONArray json=新的JSONParser()
.getJSONFromUrl(AppConstants.JsonURL
+games.get(0).getBelongTo()
+AppConstants.JsonLimit+jsonStart+“,”
+(jsonStart+20));
loadGamesJson(json);
jsonStart+=20;
Log.v(“--”,jsonStart+“jsonStart”);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
adapter.notifyDataSetChanged();
}
};
task.execute();
}
私有void loadGamesJson(JSONArray json){
试一试{
for(int i=0;iprivate int visibleThreshold = 5;
private int currentPage = 0;
private int previousTotal = 0;
private boolean loading = true;
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
currentPage++;
}
}
if (!loading
&& (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
// I load the next page of gigs using a background task,
// but you can call any function here.
try {
loadJSON();
} catch (JSONException e) {
e.printStackTrace();
}
loading = true;
}
}