2016-07-16 2 views
0

OMDBAPIから検索された映画のタイトルを表示するリストビューがあります。検索ボタンをクリックすると、2回クリックする必要があります。JSONParserからListViewにdoubleが必要

お願いします。ここで

はコードです:

public class JSONParser extends AsyncTask<String, String, String> { 

    static ArrayList<String> movieList = new ArrayList<>(); 

    @Override 
    protected String doInBackground(String... params) { 

     HttpURLConnection httpURLConnection = null; 
     BufferedReader reader = null; 
     StringBuilder builder = new StringBuilder(); 

     try { 

      URL url = new URL(params[0]); 
      httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.connect(); 
      InputStream stream = httpURLConnection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      String line = ""; 
      while ((line = reader.readLine()) != null){ 
       builder.append(line); 

      } 
      return builder.toString(); 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     finally { 
      if(httpURLConnection != null){ 
       httpURLConnection.disconnect(); 
      } 
      try { 
       if (reader != null){ 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return "Failed Connection"; 
    } 



    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     try { 
      JSONObject jsonObject = new JSONObject(result); 
      JSONArray jsonArray = jsonObject.getJSONArray("Search"); 
      StringBuilder stringBuilder = new StringBuilder(); 
      for (int i = 1; i<jsonArray.length(); i++){ 
       JSONObject finalJsonObject = jsonArray.getJSONObject(i); 
       String titleOfMovie = finalJsonObject.getString("Title"); 
       movieList.add(titleOfMovie); 
       stringBuilder.append(movieList); 
       finalJsonObject.get("Title"); 

      } 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

はここmainActivivtyです:

public class Main2ActivityWeb extends AppCompatActivity { 

    EditText searchBar; 
    ListView listOfMovies; 
    Button searchBtn; 
    Button deleteBtn; 
    ArrayAdapter<String> arrayAdapter; 
    String url = "http://www.omdbapi.com/?s="; 

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

     searchBar = (EditText) findViewById(R.id.etsearch); 
     listOfMovies = (ListView) findViewById(R.id.lvMovies); 
     searchBtn = (Button) findViewById(R.id.btnSearch); 
     deleteBtn = (Button) findViewById(R.id.btnClear); 

     searchBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       arrayAdapter = null; 
       final String search = url + searchBar.getText().toString(); 
       new JSONParser().execute(search); 
       ArrayList<String> list = new ArrayList<>(JSONParser.movieList); 
       arrayAdapter = new ArrayAdapter<>(Main2ActivityWeb.this, 
         android.R.layout.simple_list_item_1, list); 
       listOfMovies.setAdapter(arrayAdapter); 
       if (arrayAdapter !=null){ 
        JSONParser.movieList.clear(); 
       } 



      } 
     }); 

     deleteBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listOfMovies.setAdapter(null); 
       JSONParser.movieList.clear(); 
       searchBar.setText(""); 
      } 
     }); 


    } 
} 
+0

使用バレーボールのJSONObjectRequestで自身のArrayList

private ArrayList<String> list; ... onCreate() { listOfMovies = (ListView) findViewById(R.id.lvMovies); list = new ArrayList<>(); arrayAdapter = new ArrayAdapter<>(Main2ActivityWeb.this, android.R.layout.simple_list_item_1, list); listOfMovies.setAdapter(arrayAdapter); ... onClick() { ... new JSONParser(arrayAdapter).execute(search); } } 

です維持するのではなくAsyncTaskにArrayAdapterを与えます。 AsyncTaskを使用するよりもずっと簡単です。 –

答えて

0

あなたの問題は、あなたがAsyncTaskはasyncronousある概念を理解していないように見えるように

new JSONParser().execute(search); 
です

01に何も保存しませんonPostExecuteが完了するまで

一方、あなたはAsyncTaskはJSONを解析するために、バックグラウンドで完了するためにあなたはまだ待っているので、あなたがボタンをクリックし、初めて空のほとんどがそうである同期実行

ArrayList<String> list = new ArrayList<>(JSONParser.movieList); 

に進みます。

ボタンを2回クリックすると、JSONの新しいリクエストが開始されますが、表示される結果は最初のリクエストからのものです。それに対処するための


一つの方法は、バレーボール、レトロフィット/ OkHttpのようなコールバックは、どうなるであるが、彼らは正しい順序で実行されるように、あなたはまた、あなたが使用するオブジェクトの周りに移動することができます。例えば、それはAsyncTask

public class JSONParser extends AsyncTask<String, String, String> { 

    private ArrayAdapter<String> adapter; 

    public JSONParser(ArrayAdapter<String> adapter) { 
     this.adapter = adapter; 
    } 

    ... 

    onPostExectute() { 
     for (...) { 
      adapter.add(titleOfMovie); 
     } 
     apdater.notifyDataSetChanged(); 
    } 
} 
関連する問題