Как передать ArrayList из адаптера в активность?

Мне нужно отправить ArrayList list_add в действие, но я не знаю, как я могу это сделать, если возможно, поделиться им в основном действии для использования в будущем. Кто-нибудь может помочь мне реализовать метод для этого? ниже есть MainAdatper для recyclerview, где у меня есть list_add, и я хочу передать его в основное действие, и после того, как я могу добавить его в

class MainAdapter extends RecyclerView.Adapter <MainAdapter.ViewHolder> {

    private static int lastCheckedPos = 0;
    ArrayList<String> list_add = new ArrayList<>();
    ArrayList<String> lista_show;
    private Context context;
    String t;    

    public MainAdapter(ArrayList<String> lista_shows, Context context) {
        lista_show = lista_shows;
    }

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

    @Override
    public void onBindViewHolder(final MainAdapter.ViewHolder holder, final int position) {

        holder.mdevice.setText (lista_show.get (position));
        holder.cardView.setOnLongClickListener (new View.OnLongClickListener () {
            @Override
            public boolean onLongClick(View v) {
                t = lista_show.get(position);
                if (list_add.contains(t)) {
                    Toast.makeText(v.getContext (), t+"Already Selected", Toast.LENGTH_SHORT).show();
                } else {
                    list_add.add(t);
                    holder.cardView.setCardBackgroundColor(Color.parseColor("#60B5EC"));
                    Toast.makeText(v.getContext (), t+"Added", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                t = lista_show.get (position);
                holder.cardView.setCardBackgroundColor(Color.WHITE);
                if (! list_add.contains(t)) {
                    Toast.makeText(v.getContext (), "Long press for add", Toast.LENGTH_SHORT).show();
                } else {
                    list_add.remove(t);
                    Toast.makeText(v.getContext (), t+"Removed", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView mdevice;
        CardView cardView;

        public ViewHolder( View itemView) {
            super (itemView);
            mdevice = itemView.findViewById (R.id.device);
            cardView = itemView.findViewById (R.id.mcardview);
        }
    }
}
0
0
806
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Добавить интерфейс для обратного вызова:
public interface ListOwner {
  void push(ArrayList<String> list);
}
  1. Установите ссылку в адаптере:
private ListOwner listOwner;

public MainAdapter(ArrayList<String> lista_shows, Context context, ListOwner owner) {
  this.lista_show = lista_shows;
  this.listOwner = owner;
}
  1. Вызовите его в адаптере, когда вам нужно:
if (listOwner != null) {
  listOwner.push(list_add);
}
  1. Конечно, реализовать ListOwner своей деятельностью:
public class MyActivity extends AppCompatActivity implements ListOwner {
 // all code

  // create instance of adapter:
  mAdapter = new MainAdapter(list_show, MyActivity.this, MyActivity.this);


  @Override
  public void push(ArrayList<String> list) {
     // you have the list here
  }
}

P.S.

Вы можете опустить интерфейс и передать ссылку на Activity напрямую (MyActivity в образце)

когда я пытаюсь добавить этот код, возникает ошибка в lista_show в основном общедоступном MainAdapter (ArrayList<String> lista_shows, Context context, ListOwner owner) { // весь ваш код this.listOwner = owner; }

Developers 09.05.2019 21:43

@ Разработчики, какую ошибку вы получаете? (см. также обновленный ответ, часть 2)

S-Sh 09.05.2019 22:00

@ Разработчики, 1) какой подход (с интерфейсом или без) вы используете? 2) как вы создаете экземпляр адаптера?

S-Sh 11.05.2019 19:34

mRecicleView = findViewById (R.id.Reclycler_View); mRecicleView.setHasFixedSize (истина); mLayoutManager = новый GridLayoutManager (dasboard.this,2); mAdapter = новый основной адаптер (lista_show, dasboard.this); mRecicleView.setLayoutManager (mLayoutManager); mRecicleView.setAdapter (мАдаптер); запустить анимацию (mRecicleView, 0);

Developers 11.05.2019 23:08

@ Разработчики, если вы добавляете параметр в конструктор адаптера, вы должны передать фактический аргумент из вызывающего кода: mAdapter = new MainAdapterlista_show, dashboard.this, dashboard.this) (я полагаю, dashboard это ваша деятельность) - см. пункт 4.

S-Sh 12.05.2019 13:09

если я хочу использовать setOnClickListener? для добавления list_add в мою базу данных? Спасибо за вашу помощь.

Developers 12.05.2019 22:54

Другие вопросы по теме