2016-06-06 3 views
0

TabLayout нашего MainActivity создает экземпляр этого фрагмента, который имеет RecyclerView с каждым отдельным элементом, являющимся CardView. Данные извлекаются с сервера базы данных и обновляются адаптер. Адаптер привязывается к ViewHolder, и ViewHolder должен обновлять виджеты CardView с данными сервера.Данные ViewHolder связаны, но почему обновление виджета не происходит?

Это видение, но ViewHolder не обновляет виджет TextView CardView. Он по-прежнему отображает жестко заданное по умолчанию значение из макета xml.

Чтобы проверить, я добавил точки останова и логические операторы внутри адаптера и ViewHolder и прошел через него. Все выглядело хорошо.

Везде, где я поместил оператор журнала, он зарегистрировал правильные данные.

Если привязка данных кажется прекрасной, и нет других ошибок, то почему метод метода привязки ViewHolder не обновляет TextView?

public class ModelsFragment extends Fragment { 

private final String API_KEY = "INSERT API KEY HERE"; 

private static final String ARG_CATEGORY = "model_category"; 
private String mCategory; 

private RecyclerView mModelRecyclerView; 
private ModelAdapter mModelAdapter; 

private List<Model> mModels; 

public static Fragment newInstance(String category) { 
    Bundle args = new Bundle(); 
    args.putString(ARG_CATEGORY, category); 
    ModelsFragment modelsFragment = new ModelsFragment(); 
    modelsFragment.setArguments(args); 

    return modelsFragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mCategory = getArguments().getString(ARG_CATEGORY); 

    final ProgressDialog progressDialog = new ProgressDialog(getActivity(), R.style.ProgressDialogTheme); 
    progressDialog.setCancelable(false); 
    progressDialog.setProgressStyle(android.R.style.Widget_ProgressBar); 
    progressDialog.show(); 

    EdmundsService service = EdmundsServiceGenerator.createService(EdmundsService.class); 

    Map<String, String> options = new HashMap<>(); 
    options.put("state", "new"); 
    options.put("year", "2016"); 
    options.put("view", "basic"); 
    options.put("api_key", API_KEY); 
    if (mCategory != null) { 
     options.put("category", mCategory); 
    } 

    // Use the hash map to actually query the backend API server with a GET request. 
    Call<Models> call = service.getModels(options); 
    call.enqueue(new Callback<Models>() { 
     @Override 
     public void onResponse(Call<Models> call, Response<Models> response) { 
      if (response.isSuccessful()) { 
       mModels = response.body().getModels(); 
       progressDialog.dismiss(); 
       updateUI(); 
       Log.i("GET Status", "Successfully retrieved data"); 
       Log.i("GET Status", response.body().getModelsCount().toString()); 
      } 
      else { 
       Log.i("GET Status", "Failed to retrieve data"); 
      } 
     } 

     @Override 
     public void onFailure(Call<Models> call, Throwable t) { 
      Log.e("Error retrieving data", t.getMessage()); 
     } 
    }); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mModelRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_models, container, false); 
    mModelRecyclerView.setHasFixedSize(true); 
    mModelRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    updateUI(); 

    return mModelRecyclerView; 
} 

private void updateUI() { 
    mModelAdapter = new ModelAdapter(mModels); 
    mModelRecyclerView.setAdapter(mModelAdapter); 
} 

public class ModelHolder extends RecyclerView.ViewHolder { 

    private Model model; 
    private TextView mName; 

    public ModelHolder(LayoutInflater inflater, ViewGroup parent) { 
     super(inflater.inflate(R.layout.fragment_models_card_view_item, parent, false)); 
     View view = inflater.inflate(R.layout.fragment_models_card_view_item, parent, false); 

     mName = (TextView) view.findViewById(R.id.card_view_name); 
    } 

    public void bindModel(Model model) { 
     this.model = model; 

     // This if statement added to prevent null object reference errors. 
     if (this.model != null) { 
      // Data correctly logged. 
      Log.i("Inside IF statement", this.model.getName()); 

      mName.setText(this.model.getName()); // Why doesn't this update? 
     } 

     // Data correctly logged. 
     Log.i("Bound model", String.valueOf(this.model.getName())); 
    } 

} 

public class ModelAdapter extends RecyclerView.Adapter<ModelHolder> { 
    // Set number of Cards in the recycler view. 
    private List<Model> models; 

    public ModelAdapter(List<Model> models) { 
     this.models = models; 
    } 

    @Override 
    public ModelHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ModelHolder(LayoutInflater.from(parent.getContext()), parent); 
    } 

    @Override 
    public void onBindViewHolder(ModelHolder holder, int position) { 
     // For our list of models, get one model by position and bind it to our view holder class. 
     Model model = models.get(position); 

     Log.i("Just prior to binding", model.getName()); 

     holder.bindModel(model); 
    } 

    @Override 
    public int getItemCount() { 
     return models == null ? 0 : models.size(); 
    } 
} 
} 
+0

Попробуйте запустить 'updateUI()' в потоке пользовательского интерфейса. – dharms

ответ

0

Вы накачивания 2 просмотров в вашем ModelHolder

public ModelHolder(LayoutInflater inflater, ViewGroup parent) { 
     super(inflater.inflate(R.layout.fragment_models_card_view_item, parent, false)); 
     View view = inflater.inflate(R.layout.fragment_models_card_view_item, parent, false); 

     mName = (TextView) view.findViewById(R.id.card_view_name); 
    } 

мнение, вы передаете супер вызова вид вы показываете. Вид, который вы раздуваете после этого, не отображается (и это то, что вы используете, чтобы найти mName), поэтому вы не видите изменений. Вы должны только раздувать один вид и передавать его в ModelHolder, чтобы вы могли искать свой вид R.id.card_view_name.

Ex.

public ModelHolder(View view) { 
     super(view); 
     mName = (TextView) view.findViewById(R.id.card_view_name); 
    } 

и адаптеры onCreateViewHolder

@Override 
public ModelHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_models_card_view_item, parent, false); 
    return new ModelHolder(view); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^