2017-11-18 217 views
-2

如何在add()命令中設置listview? 首先這是代碼(不是真正的代碼)如何在add()命令中設置listview?

API_Interface.java

public interface API_Interface{ 
    @GET("/api/{buzz}") 
    Call<Buzz> Buzz_API(@Path("buzz") String buzz); 
} 

Buzz.java

public class Buzz{ 
    @SerializedName("buzz") 
    @Expose 
    private String buzz; 

    public String getBuzz() { 
     return buzz; 
    } 

    public void setBuzz(String buzz) { 
     this.buzz = buzz; 
    } 
} 

MainActivity.class

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

     ListView listView = (ListView) findViewById(R.id.list_view); 
     BuzzArrayList<Buzz> buzzArrayList = new BuzzArrayList<Buzz>(); 
     BuzzAdapter buzzAdapter = new BuzzAdapter(this, 0, buzzArrayList); 
     listView.setAdapter(buzzAdapter); 

     Retrofit buzz_retro = new Retrofit.Builder() 
      .baseUrl("https://buzz.com") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

     API_Interface buzz_service = buzz_retro.create(API_Interface.class); 

     //Get data 
     Call<Buzz> buzz1 = buzz_service.buzz_API("Apple"); 
     buzz1.enqueue(new Callback<Buzz>() { 
     @Override 
     public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
      String buzz_1 = response.body().getBuzz(); //buzz_1="Apple" 
      buzzArrayList.add(new Exchange(buzz_1)); 
      buzzAdapter.notifyDataSetChanged(); 
      } 
     }); 

     Call<Buzz> buzz2 = buzz_service.buzz_API("Banana"); 
     buzz2.enqueue(new Callback<Buzz>() { 
     @Override 
     public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
      String buzz_2 = response.body().getBuzz(); //buzz_2="Banana" 
      buzzArrayList.add(new Exchange(buzz_2)); 
      buzzAdapter.notifyDataSetChanged(); 
      } 
     }); 


     Call<Buzz> buzz3 = buzz_service.buzz_API("Rice"); 
     buzz3.enqueue(new Callback<Buzz>() { 
     @Override 
     public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
      String buzz_3 = response.body().getBuzz(); //buzz_3="Rice" 
      buzzArrayList.add(new Exchange(buzz_3)); 
      buzzAdapter.notifyDataSetChanged(); 
      } 
     }); 
    } 

我只是想顯示的ListView以這樣的add()順序。

Apple 
Banana 
Rice 

但是,其實listview顯示是這樣的。

Banana 
Rice 
Apple 

Rice 
Banana 
Apple 

如何更改我的代碼顯示爲故意的嗎?我期待着您的回覆。謝謝。

+1

調用API同步 –

回答

0

同步調用API。最好創建一個API.call同時該功能

Call<Buzz> buzz1 = buzz_service.buzz_API("Apple"); 
    buzz1.enqueue(new Callback<Buzz>() { 
    @Override 
    public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
     String buzz_1 = response.body().getBuzz(); //buzz_1="Apple" 
     buzzArrayList.add(new Exchange(buzz_1)); 
     buzzAdapter.notifyDataSetChanged(); 

     Call<Buzz> buzz2 = buzz_service.buzz_API("Banana"); 
     buzz2.enqueue(new Callback<Buzz>() { 
     @Override 
     public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
      String buzz_2 = response.body().getBuzz(); //buzz_2="Banana" 
      buzzArrayList.add(new Exchange(buzz_2)); 
      buzzAdapter.notifyDataSetChanged(); 

      Call<Buzz> buzz2 = buzz_service.buzz_API("Rice"); 
      buzz2.enqueue(new Callback<Buzz>() { 
      @Override 
      public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
       String buzz_3 = response.body().getBuzz(); //buzz_3="Rice" 
       buzzArrayList.add(new Exchange(buzz_3)); 
       buzzAdapter.notifyDataSetChanged(); 
      }}); 
     }}); 
    }}); 
+0

謝謝您的回答!但這種方法不聰明...(如果我打電話給很多API) – NooNoo

+0

@NooNoo是的。它不聰明。異步調用速度更快。在一個ArrayList中添加一個id來區分項目。然後相應地排序! –

+0

添加您的響應結構我可以編輯答案 –

0

「蘋果」,「香蕉」,「大米」被添加到列表中的異步調用的函數,因此 中,他們被添加的順序是不可預測。 您以何種順序編寫異步調用enqueue並不重要。

要添加特定順序的項目, 最好將API_Interface和改造代碼更改爲使用同步方法而不是異步方式。這取決於你的改裝版本 語法是不同的, 按照文檔中的例子:

https://futurestud.io/tutorials/retrofit-synchronous-and-asynchronous-requests

不幸的是,文件指出, 在Android 4.0或更高版本的同步技術導致崩潰:

警告:同步請求觸發Android 4.0或更新版本的應用程序崩潰。你會遇到NetworkOnMainThreadException錯誤。

另一種選擇是通過其他方式序列化調用。 例如,您可以使用Semaphore s = new Semaphore(1), 在每個enqueue調用之前調用s.acquire(),並在每個onResponse調用中調用s.release()

即:

Semaphore s = new Semaphore(1); 

s.acquire(); 
Call<Buzz> buzz1 = buzz_service.buzz_API("Apple"); 
buzz1.enqueue(new Callback<Buzz>() { 
    @Override 
    public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
     String buzz_1 = response.body().getBuzz(); //buzz_1="Apple" 
     buzzArrayList.add(new Exchange(buzz_1)); 
     buzzAdapter.notifyDataSetChanged(); 
     s.release(); 
    } 
}); 

s.acquire(); 
Call<Buzz> buzz2 = buzz_service.buzz_API("Banana"); 
buzz2.enqueue(new Callback<Buzz>() { 
    @Override 
    public void onResponse(Call<Buzz> call, Response<Buzz> response) { 
     String buzz_2 = response.body().getBuzz(); //buzz_2="Banana" 
     buzzArrayList.add(new Exchange(buzz_2)); 
     buzzAdapter.notifyDataSetChanged(); 
     s.release(); 
    } 
}); 

// ... 
+0

我正在使用Retrofit 2.如果我使用execute(),NetworkOnMainThreadExecption是導致....應該使用Asynctask? (對不起英語..) – NooNoo