使用 Retrofit 2 填充 ListView
Populate ListView using Retrofit 2
我正在尝试使用来自服务器的 JSON 填充 ListView。我正在从服务器获取数据,但我似乎无法弄清楚如何将它放入 ListView 中。我得到的错误是在 onResponse 中。
它说:“错误:(84、54)错误:class JucatoriLiberiArrayAdapter 中的构造函数 JucatoriLiberiArrayAdapter 不能应用于给定类型;
必需:上下文,ArrayList
发现:FragmentActivity,Call>
原因:实参Call>无法通过方法调用转换为ArrayList
我想我已经尝试了几乎所有的 Alt+Enter 修复方法。还尝试将类型从 Call<ArrayList<FreePlayers>
更改为仅 ArrayList<>
或仅 Call<>
.
这是我的 class:
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
final Retrofit builder = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.baseUrl(ROOT)
.build();
REST_CLIENT = builder.create(API.class);
final Call<FreePlayers> request = REST_CLIENT.getFreePlayers(1);
request.enqueue(new Callback<FreePlayers>() {
@Override
public void onResponse(final Call<FreePlayers> call, final Response<FreePlayers> response) {
ArrayList<FreePlayers> players = null;
players = call;
ListView lv = (ListView) getView().findViewById(android.R.id.list);
JucatoriLiberiArrayAdapter adapter = new JucatoriLiberiArrayAdapter(getActivity(),
players);
lv.setAdapter(adapter);
}
@Override
public void onFailure(final Call<FreePlayers> call, final Throwable t) {
}
});
}
我的API界面:
public interface API {
@FormUrlEncoded
@POST("/fan-sport/app-test/")
Call<ArrayList<FreePlayers>> getFreePlayers(@Field("getFreePlayers") int freePlayers);
}
这是我的自定义适配器:
public class JucatoriLiberiArrayAdapter extends BaseAdapter {
private Context context;
private ArrayList<FreePlayers> players;
public JucatoriLiberiArrayAdapter(Context context, ArrayList<FreePlayers> playersList) {
super();
this.context = context;
this.players = playersList;
}
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(final int position) {
return null;
}
@Override
public long getItemId(final int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_view_jucatori_liberi, null);
TextView playerName = (TextView) convertView.findViewById(R.id.name);
playerName.setText((CharSequence) players.get(position));
}
return convertView;
}
}
在您的 onResponse()
中,您收到一个 Call
对象,而您的适配器需要一个 List<FreePlayers>
,响应参数是您要提供给适配器的播放器列表。
试试这个代码:
final Call<List<FreePlayers>> request = REST_CLIENT.getFreePlayers(1);
request.enqueue(new Callback<List<FreePlayers>>() {
@Override
public void onResponse(final Call<List<FreePlayers>> call, final Response<List<FreePlayers>> response) {
ArrayList<FreePlayers> players = null;
players = response.body();
ListView lv = (ListView) getView().findViewById(android.R.id.list);
JucatoriLiberiArrayAdapter adapter = new JucatoriLiberiArrayAdapter(getActivity(),
players);
lv.setAdapter(adapter);
}
@Override
public void onFailure(final Call<FreePlayers> call, final Throwable t) {
}
});
呼叫已分配给玩家,但玩家类型为 ArrayList<FreePlayers>
,呼叫类型为 Call<List<FreePlayers>
。不一样。适配器需要 ArrayList<FreePlayers>
.
您要声明
Call<FreePlayers>,
但希望收到
Call<ArrayList<FreePlayers>>.
另外,您的适配器坏了。这些方法应该类似于:
@Override
public int getCount() {
if (players == null) return 0;
return players.size();
}
@Override
public Object getItem(final int position) {
if (players == null || players.size() == 0) return null;
return players.get(position);
}
@Override
public long getItemId(final int position) {
return getItem(position).getId(); // or something like an id that suits you.
}
我正在尝试使用来自服务器的 JSON 填充 ListView。我正在从服务器获取数据,但我似乎无法弄清楚如何将它放入 ListView 中。我得到的错误是在 onResponse 中。
它说:“错误:(84、54)错误:class JucatoriLiberiArrayAdapter 中的构造函数 JucatoriLiberiArrayAdapter 不能应用于给定类型; 必需:上下文,ArrayList 发现:FragmentActivity,Call> 原因:实参Call>无法通过方法调用转换为ArrayList
我想我已经尝试了几乎所有的 Alt+Enter 修复方法。还尝试将类型从 Call<ArrayList<FreePlayers>
更改为仅 ArrayList<>
或仅 Call<>
.
这是我的 class:
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
final Retrofit builder = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.baseUrl(ROOT)
.build();
REST_CLIENT = builder.create(API.class);
final Call<FreePlayers> request = REST_CLIENT.getFreePlayers(1);
request.enqueue(new Callback<FreePlayers>() {
@Override
public void onResponse(final Call<FreePlayers> call, final Response<FreePlayers> response) {
ArrayList<FreePlayers> players = null;
players = call;
ListView lv = (ListView) getView().findViewById(android.R.id.list);
JucatoriLiberiArrayAdapter adapter = new JucatoriLiberiArrayAdapter(getActivity(),
players);
lv.setAdapter(adapter);
}
@Override
public void onFailure(final Call<FreePlayers> call, final Throwable t) {
}
});
}
我的API界面:
public interface API {
@FormUrlEncoded
@POST("/fan-sport/app-test/")
Call<ArrayList<FreePlayers>> getFreePlayers(@Field("getFreePlayers") int freePlayers);
}
这是我的自定义适配器:
public class JucatoriLiberiArrayAdapter extends BaseAdapter {
private Context context;
private ArrayList<FreePlayers> players;
public JucatoriLiberiArrayAdapter(Context context, ArrayList<FreePlayers> playersList) {
super();
this.context = context;
this.players = playersList;
}
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(final int position) {
return null;
}
@Override
public long getItemId(final int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_view_jucatori_liberi, null);
TextView playerName = (TextView) convertView.findViewById(R.id.name);
playerName.setText((CharSequence) players.get(position));
}
return convertView;
}
}
在您的 onResponse()
中,您收到一个 Call
对象,而您的适配器需要一个 List<FreePlayers>
,响应参数是您要提供给适配器的播放器列表。
试试这个代码:
final Call<List<FreePlayers>> request = REST_CLIENT.getFreePlayers(1);
request.enqueue(new Callback<List<FreePlayers>>() {
@Override
public void onResponse(final Call<List<FreePlayers>> call, final Response<List<FreePlayers>> response) {
ArrayList<FreePlayers> players = null;
players = response.body();
ListView lv = (ListView) getView().findViewById(android.R.id.list);
JucatoriLiberiArrayAdapter adapter = new JucatoriLiberiArrayAdapter(getActivity(),
players);
lv.setAdapter(adapter);
}
@Override
public void onFailure(final Call<FreePlayers> call, final Throwable t) {
}
});
呼叫已分配给玩家,但玩家类型为 ArrayList<FreePlayers>
,呼叫类型为 Call<List<FreePlayers>
。不一样。适配器需要 ArrayList<FreePlayers>
.
您要声明
Call<FreePlayers>,
但希望收到
Call<ArrayList<FreePlayers>>.
另外,您的适配器坏了。这些方法应该类似于:
@Override
public int getCount() {
if (players == null) return 0;
return players.size();
}
@Override
public Object getItem(final int position) {
if (players == null || players.size() == 0) return null;
return players.get(position);
}
@Override
public long getItemId(final int position) {
return getItem(position).getId(); // or something like an id that suits you.
}