0

응용 프로그램을 시작하면 조각의 스피너에 데이터베이스의 데이터가 채워집니다. 데이터베이스에서 문자열 목록을 가져 와서 스피너에 표시하려고합니다. 채울 목록이 있고 ArrayAdapter는 PostExecute에서 변경되지만 아무 것도 표시되지 않을 때 변경됩니다.비동기 작업의 데이터로 스피너 업데이트

조각 코드

public static class RegisterFragment extends Fragment{ 


public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

    List<String> instituteList = new ArrayList<String>(); 
    View rootView = inflater.inflate(R.layout.fragment_register, container, false); 
    if (instituteList.isEmpty()){ //list is null on app start-up 
     Log.d("test","null list"); 
    }else{ 

    Spinner autoInstitute = (Spinner)getActivity(). findViewById(R.id.institute); 
// Get the string array 
    String[] institutes = (String[]) instituteList.toArray(new String[instituteList.size()]);; 
// Create the adapter and set it to the AutoCompleteTextView 
ArrayAdapter<String> instituteApapdter = 
     new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, institutes); 
instituteApapdter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    autoInstitute.setAdapter(instituteApapdter); 
    } 
     return rootView; 
} 

비동기 클래스

class getInstitute extends AsyncTask<String, String, String>{ 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
     pDialog = new ProgressDialog(Login.this); 
     pDialog.setMessage("Loading Institute List"); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 

    } 
    @Override 
    protected String doInBackground(String... params) { 
        //Get data and store in List 
    } 
protected void onPostExecute(String file_url) { 
     // dismiss the dialog once done 
     pDialog.dismiss(); 
     institutes_array = (String[]) instituteList.toArray(new String[instituteList.size()]);; 
     final ArrayAdapter<String> instituteApapdter = 
       new ArrayAdapter<String>(Login.this, android.R.layout.simple_list_item_1, institutes_array); 
     instituteApapdter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     runOnUiThread(new Runnable() { 

      public void run() { 

       instituteApapdter.notifyDataSetChanged(); 
      } 
     //autoInstitute.setAdapter(instituteApapdter); // causes nullpointerexception 
     }); 
    } 
+0

좀 더 문제를 명확히하십시오. – Yuriy

+0

'doInBackground'에서'instituteList'를 업데이트하고 있습니까? –

+0

instituteList는 doInBackground – bobeyuno

답변

1

쓰기이 :

이 대신
Spinner autoInstitute = (Spinner)rootView. findViewById(R.id.institute); 

:

Spinner autoInstitute = (Spinner)getActivity(). findViewById(R.id.institute); 
,536,

또한 AsyncTask 클래스에서 ArrayAdapter() 생성자의 첫 번째 인수로 Login.this을 작성했습니다. getActivity()

이 있어야한다 완전한 RegisterFragment 클래스를 변경 :

package com.bhavit.stackoverflow; 

public static class RegisterFragment extends Fragment{ 

    Spinner autoInstitute; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

     List<String> instituteList = new ArrayList<String>(); 
     View rootView = inflater.inflate(R.layout.fragment_register, container, false); 

     if (instituteList.isEmpty()){ //list is null on app start-up 
      Log.d("test","null list"); 
     }else{ 

     autoInstitute = (Spinner)getActivity(). findViewById(R.id.institute); 

     GetInstitute obj = new GetInstitute(); 
     obj.execute(); 


     } 
      return rootView; 
    } 


    class GetInstitute extends AsyncTask<String, String, String>{ 

      @Override 
      protected void onPreExecute() { 

       super.onPreExecute(); 
       pDialog = new ProgressDialog(getActivity()); 
       pDialog.setMessage("Loading Institute List"); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(true); 
       pDialog.show(); 

      } 
      @Override 
      protected String doInBackground(String... params) { 
          //Get data and store in List 
      } 
     protected void onPostExecute(String file_url) { 
       // dismiss the dialog once done 
       pDialog.dismiss(); 
       institutes_array = (String[]) instituteList.toArray(new String[instituteList.size()]);; 
       final ArrayAdapter<String> instituteApapdter = 
         new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, institutes_array); 
       instituteApapdter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

        instituteApapdter.notifyDataSetChanged(); 

      autoInstitute.setAdapter(instituteApapdter); // causes nullpointerexception 

      } 
    } 

} 
+0

'getActivity()'에 업데이트됩니다 그래 날을 알 수있는 방법은 – bobeyuno

+0

쓰기 RegisterFragment.this.getActivity() 죄송 –

+0

하지만 타입 Login.RegisterFragment의 어떠한 둘러싸는 인스턴스 범위 – bobeyuno

관련 문제