我有一个由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 */}