【问题标题】:Android - How to stop ListViews in adjoining fragments from interfering with each other?Android - 如何阻止相邻片段中的 ListViews 相互干扰?
【发布时间】:2015-08-21 18:00:07
【问题描述】:

我对由 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;

        }
    }
}}

【问题讨论】:

  • 它看起来像是显示在正确列表视图下方的列表视图吗?
  • 要不然我看看view pager过去2-3页的缓存?
  • 你可以试试这个:pager.setOffscreenPageLimit(NUM_PAGES);
  • @LukeCauthen 的工作就像一个魅力,非常感谢!
  • 我发布了我的评论作为答案,以便其他人可以找到它。因此,接受它对您会有所帮助;)

标签: android listview android-fragments android-listview


【解决方案1】:

只是在这里发布,以便人们更容易找到。

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

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

pager.setOffscreenPageLimit(NUM_PAGES);

其中NUM_PAGES 是您希望一次保持加载的页面数。

【讨论】:

    【解决方案2】:
    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 */}
    

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2021-04-18
      • 2013-06-04
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多