2016-06-08 5 views
0

저는 Java 및 Android 개발 초심자이지만 AsycTask를 사용하여 ListView로 다섯 조각 사이를 전환하는 탐색 드로어 활동을 생성 할 수있었습니다. 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으로 전화하지 않는 것이 좋습니다. onCreateView()에서 다음

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

:

@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를 구현해야합니다. 이것에 관한 온라인 자습서와 SO 답변이 많이 있습니다. Parcelable을 구현하는 데 문제가 있으면 새로운 질문을 게시하십시오.

+0

내가 새 EventsFields 개체를 만들 때, 거기에 넣을 내용을 모르는 구획 인수를 요청합니다. 위의 JsonParser 클래스를 확인하십시오. 나는 그 곳에 무엇을 넣을 지 몰랐다. 그래서 나는 null을 넣었다. @kris larson – Phrytz

+0

아마도 그 상황에서 사용해야하는'EventsFields' 클래스에 인수가없는 생성자를 지정하지 않았기 때문입니다 :'public EventsFields() {}' –

+0

Ok. 내가 EventsFields의 생성자를 만들었지 만 onSaveIstanceState를 재정의하지만 조각 사이를 전환 할 때 asyncTack이 항상 실행됩니다. @ 크리스 라슨 다른 제안? – Phrytz

관련 문제