2017-11-18 221 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