Android RecyclerView无法正确处理来自改装请求的数据



我在RecyclerView中有一个包含CardViews的屏幕。每个卡的数据都是从ArrayList中检索的。一旦我手动将数据添加到ArrayList,一切都会正常工作。但是,当API使用改装添加数据时,只有在至少一个元素手动添加到ArrayList时,才会显示卡片。此外,如果我切换到另一个菜单,然后返回到卡片列表,则只显示手动添加的卡片。

带有卡片的列表

只有手动添加的卡才可见

全代码

public class CurrencyRates extends Fragment {
ArrayList<CurrencyModel> currencyModelArrayList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_currency_rates, container, false);
currencyModelArrayList = new ArrayList<>();
getRates("EUR", "USD");
getRates("USD", "AUD");
getRates("EUR", "GBP");
getRates("EUR", "CNY");
currencyModelArrayList.add(new CurrencyModel("EUR", "CZK", 24.8821));
RecyclerView currencyRV;
currencyRV = view.findViewById(R.id.RVCurrency);
CurrencyAdapter currencyAdapter = new CurrencyAdapter(getActivity().getBaseContext(), currencyModelArrayList);
//cardview two columns
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity().getBaseContext(), 2);
currencyRV.setLayoutManager(mLayoutManager);
currencyRV.setAdapter(currencyAdapter);
return view;
}
public void getRates(String baseCurrency, String exchangeCurrency) {
RetrofitInterface retrofitInterface = RetrofitClient.getRetrofitInstance().create(RetrofitInterface.class);
Call<JsonObject> call = retrofitInterface.getData(baseCurrency, exchangeCurrency);
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
JsonObject res = response.body();
JsonPrimitive rate = res.getAsJsonObject().getAsJsonPrimitive("conversion_rate");
currencyModelArrayList.add(new CurrencyModel(baseCurrency, exchangeCurrency, Double.parseDouble(rate.toString())));
}
public void onFailure(Call<JsonObject> call, Throwable t) {
}
});
}}

适配器类别:

public class CurrencyAdapter extends RecyclerView.Adapter<CurrencyAdapter.ViewHolder> {
private Context context;
private ArrayList<CurrencyModel> currencyModelArrayList;
public CurrencyAdapter(Context context, ArrayList<CurrencyModel> currencyModelArrayList) {
this.context = context;
this.currencyModelArrayList = currencyModelArrayList;
}
@NonNull
@Override
public CurrencyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CurrencyAdapter.ViewHolder holder, int position) {
CurrencyModel model = currencyModelArrayList.get(position);
holder.baseCurrencyTV.setText(model.getBaseCurrency());
holder.exchangeCurrencyTV.setText("/ " + model.getExchangeCurrency());
holder.rateTV.setText(String.valueOf(model.getRate()));
}
@Override
public int getItemCount() {
return currencyModelArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView baseCurrencyTV, exchangeCurrencyTV, rateTV;
public ViewHolder(@NonNull View itemView) {
super(itemView);
baseCurrencyTV = itemView.findViewById(R.id.TVBaseCurrency);
exchangeCurrencyTV = itemView.findViewById(R.id.TVExchangeCurrency);
rateTV = itemView.findViewById(R.id.TVRate);
}
}}

主要活动:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Navigation
BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.currencyRates, R.id.converter).build();
NavController navController = Navigation.findNavController(this, R.id.fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(bottomNavigationView, navController);
}}

改装:

public class RetrofitClient {
private static Retrofit retrofit;
private static RetrofitClient instance;
public static RetrofitInterface myRetrofitInterface;
public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(RetrofitInterface.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
public interface RetrofitInterface {
String BASE_URL = "https://v6.exchangerate-api.com/";
@GET("v6/API_KEY/pair/{baseCurrency}/{exchangeCurrency}")
Call<JsonObject> getData(@Path("baseCurrency") String baseCurrency,
@Path("exchangeCurrency") String exchangeCurrency);
}

当您将项目添加到列表中时,您应该通知适配器

public void getRates(String baseCurrency, String         exchangeCurrency) {
RetrofitInterface retrofitInterface =   RetrofitClient.getRetrofitInstance().create(RetrofitInterface.class);
Call<JsonObject> call = retrofitInterface.getData(baseCurrency, exchangeCurrency);
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
JsonObject res = response.body();
JsonPrimitive rate = res.getAsJsonObject().getAsJsonPrimitive("conversion_rate");
currencyModelArrayList.add(new CurrencyModel(baseCurrency, exchangeCurrency, Double.parseDouble(rate.toString())));           
CurrencyAdapter.notifyDataSetChanged();// add this line
}      
});

}}

最新更新