2016-06-08 93 views
0

我是一個初學java和android開發人員,但設法創建了一個導航抽屜活動,它使用AsycTask在五個片段之間切換ListViews。當我在片段之間切換時,AsycTask再次啓動。我在這裏經歷了很多帖子,但似乎沒有任何工作。任何幫助。初學者,維護片段狀態當使用導航抽屜切換時

這裏是我的抽屜式導航活動

public class Home extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 


private static String website = "https://www.website.com", fbPage = "https://www.facebook.com", 
     twitter = "https://twitter.com", 

private android.support.v4.app.FragmentManager fragmentManager; 
private android.support.v4.app.FragmentTransaction fragmentTransaction; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_holder, new HomeFragment(), "Home Fragment") 
       .commit(); 

    fragmentManager = getSupportFragmentManager(); 

} 

private void customNavgation() { 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
    navigationView.getMenu().getItem(0).setChecked(true); 
} 

} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.nav_home) { 

     HomeFragment homeFragment = new HomeFragment(); 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.fragment_holder, homeFragment, "HomeFragment"); 
     fragmentTransaction.commit(); 

    } else if (id == R.id.nav_message) { 

     MessageFragment messageFragment = new MessageFragment(); 
      fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.add(R.id.fragment_holder, messageFragment, "MessageFragment"); 
      fragmentTransaction.commit(); 

    } else if (id == R.id.nav_word) { 

     WordFragment wordFragment = new WordFragment(); 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.fragment_holder, wordFragment, "WordFragment"); 
     fragmentTransaction.commit(); 

    } else if (id == R.id.nav_events) { 

     EventsFragment eventsFragment = new EventsFragment(); 
      fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.add(R.id.fragment_holder, eventsFragment, "EventsFrangment"); 
      fragmentTransaction.commit(); 

    } else if (id == R.id.nav_service) { 

     ServiceFragment serviceFragment = new ServiceFragment(); 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.fragment_holder, serviceFragment, "Service Fragment"); 
     fragmentTransaction.commit(); 

    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

這裏是我的片段類的一個

public class EventsFragment extends Fragment { 

ArrayList<EventsFields> eventsFieldsList; 
private ListView eventlist; 

static final String EVENT_LINK = "http:www.website.com"; 
private ProgressBar pb; 
private View view; 


public EventsFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_events, container, false); 

     eventlist = (ListView) view.findViewById(R.id.event_frag_listView); 
     pb = (ProgressBar) view.findViewById(R.id.progressBar); 
     pb.setVisibility(View.INVISIBLE); 

     if (isOnline()) { 
      requestData(EVENT_LINK); 
     } else { 
      Toast.makeText(EventsFragment.this.getActivity(), "No Internet Connection", Toast.LENGTH_LONG).show(); 
     } 

    return view; 
} 


protected void updateDisplay() { 
    EventsListAdapter adapter = new EventsListAdapter(EventsFragment.this.getActivity(), R.layout.event_list_layout, eventsFieldsList); 
    eventlist.setAdapter(adapter); 
    eventlist.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(EventsFragment.this.getActivity(), EventDetail.class); 
      EventsFields selectedEvent = eventsFieldsList.get(position); 
      intent.putExtra("selectedEvent", selectedEvent); 
      startActivity(intent); 
     } 
    }); 
} 


private void requestData(String uri) { 
    MyTask task = new MyTask(); 
    task.execute(uri); 
} 


protected boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netinfo = cm.getActiveNetworkInfo(); 

    if (netinfo != null && netinfo.isConnectedOrConnecting()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

public class MyTask extends AsyncTask<String, String, ArrayList<EventsFields>> { 

    @Override 
    protected void onPreExecute() { 
     pb.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected ArrayList<EventsFields> doInBackground(String... params) { 

     String data = HttpManager.getData(params[0]); 
     eventsFieldsList = EventsJsonParser.parseFeed(data); 

     return eventsFieldsList; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<EventsFields> results) { 


     pb.setVisibility(View.INVISIBLE); 

     if (results == null) { 
      Toast.makeText(EventsFragment.this.getActivity(), "Web service not available", Toast.LENGTH_LONG).show(); 
      return; 
     } 
     eventsFieldsList = results; 
     updateDisplay(); 
    } 

} 

JsonPaser類

public class EventsJsonParser { 

public static ArrayList<EventsFields> parseFeed(String content) { 

    try { 

     JSONArray ar = new JSONArray(content); 
     ArrayList<EventsFields> eventList = new ArrayList<>(); 

     for (int i = 0; i < ar.length(); i++) { 

      JSONObject obj = ar.getJSONObject(i); 

      EventsFields events = new EventsFields(null); 

      events.setId(obj.getInt("id")); 
      events.setEventName(obj.getString("EventName")); 
      events.setStartDate(obj.getString("StartDate")); 
      events.setEventDesc(obj.getString("EventDesc")); 
      events.setTime(obj.getString("Time")); 
      events.setVenue(obj.getString("Venue")); 
      eventList.add(events); 
     } 

     return eventList; 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

} 

感謝

回答

0

一種方法如果您已經收到數據,則持久保存數據,然後不要致電AsyncTask

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putParcelableArrayList("eventsFieldsList", eventsFieldsList); 
    super.onSaveInstanceState(outState); 
} 

然後在onCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_events, container, false); 

     eventlist = (ListView) view.findViewById(R.id.event_frag_listView); 
     pb = (ProgressBar) view.findViewById(R.id.progressBar); 
     pb.setVisibility(View.INVISIBLE); 

     if (savedInstanceState != null) { 
      eventsFieldsList = savedInstanceState.getParcelableArrayList("eventsFieldsList"); 
     } 

     if (eventsFieldList == null) { 
      if (isOnline()) { 
       requestData(EVENT_LINK); 
      } else { 
       Toast.makeText(EventsFragment.this.getActivity(), "No Internet Connection", Toast.LENGTH_LONG).show(); 
      } 
     } 

    return view; 
} 

你需要讓你的EventsFields類實現Parcelable。有很多在線教程和對此的答案。如果您在執行Parcelable時遇到問題,請發佈新問題。

+0

當我調用創建一個新的EventsFields對象時,它請求一個parcel參數,我不知道該放什麼。檢查我上面的JsonParser類。我不知道該放什麼,所以我把null。 @kris larson – Phrytz

+0

這可能是因爲你還沒有在'EventsFields'類中指定一個無參數構造函數,你應該在這種情況下使用:'public EventsFields(){}' –

+0

好的。我確實創建了EventsFields的構造函數,並且還覆蓋了onSaveIstanceState,但在片段之間切換時始終執行asyncTack。 @kris larson任何其他建議? – Phrytz