Не удается добавить элемент в представление recycler из другого действия

#java #android #android-recyclerview #cardview

#java #Android #android-recyclerview #cardview

Вопрос:

Привет, я уже просмотрел несколько сообщений об этом и перепробовал все, на что отвечали люди, но мне не повезло.

Что я пытаюсь сделать, так это то, что пользователь нажимает плавающую кнопку и переходит к другому действию, где пользователь должен ввести имя и количество посещений, чтобы добавить другое представление карточки с этой информацией. Я перепробовал все notifydatasetchanged(), notifyitemsinserted(), но мне не повезло.

Что я сделал, так это:

  private RecyclerView recycler;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager lManager;
List<Anime> items = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Inicializar Animes


    items.add(new Anime(R.drawable.angel, "Angel Beats", 230));
    items.add(new Anime(R.drawable.death, "Death Note", 456));
    items.add(new Anime(R.drawable.fate, "Fate Stay Night", 342));
    items.add(new Anime(R.drawable.nhk, "Welcome to the NHK", 645));
    items.add(new Anime(R.drawable.suzumiya, "Suzumiya Haruhi", 459));

    // Obtener el Recycler
    recycler = (RecyclerView) findViewById(R.id.reciclador);
    recycler.setHasFixedSize(true);

    // Usar un administrador para LinearLayout
    lManager = new LinearLayoutManager(this);
    recycler.setLayoutManager(lManager);

    // Crear un nuevo adaptador
    adapter = new AnimeAdapter(items);
    recycler.setAdapter(adapter);

}

public void agregar (View view){
    Intent intent = new Intent(this ,AgregarActivity.class);
    startActivity(intent);

}

public void agregarItem(Anime anime){
    items.add(anime);
    adapter.notifyItemInserted(items.size() -1);
}
  

Мой адаптер

 public class AnimeAdapter extends RecyclerView.Adapter<AnimeAdapter.AnimeViewHolder> {

private List<Anime> items;

public static class AnimeViewHolder extends RecyclerView.ViewHolder {
    // Campos respectivos de un item
    public ImageView imagen;
    public TextView nombre;
    public TextView visitas;

    public AnimeViewHolder(View v) {
        super(v);
        imagen = (ImageView) v.findViewById(R.id.imagen);
        nombre = (TextView) v.findViewById(R.id.nombre);
        visitas = (TextView) v.findViewById(R.id.visitas);
        ((ImageButton) v.findViewById(R.id.detalle)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent (v.getContext(), AgregarActivity.class);
                intent.putExtra("nom", nombre.getText().toString());
                v.getContext().startActivity(intent);
            }
        });
    }
}

public AnimeAdapter(List<Anime> items) {
    this.items = items;
}



@Override
public int getItemCount() {
    return items.size();
}

@Override
public AnimeViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.anime_card, viewGroup, false);
    return new AnimeViewHolder(v);
}

@Override
public void onBindViewHolder(AnimeViewHolder viewHolder, int i) {
    viewHolder.imagen.setImageResource(items.get(i).getImagen());
    viewHolder.nombre.setText(items.get(i).getNombre());
    viewHolder.visitas.setText("Visitas:"   items.get(i).getVisitas());

}

public void agregarItem(Anime anim){
    items.add(anim);
    notifyDataSetChanged();

}
  

и мое другое действие

  MainActivity main = new MainActivity();
public void agregar(View view) {
    EditText nom = ((EditText) findViewById(R.id.etNombre));
    EditText vis = ((EditText) findViewById(R.id.etVisitas));
    Anime anime = new Anime(R.drawable.house, nom.getText().toString(), Integer.parseInt(vis.getText().toString()));
    MainActivity activity = new MainActivity();
    activity.agregarItem(anime);
}
  

РЕШАЕМАЯ:

Что я сделал, так это то, что вместо использования startActivity в MainActivity я использовал startActivityForResult, а затем вернул данные и обработал их с помощью переопределяющего метода в activityresult

Комментарии:

1. Вы меняете коллекцию действий, но должны изменить коллекцию адаптеров — public void agregarItem(anime аниме){ items.agregarItem(аниме); } — внутренняя активность

2. Я думаю, что я не понял, в моем классе adapter у меня есть метод agregarItem(), который получает объект, добавляет его в ArrayList адаптера и уведомляет его. Но при обычном выполнении изменения я не могу установить AnimeAdapter, потому что мне нужно передать список через конструктор.

3. У вас есть функция agregarItem (аниме аниме) как в действии, так и в адаптере. Почему вы вызываете activity.agregarItem (аниме); вы добавляете элемент в коллекцию activity, а адаптер не знает об этой коллекции, потому что у adpater есть своя собственная. Вы пробовали мой код

4. Я запутался, потому что назвал их одинаково, ха-ха, но я понял. Уже пробовал, ошибок нет, но мое представление recycler в MainActivity не изменилось. Я сделал это: pastebin.com/qJ8PxDe3

5. что вы подразумеваете под MainActivity main = new MainActivity() . вы создаете экземпляр activity?