Работа с linearLayout

У меня есть linearLayout с названием upgrades

upgrades = (LinearLayout) getView().findViewById(R.id.upgrades);

А также у меня есть слушатель нажатий.

upgrades.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                int a = 0;
                System.out.println(a);
            }
        });

Как я могу получить номер элемента, входящего в состав linerLayout, по которому было осуществлено нажатие.

Вот пример LinearLayout скрин программы


Ответы (1 шт):

Автор решения: Andrew

Как вам уже было предложено в комментариях, такую задачу лучше решать через другой тип контейнера. На мой взгляд лучше всего подойдет RecyclerView на базе GridLayoutManager. Для примера по итогу работы можно получить такое:

введите сюда описание изображения

и вроде почти то что вам нужно в плане двух столбцов и тп. Вот есть два примера чтобы можно было приобщиться: один и два.

Но прежде чем начать реализацию вам нужно создать модель данных которая будет отображаться в данном списке. Я честно говоря не очень понял что и от чего на вашем скриншоте зависит, поэтому могу предложить приблизительно такое:

public class DataModel {

    public String title;
    public int itemId;
    public String subtitle;

    public DataModel(String mTitle, int mId, String mSbTitle)
    {
        this.title=mTitle;
        this.itemId=mId;
        this.subtitle=mSbTitle;
    }
}

Суть вот в чем - в активности/фрагменте где у вас будет находиться данный список вы производите начальное формирование массива данных. Те строки и названия типа "Улучшение 3" вы ведь где-то берёте. Значит будет массивчик такого вида:

ArrayList<DataModel> mArray = new ArrayList();
mArray.add(new DataModel("Улучшение 3", 1, "стоит 3 числа"));

и так до самого конца. Я добавил в модель поле id так как не знаю есть ли у вас оно по требованию или нет. Дальше вам нужно создать xml одного элемента в вашем списке который будет использоваться и для отображения данных (так например):

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    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="120dp"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    app:cardCornerRadius="5dp"
    app:cardElevation="5dp">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
 
        <ImageView
            android:id="@+id/idIVcourseIV"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            android:contentDescription="@string/image"
            android:src="@mipmap/ic_launcher" />
 
        <TextView
            android:id="@+id/idTVCourse"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:textAlignment="center" />
 
    </LinearLayout>
 
</androidx.cardview.widget.CardView>

После этого вы создаете адаптер (это отдельный класс который будет заведовать заполнением, отображением, и обработкой ваших кликов), вот например так:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {
 
    private ArrayList<RecyclerData> courseDataArrayList;
    private Context mcontext;
 
    public RecyclerViewAdapter(ArrayList<RecyclerData> recyclerDataArrayList, Context mcontext) {
        this.courseDataArrayList = recyclerDataArrayList;
        this.mcontext = mcontext;
    }
 
    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // Inflate Layout
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false);
        return new RecyclerViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
        // Set the data to textview and imageview.
        RecyclerData recyclerData = courseDataArrayList.get(position);
        holder.courseTV.setText(recyclerData.getTitle());
        holder.courseIV.setImageResource(recyclerData.getImgid());
    }
 
    @Override
    public int getItemCount() {
        // this method returns the size of recyclerview
        return courseDataArrayList.size();
    }
 
    // View Holder Class to handle Recycler View.
    public class RecyclerViewHolder extends RecyclerView.ViewHolder {
 
        private TextView courseTV;
        private ImageView courseIV;
 
        public RecyclerViewHolder(@NonNull View itemView) {
            super(itemView);
            courseTV = itemView.findViewById(R.id.idTVCourse);
            courseIV = itemView.findViewById(R.id.idIVcourseIV);
        }
    }
}

В активности/фрагменте передаете в адаптер заполненный массив и все:

RecyclerViewAdapter adapter=new RecyclerViewAdapter(mArray,this);
GridLayoutManager layoutManager=new GridLayoutManager(this,2);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);

Связь между активностью и адаптером можно сделать через интерфейс (вот так например) и в активности вам нужно будет просто через какой-нибудь например switch-case сделать обработку того что нажато. В коде выше в адаптер передается модель немного другая, но суть я думаю вы поймете. Рекомендую также ознакомиться с таким прекрасным примером для начала решения вашей задачи.

→ Ссылка