我遇到了由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;
}
}
}}
答案 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 */}