Android Listview loadmore on scroll执行三次

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;

我有一个在CrollListener上实现的listview,因此当列表到达底部时,将加载更多数据。但在我的例子中,列表加载数据不止一次(三次),我找不到导致这种情况的原因。有人能帮帮我吗

代码如下:

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

    }