Работа с 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, по которому было осуществлено нажатие.
Ответы (1 шт):
Как вам уже было предложено в комментариях, такую задачу лучше решать через другой тип контейнера. На мой взгляд лучше всего подойдет 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 сделать обработку того что нажато. В коде выше в адаптер передается модель немного другая, но суть я думаю вы поймете. Рекомендую также ознакомиться с таким прекрасным примером для начала решения вашей задачи.

