#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?