【问题标题】:Android RecyclerView does not work properly with data from retrofit requestAndroid RecyclerView 无法正常处理来自改造请求的数据
【发布时间】:2022-01-09 23:58:24
【问题描述】:

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

List with cards

Only manually added card is visible

Full code

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);
}

【问题讨论】:

    标签: java android android-fragments android-recyclerview retrofit


    【解决方案1】:

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

    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
        }      
      });
    

    }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多