2016-09-09 16 views
0

オブジェクトのArrayListを作成し、それらのオブジェクトを使用してListViewを作成しようとしています。私のAsynctaskはjsonデータを取得することができ、それを解析して必要なオブジェクトを作成することができますが、ListViewにデータは設定されません。アダプタを実行する前にArrayListにオブジェクトがあるかどうかを確認すると、アダプタが実行されていないことがわかります。私はなぜ私のListViewが入力されていないか知りたい。asynctaskを使用してカスタムリストアダプターを使用してリストビューを作成することができません。

は、ここに私のコードです:(それは厄介だ場合は申し訳ありませんが、いくつかのスポットが、私はまだ更新するもらっていない)

public class MovieDisplayFragment extends Fragment{ 

private ArrayList<Movie> movieList = new ArrayList<Movie>(); 
private MovieAdapter movieAdapter; 
ListView listView; 

public MovieDisplayFragment(){ 
} 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

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

    movieAdapter = new MovieAdapter(getActivity(), movieList); 
    listView = (ListView) rootView.findViewById(R.id.listview_data); 
    listView.setAdapter(movieAdapter); 

    if(movieList.size() > 0) { 
     Log.e("Hello", "1"); 
    } 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l){ 
      Movie movie = movieAdapter.getItem(position); 
      Intent i = new Intent(getActivity(), DetailActivity.class) 
        .putExtra(Intent.EXTRA_TEXT, "Hello"); 
      startActivity(i); 
     } 
    }); 

    return rootView; 
} 

private void updateMovieData(){ 
    getMovieData movieData = new getMovieData(); 
    movieData.execute(); 
} 

@Override 
public void onStart(){ 
    super.onStart(); 
    updateMovieData(); 
} 

public class getMovieData extends AsyncTask<Void, Void, List<Movie>> { 

    private final String LOG_CAT = getMovieData.class.getSimpleName(); 

    private List<Movie> getMovieData(String movieJsonStr) throws JSONException { 

     final String MOV_ITEMS = "results"; 
     final String MOV_TITLE = "original_title"; 
     final String MOV_DATE = "release_date"; 
     final String MOV_SYNOPSIS = "overview"; 
     final String MOV_VOTE = "vote_average"; 
     final String MOV_POSTER_URL = "poster_path"; 

     JSONObject movieJson = new JSONObject(movieJsonStr); 
     JSONArray movieArray = movieJson.getJSONArray(MOV_ITEMS); 

     Log.e("Hello", "2"); 

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

      JSONObject movie = movieArray.getJSONObject(i); 

      movieList.add(new Movie(movie.getString(MOV_TITLE), movie.getString(MOV_DATE), 
        movie.getString(MOV_SYNOPSIS), movie.getString(MOV_VOTE), movie.getString(MOV_POSTER_URL))); 

     } 

     return movieList; 
    } 

    protected List<Movie> doInBackground(Void... params) { 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     String movieJsonStr = null; 

     try { 

      final String BASE_URL = "http://api.themoviedb.org/3/genre/10751/movies?api_key=358f3b44734f7e6404f2d01a62d3c176&include_all_movies=true&include_adult=true"; 
      Uri builtUri = Uri.parse(BASE_URL).buildUpon().build(); 
      URL url = new URL(builtUri.toString()); 

      Log.v(LOG_CAT, "Built URI " + builtUri.toString()); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      if (inputStream == null){ 
       movieJsonStr = null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while((line = reader.readLine()) != null){ 
       buffer.append(line + "\n"); 
      } 

      if (buffer.length() == 0){ 
       movieJsonStr = buffer.toString(); 
      } 
      movieJsonStr = buffer.toString(); 

      Log.v(LOG_CAT, "Movie String: " + movieJsonStr); 
     } catch (IOException e) { 
      Log.e("Fragment", "Error", e); 
      movieJsonStr = null; 

     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e("PlaceholderFragment", "Error closing stream", e); 
       } 
      } 
     } 

     try { 
      return getMovieData(movieJsonStr); 
     } catch (JSONException e) { 
      Log.e(LOG_CAT, e.getMessage(), e); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(List<Movie> movies){ 
     if(movies != null){ 
      movieAdapter.clear(); 
      for(Movie movieData : movies){ 
       movieAdapter.add(movieData); 
      } 
     } 
    } 
} 

}

+1

関連コードのみを掲載してください。 – user6657161

答えて

1

非同期でのごonPostExecute()内のこれらの2行を入れてください。

movieAdapter = new MovieAdapter(getActivity(), movieList); 
listView.setAdapter(movieAdapter); 

AsyncTaskは、バックグラウンドスレッドで実行されます。それは数秒後にjsonからデータを取得します。しかし、あなたのアダプターはあなたのフラグメントが作成されてから数ミリ秒後に呼ばれます。

したがって、アダプタを設定するときにJsonのデータはそこにありません。

onPostExecuteで呼び出すと、Jsonデータがサーバーから取得された後にアダプターが設定されるため、この問題は解決されます。

少し助けてくれるといいですね。

0

実行後のように、あなたのアダプタがリストビューを作成するために使用しているリストをクリアしてから、新しい項目をリストに追加します。ただし、その後にビューを更新するには、notifyDataSetChanged()を呼び出す必要があります。リスト

@Override 
protected void onPostExecute(List<Movie> movies){ 
    if(movies != null){ 
     movieAdapter.clear(); 
     for(Movie movieData : movies){ 
      movieAdapter.add(movieData); 
     } 
     movieAdapter.notifyDataSetChanged(); 
    } 
} 
0

を更新した後、あなたはmovieList movieList前くらい(movieList.size())()のサイズを印刷している人口なっています。デバッガでは "Hello" "1"を出力しません。

listView.setAdapter(movieAdapter); 
:asynctaskは

for(Movie movieData : movies) 
{ 
    movieAdapter.add(movieData); 
} 

あなたはこのビットを挿入する必要があり、以下のコードの後に​​、

とにかくOnCreateView()内のコードを確認してください)(あなたのmovieList.sizeよりもずっと後movieList内のデータを記入します

アダプターを作成していますが、getMovieData AsynctaskのonPostExecute()のlistViewにアダプターを設定していません。

+0

@Seef投稿を編集して投稿する – takesavy

+0

こんにちは。私のif(movies!= null)の前に、私のarraylistは20のサイズを持っています。私が追加したコードの後、arraylistは0です。私のログアウトメッセージも表示されません。 13回?)。 for(movie movieData:movies)も決して実行されません。 – Seef

関連する問題