Как из адаптера передать данные в Activity
Есть Activity, в котором ListView. Для этого ListView есть адаптер. Мне нужно каким-то образом при клике (viewHolder.item.setOnClickListener(new View.OnClickListener() {) из адаптера, передать в Activity что-то и получить оттуда это значение.
Сколько гуглил, так и не нашёл решение. Там в основном решения с переходом в само Activity и Extra-параметры, что мне не подходит. Мне НЕ нужно открывать Activity при клике, мне нужно лишь как-то передать туда данные и получить их оттуда.
Код адаптера:
public class WithdrawPaymentsSystemsAdapter extends BaseAdapter {
private Context context;
private ArrayList<WithdrawPaymentsSystemsObj> items;
int selected_position = 0;
WithdrawPaymentsSystemsAdapter(Context context, ArrayList<WithdrawPaymentsSystemsObj> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final WithdrawPaymentsSystemsAdapter.ViewHolder viewHolder;
viewHolder = new WithdrawPaymentsSystemsAdapter.ViewHolder();
if(convertView == null) {
convertView = LayoutInflater.from(context).
inflate(R.layout.layout_list_view_withdraw_payments_systems, parent, false);
}
WithdrawPaymentsSystemsObj currentItem = (WithdrawPaymentsSystemsObj) getItem(position);
viewHolder.item = (LinearLayout) convertView.findViewById(R.id.item);
viewHolder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// как-то тут передать что-то в Activity
}
});
((ImageView) convertView.findViewById(R.id.icon)).setImageResource(currentItem.getItemIcon());
((TextView) convertView.findViewById(R.id.title)).setText(currentItem.getItemTitle());
((TextView) convertView.findViewById(R.id.description)).setText(currentItem.getItemDescription());
((EditText) convertView.findViewById(R.id.id)).setText(currentItem.getItemId());
return convertView;
}
private class ViewHolder {
LinearLayout item;
RadioButton payment_system_rb;
}
}
Код ListView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/item"
android:background="@drawable/style_items_withdraw_payments_systems"
android:paddingTop="13dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingBottom="15dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/icon"
android:layout_width="32dp"
android:layout_height="32dp" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:orientation="vertical"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:textSize="15sp"
android:textColor="@color/colorLightBlack"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/description"
android:textSize="15sp"
android:textColor="#808080"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:gravity="end"
android:layout_gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/payment_system_rb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
Ответы (2 шт):
Создаете интерфейс вроде такого:
interface OnItemClickListener {
void onClick(data: YourData);
}
Реализуете его в Activity/Fragment:
class YourActivity extends AppCompatActivity() implements OnItemClickListener {
// some code
private WithdrawPaymentsSystemsAdapter adapter = new WithdrawPaymentsSystemsAdapter(this, ваш список, this);
// первый аргумент вы передаете туда как контекст this (к примеру если тут будет фрагмент то вы передадите requaireCotext()), третий как класс который реализует OnItemClickListener - this
@Override
public void onClick(data: YourData) {
// обрабатываете здесь ваши данные
}
}
Кладете в ваш адаптер в конструктор (или отдельный метод setListener())
public class WithdrawPaymentsSystemsAdapter extends BaseAdapter {
private Context context;
private ArrayList<WithdrawPaymentsSystemsObj> items;
private OnItemClickListener listener;
int selected_position = 0;
WithdrawPaymentsSystemsAdapter(Context context, ArrayList<WithdrawPaymentsSystemsObj> items, OnItemClickListener listener) {
this.context = context;
this.items = items;
this.listener = listener;
}
// some code
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// some code
viewHolder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClick(data); // вот сюда вы и должны передать ваши данные
}
});
// some code
return convertView;
}
}
Используйте котлин и сделайте следующим образом
class WithdrawPaymentsSystemsAdapter : BaseAdapter {
var onItemClick: ((Model) -> (Unit))? = null // Model - тип ваших данных
override fun getView(position: Int, convertView: View, parent: ViewGroup) {
// some code
viewHolder.item.setOnClickListener {
onItemClick?.invoke(data[position]) // оправьте ваши данные
}
return convertView;
}
}
В вашей активити вызовите следующее
adapter.onItemClick = { model ->
// можете использовать ваши данные как model, например
send(model.name)
}