如何阻止相邻片段中的listview相互干扰



我有一个由ViewPager提供支持的相邻片段的问题。实际上,我有三个listview,每个片段上一个,用于显示来自Parse的单个数据流。当我第一次打开活动时,所有的数据都加载得很好,但是当我导航到第三个片段,然后再回到第一个片段时,显示了正确的数据,但很快就变成了错误的数据。然而,如果我不为中间片段ListView设置任何数据,一切工作正常,导致我怀疑中间ListView在某种程度上干扰。下面是使用ViewPager为活动提供动力的代码。非常感谢您的帮助!

public class Challenge extends FragmentActivity {
TextView wpm;
TextView username;
ParseUser currentUser = ParseUser.getCurrentUser();
ListView yourturn;
ListView theirturn;
ListView history;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.challenge);
    ViewPager pager = (ViewPager) findViewById(R.id.ViewPager);
    pager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
}
private class PagerAdapter extends FragmentPagerAdapter {
    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }
    @Override
    public Fragment getItem(int pos) {
        YourTurnFragment yourturnfragment = new YourTurnFragment();
        TheirTurnFragment theirturnfragment = new TheirTurnFragment();
        HistoryFragment historyfragment = new HistoryFragment();
        switch(pos) {
        case 0: return yourturnfragment;
        case 1: return theirturnfragment.newInstance();
        case 2: return historyfragment.newInstance();
        default: return yourturnfragment.newInstance();
        }
    }
    @Override
    public int getCount() {
        return 3;
    }       
}
public class YourTurnFragment extends Fragment {
    ListView list;
    List<YourTurnObject> yourTurnList;
    List<ParseObject> tempObjectList;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.challenge_listview, container, false);
        list = (ListView)v.findViewById(R.id.ChallengeList);
        TextView title = (TextView)v.findViewById(R.id.ChallengeListTitle);
        title.setText("Your Turn");
        //yourTurnList = new ArrayList<YourTurnObject>();
        //tempObjectList = new ArrayList<ParseObject>();
        getObjects();
        //Stuff Here
        return v;
    }
    public YourTurnFragment newInstance(){
        YourTurnFragment f = new YourTurnFragment();
        return f;
    }
    public class YourTurnObject{
        ParseObject challenge;
        ParseUser user; 
    }
    public YourTurnObject addYourTurnObject(ParseObject challenge, ParseUser user){
        YourTurnObject object = new YourTurnObject();
        object.challenge = challenge;
        object.user = user;
        return object;
    }
    public void getObjects(){
        yourTurnList = new ArrayList<YourTurnObject>();
        tempObjectList = new ArrayList<ParseObject>();
        list.setAdapter(new ClearAdapter());
        ParseQuery<ParseObject> query = new ParseQuery("Challenges");
        query.whereEqualTo("currentTurn", currentUser.getObjectId());
        query.whereNotEqualTo("isOver", true);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> list, ParseException e) {
                if (e == null&&list.size()>0) {
                   tempObjectList=list;
                   getUsernames(0);
                } 
            }
        });
    }
    public void getUsernames(final int i){
        if(i<tempObjectList.size()){
            final ParseObject object = tempObjectList.get(i);
            String friendid;
            if((object.getString("toUser")+"").equals(currentUser.getObjectId()+"")){
                friendid = object.getString("fromUser");
            }
            else{
                friendid = object.getString("toUser");
            }
            ParseQuery<ParseUser> query = ParseUser.getQuery();
            query.getInBackground(friendid, new GetCallback<ParseUser>() {  
                @Override
                public void done(ParseUser arg0, ParseException arg1) {
                    yourTurnList.add(addYourTurnObject(object, arg0));
                    getUsernames(i+1);
                }
            });
        }
        else{   
            list.setAdapter(new YourTurnAdapter());
        }
    }
    public class YourTurnAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return yourTurnList.size();
        }
        @Override
        public YourTurnObject getItem(int arg0) {
            return yourTurnList.get(arg0);
        }
        @Override
        public long getItemId(int arg0) {
            return arg0;
        }
        @Override
        public View getView(final int arg0, View arg1, ViewGroup arg2) {
            if(arg1==null){
                //Toast.makeText(getApplicationContext(), "This was Called", Toast.LENGTH_SHORT).show();
                LayoutInflater inflater = (LayoutInflater) Challenge.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                arg1 = inflater.inflate(R.layout.choose_challenge_item, arg2,false);
                wpm = (TextView)arg1.findViewById(R.id.ChooseChallengeUserWPM);
                username = (TextView)arg1.findViewById(R.id.ChooseChallengeUsernameField);
                wpm.setText(getItem(arg0).user.getInt("AWPM")+"");
                username.setText(getItem(arg0).user.getString("username"));
            }
            return arg1;
        }
    }    
}

public class TheirTurnFragment extends Fragment {
    ListView list;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.challenge_listview, container, false);
        list = (ListView)v.findViewById(R.id.ChallengeList);
        TextView title = (TextView)v.findViewById(R.id.ChallengeListTitle);
        title.setText("Their Turn");    
        theirTurnList = new ArrayList<TheirTurnObject>();
        tempObjectList = new ArrayList<ParseObject>();
        getObjects();
        return v;
    }
    public TheirTurnFragment newInstance(){
        TheirTurnFragment f = new TheirTurnFragment();
        return f;
    }
    public class TheirTurnObject{
        ParseObject challenge;
        ParseUser user; 
    }
    public TheirTurnObject addYourTurnObject(ParseObject challenge, ParseUser user){
        TheirTurnObject object = new TheirTurnObject();
        object.challenge = challenge;
        object.user = user;
        return object;
    }
    ArrayList<TheirTurnObject> theirTurnList;
    ArrayList<ParseObject> tempObjectList;
    public void getObjects(){
        //Fix This
        ParseQuery<ParseObject> query = new ParseQuery("Challenges");
        query.whereEqualTo("fromUser", currentUser.getObjectId());
        query.whereNotEqualTo("currentTurn", currentUser.getObjectId());
        query.whereNotEqualTo("isOver", true);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> list, ParseException e) {
                if (e == null&&list.size()>0) {
                   tempObjectList.addAll(list);
                   getObjects1();
                } 
                else{
                    getObjects1();
                }
            }
        });
    }
    public void getObjects1(){
        //Fix This
        ParseQuery<ParseObject> query = new ParseQuery("Challenges");
        query.whereEqualTo("toUser", currentUser.getObjectId());
        query.whereNotEqualTo("currentTurn", currentUser.getObjectId());
        query.whereNotEqualTo("isOver", true);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> list, ParseException e) {
                if (e == null&&list.size()>0) {
                   tempObjectList.addAll(list);
                   getUsernames(0);
                } 
                else{
                   getUsernames(0);
                }
            }
        });
    }
    public void getUsernames(final int i){
        if(i<tempObjectList.size()){
            final ParseObject object = tempObjectList.get(i);
            String friendid;
            if((object.getString("toUser")+"").equals(currentUser.getObjectId()+"")){
                friendid = object.getString("fromUser");
            }
            else{
                friendid = object.getString("toUser");
            }
            ParseQuery<ParseUser> query = ParseUser.getQuery();
            query.getInBackground(friendid, new GetCallback<ParseUser>() {  
                @Override
                public void done(ParseUser arg0, ParseException arg1) {
                    theirTurnList.add(addYourTurnObject(object, arg0));
                    getUsernames(i+1);
                }
            });
        }
        else{
            list.setAdapter(new TheirTurnAdapter());
        }
    }
    public class TheirTurnAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return theirTurnList.size();
        }
        @Override
        public TheirTurnObject getItem(int arg0) {
            return theirTurnList.get(arg0);
        }
        @Override
        public long getItemId(int arg0) {
            return arg0;
        }
        @Override
        public View getView(final int arg0, View arg1, ViewGroup arg2) {
            if(arg1==null){
                LayoutInflater inflater = (LayoutInflater) Challenge.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                arg1 = inflater.inflate(R.layout.choose_challenge_item, arg2,false);
                wpm = (TextView)arg1.findViewById(R.id.ChooseChallengeUserWPM);
                username = (TextView)arg1.findViewById(R.id.ChooseChallengeUsernameField);
            }
            wpm.setText(theirTurnList.get(arg0).user.getInt("AWPM")+"");
            username.setText(theirTurnList.get(arg0).user.getString("username"));
            return arg1;
        }
    }    
}
public class HistoryFragment extends Fragment {
    ListView list;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.challenge_listview, container, false);
        list = (ListView)v.findViewById(R.id.ChallengeList);
        TextView title = (TextView)v.findViewById(R.id.ChallengeListTitle);
        title.setText("Challenge History");
        getObjects();
        return v;
    }
    public HistoryFragment newInstance(){
        HistoryFragment f = new HistoryFragment();
        return f;
    }
    public class HistoryObject{
        ParseObject challenge;
        ParseUser user; 
    }
    public HistoryObject addYourTurnObject(ParseObject challenge, ParseUser user){
        HistoryObject object = new HistoryObject();
        object.challenge = challenge;
        object.user = user;
        return object;
    }
    ArrayList<HistoryObject> historyList;
    ArrayList<ParseObject> tempObjectList;
    public void getObjects(){
        //Fix This
        historyList = new ArrayList<HistoryObject>();
        tempObjectList = new ArrayList<ParseObject>();
        list.setAdapter(new ClearAdapter());
        ParseQuery<ParseObject> query = new ParseQuery("Challenges");
        query.whereEqualTo("fromUser", currentUser.getObjectId());
        query.whereEqualTo("isOver", true);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> list, ParseException e) {
                if (e == null&&list.size()>0) {
                   tempObjectList.addAll(list);
                   getObjects1();
                } 
                else{
                    getObjects1();
                }
            }
        });
    }
    public void getObjects1(){
        //Fix This
        ParseQuery<ParseObject> query = new ParseQuery("Challenges");
        query.whereEqualTo("toUser", currentUser.getObjectId());
        query.whereEqualTo("fromOver", true);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> list, ParseException e) {
                if (e == null&&list.size()>0) {
                   tempObjectList.addAll(list);
                   getUsernames(0);
                } 
                else{
                   getUsernames(0);
                }
            }
        });
    }
    public void getUsernames(final int i){
        if(i<tempObjectList.size()){
            final ParseObject object = tempObjectList.get(i);
            String friendid;
            if((object.getString("toUser")+"").equals(currentUser.getObjectId()+"")){
                friendid = object.getString("fromUser");
            }
            else{
                friendid = object.getString("toUser");
            }
            ParseQuery<ParseUser> query = ParseUser.getQuery();
            query.getInBackground(friendid, new GetCallback<ParseUser>() {  
                @Override
                public void done(ParseUser arg0, ParseException arg1) {
                    historyList.add(addYourTurnObject(object, arg0));
                    getUsernames(i+1);
                }
            });
        }
        else{
            list.setAdapter(new TheirTurnAdapter());
        }
    }
    public class TheirTurnAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return historyList.size();
        }
        @Override
        public HistoryObject getItem(int arg0) {
            return historyList.get(arg0);
        }
        @Override
        public long getItemId(int arg0) {
            return arg0;
        }
        @Override
        public View getView(final int arg0, View arg1, ViewGroup arg2) {
            if(arg1==null){
                LayoutInflater inflater = (LayoutInflater) Challenge.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                arg1 = inflater.inflate(R.layout.choose_challenge_item, arg2,false);
                wpm = (TextView)arg1.findViewById(R.id.ChooseChallengeUserWPM);
                username = (TextView)arg1.findViewById(R.id.ChooseChallengeUsernameField);
                //Toast.makeText(getApplicationContext(), historyList.get(arg0).user.getUsername()+"", Toast.LENGTH_SHORT).show();
                wpm.setText(historyList.get(arg0).user.getInt("AWPM")+"");
                username.setText(historyList.get(arg0).user.getString("username"));
            }

            return arg1;
        }
    }
}}

只是把它贴在这里,以便人们更容易找到。

问题是ViewPager有一个字段DEFAULT_OFFSCREEN_PAGES被设置为1。因此,当用户滚动到另一个页面时,任何超出默认限制的页面都将被卸载。

如果你想让这些页面保持加载状态,你可以简单地添加:

pager.setOffscreenPageLimit(NUM_PAGES);

其中NUM_PAGES是您想要一次保持加载的页面数

make every newInstance() as static and call from getItem with respect to Class.
ex: public static YourTurnFragment newInstance(){
        YourTurnFragment y = new YourTurnFragment():
                  return y;}

    getItem(int pos){
case :YourTurnFragment.newInstance();
/*same for all cases */}

最新更新