Android - 如何阻止相邻片段中的ListView相互干扰?

时间:2015-08-21 18:00:08

标签: android listview android-fragments android-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;

        }
    }
}}

2 个答案:

答案 0 :(得分:1)

只需在此处发布,便可让人们更轻松地找到。

问题是resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"的字段ViewPager设置为1.因此,当用户滚动到其他页面时,将卸载超出该默认限制的任何页面。

如果您希望这些页面保持加载状态,您只需添加以下内容:

DEFAULT_OFFSCREEN_PAGES

其中pager.setOffscreenPageLimit(NUM_PAGES); 是您希望一次加载的页数。

答案 1 :(得分:0)

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 */}