簡體   English   中英

初學者,使用導航抽屜切換時保持片段狀態

[英]Beginner, Maintaining Fragment State When switching using Navigation Drawer

我是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;
}

這是我的Fragment類之一

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;
    }

}

謝謝

一種方法是保留數據,如果已經收到數據,則不要調用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遇到問題,請發布新問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM