Получение нажатия кнопки на элементе представления переработчика, который создается с помощью метода

#java #android #button #android-recyclerview #onclick

Вопрос:

Я довольно новичок в Android Studio и Java в целом, так что это может быть простой вопрос, но я не смог найти никаких решений или либо не смог использовать их для решения своей проблемы.

Таким образом, у меня есть RecyclerView, в который я могу вставлять элементы из списка предварительно определенных элементов с помощью функции «AddItems ()», когда я нажимаю на кнопку и отображаю их.

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

Цель этих кнопок изображений-переключиться на новое действие, которое я определил в методе «AddItems ()».

Но проблема в том, что я не могу поймать-но они реагируют на щелчки — щелчки по этим элементам, а также я не могу передать класс активности или файл макета.

Если быть точным, я хочу использовать эти кнопки для переключения на новое действие и отображения там информации об этом элементе.

Это мой первый вопрос здесь, поэтому, если мне нужно будет показать какой-либо код, пожалуйста, скажите мне об этом.

NewsAdapter.java

 package com.example.yiyecek2.Activities;  import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast;  import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView;  import com.example.yiyecek2.R;  import java.util.List;  public class NewsAdapter extends RecyclerView.Adapterlt;NewsAdapter.NewsViewHoldergt; {  Context mContext;  Listlt;NewsItemgt; mData;    public NewsAdapter(Context mContext, Listlt;NewsItemgt; mData) {  this.mContext = mContext;  this.mData = mData;  }   @NonNull  @Override  public NewsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {  View layout;  layout = LayoutInflater.from(mContext).inflate(R.layout.lyt_restoran,viewGroup,false);  return new NewsViewHolder(layout);  }  // Changed below ----------  @Override  public void onBindViewHolder(@NonNull NewsViewHolder newsViewHolder, int position) {  // Bind data here  newsViewHolder.tvSellerName.setText(mData.get(position).getSellerName());  newsViewHolder.tvSellerAddress.setText(mData.get(position).getSellerAddress());  newsViewHolder.ivSellerImage.setImageResource(mData.get(position).getSellerImage());  newsViewHolder.tvMinCost.setText(mData.get(position).getMinCost());  newsViewHolder.tvMinTime.setText(mData.get(position).getMinTime());  newsViewHolder.tvDeliveryCost.setText(mData.get(position).getDeliveryCost());  newsViewHolder.tvClassToGo.setText(mData.get(position).getClassToGo());  // Line below is the buttons attached to the items which I aim to use on switching Activities  newsViewHolder.ibGoSellerPage.setOnClickListener(new View.OnClickListener(){  @Override  public void onClick(View view) {  Intent intent = new Intent(SiparisActivity.this, classDominos.class);  startActivity(intent); // startActivity is marked red  }  });  }  // Changed above ----------  @Override  public int getItemCount() {  return mData.size();  }   public class NewsViewHolder extends RecyclerView.ViewHolder{  TextView tvSellerName, tvSellerAddress, tvMinCost, tvMinTime, tvDeliveryCost, tvClassToGo;  ImageView ivSellerImage;  ImageButton ibGoSellerPage;   public NewsViewHolder(@NonNull View itemView) {  super(itemView);  tvSellerName = itemView.findViewById(R.id.tvFoodName);  tvSellerAddress = itemView.findViewById(R.id.tvFoodDescription);  ivSellerImage = itemView.findViewById(R.id.ivFoodImage);  tvMinCost = itemView.findViewById(R.id.tvFoodCost);  tvMinTime = itemView.findViewById(R.id.tvMinTime);  tvDeliveryCost = itemView.findViewById(R.id.tvDeliveryCost);  tvClassToGo = itemView.findViewById(R.id.tvClassToGo);  ibGoSellerPage = itemView.findViewById(R.id.ibGoSellerPage);  //int position = getAdapterPosition();  //Toast.makeText(mContext.getApplicationContext(), "Position is: " position, Toast.LENGTH_SHORT).show();   }  } }  

SiparisActivity.java //здесь я перечисляю блюда ресторана с помощью кнопок с изображениями, указанных выше.

 package com.example.yiyecek2.Activities;  import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast;  import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;  import com.example.yiyecek2.R;  import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask;  import recyclerview.CustomItemAnimator;  public class SiparisActivity extends AppCompatActivity {  Button btnListRestaurants;  RecyclerView NewsRecyclerView;  NewsAdapter newsAdapter;  Listlt;NewsItemgt; mData;  ImageButton ibGoSellerPage;   @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);   requestWindowFeature(Window.FEATURE_NO_TITLE);  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);   setContentView(R.layout.activity_siparis);   // Hide the action bar  getSupportActionBar().hide();   NewsRecyclerView = findViewById(R.id.news_rv);  btnListRestaurants = (Button) findViewById(R.id.buttonListRestaurants);   NewsRecyclerView.setLayoutManager(new LinearLayoutManager(this));  NewsRecyclerView.setHasFixedSize(true);  NewsRecyclerView.setItemAnimator(new CustomItemAnimator());    // Get clicks on the "List Restaurants"  btnListRestaurants.setOnClickListener(new View.OnClickListener() {  int restaurantCount = 0;  @Override  public void onClick(View view) {  Toast toast = Toast.makeText(getApplicationContext(), "Listing Restaurants", Toast.LENGTH_SHORT);  toast.show();   Timer timerToTransition;  timerToTransition = new Timer();  TimerTask task = new TimerTask() {  public void run() {  addItems();  restaurantCount  ;  if (restaurantCount gt; 9)  {  System.out.println(restaurantCount);  timerToTransition.cancel(); // Stops the timer when theres 10 Restaurants listed  }  }  };  timerToTransition.scheduleAtFixedRate(task,0,300); // waits 300ms before creating a new Restaurant  }  });   if (ibGoSellerPage != null) // Check if Restaurant button exists  {  System.out.println("ON CLICK HERE");  ibGoSellerPage.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View view) {  System.out.println("ON CLICK HERE");  }  });  }   mData = new ArrayListlt;gt;();  // fill list news with pre defined data   // Adapter ini and setup  newsAdapter = new NewsAdapter(this,mData);  NewsRecyclerView.setAdapter(newsAdapter);  NewsRecyclerView.setLayoutManager(new LinearLayoutManager(this));  }   private void addItems()  {  RecyclerView.State state = null;  int switchInt = 0; // To use in the switch  // Random integer list to assign switchInt a random value   int[] intList;  intList = new int[]{0,1,2,3,4,5,6,7};   // Pick a random int  Random rand = new Random();  int rndInt = rand.nextInt(5);   // Check if the array's index isn't empty(-1)  while (intList[rndInt] != -1)  {  switchInt = (int) intList[rndInt];  intList[rndInt] = -1;  }  //System.out.println(rndInt);  switch(switchInt) {  case 0:  mData.add(0,new NewsItem("Domino's Pizza","Sarıgöl, Ordu Cd. No:128, 34240 Gaziosmanpaşa/İstanbul",  R.drawable.dominos,"32 TL","30 dk.","0 TL","classDominos")); // I'm trying to catch that "classDominos" to use to switch Activity  break;  case 1:  mData.add(0,new NewsItem("Migros","Bağlarbaşı, Küçükköy Yolu Cd., 34245 Gaziosmanpaşa/İstanbul",  R.drawable.migroslogo,"32 TL","25 dk.","0 TL", "classDominos"));  break;  case 2:  mData.add(0,new NewsItem("KFC","Yeşilpınar Mah. Şehit Metinkaya Sok Vialand AVM No:11 Mağaza No:237, 34065 Eyüpsultan",  R.drawable.kfclogo,"32 TL","35 dk.","3 TL", "classDominos"));  break;  case 3:  mData.add(0,new NewsItem("Popeyes","Yeşilpınar Mah. Şehit Metin Kaya Sok. No:11 K:3 Vialand AVM, 34065",  R.drawable.popeyeslogo,"32 TL","35 dk.","3 TL", "classDominos"));  break;  case 4:  mData.add(0,new NewsItem("Mado","İslambey, Hz. Halid Blv. No:43 D:B, 34050 Eyüpsultan/İstanbul",  R.drawable.madologo,"32 TL","35 dk.","3 TL", "classDominos"));  break;  default:  break;  }   System.out.println("Added item");  newsAdapter.notifyItemInserted(0);  NewsRecyclerView.getLayoutManager().smoothScrollToPosition(NewsRecyclerView, state, 0);    // Un-commenting the lines below crash the app when "Listing Restaurants" (Creating items)  //ibGoSellerPage = (ImageButton) findViewById(R.id.ibGoSellerPage);  /*ibGoSellerPage.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View view) {  System.out.println("ON CLICK HERE");  }  });  */  } }  

Я могу видеть отдельные кнопки в профилировщике, но как поймать щелчки по ним? (Вы можете видеть, что я держу кнопку справа) Скриншот профилировщика

Комментарии:

1. у вас есть какой-нибудь список для кнопок изображений? Покажите адаптер представления recyclver и действие, в котором размещается представление recyclver.

2. @BabyishTank Я отредактировал главный пост с ними. Я изо всех сил старался включить OnClickListener, но я получаю сбои, если помещаю его в событие onCreate действия, поскольку кнопка не существует до того, как пользователь нажмет кнопку для перечисления элементов. Поэтому я не мог найти способ это сделать.

Ответ №1:

Я думаю, что проблема с вами в том, что событие щелчка происходит на экране в другом представлении

Сделав прозрачный прямоугольник, я думаю, что щелчок «Перейти к родительскому представлению» Попытается проверить это на примере:

 lt;LinearLayout  android:id="@ id/layout  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:gravity="center_vertical"  android:orientation="horizontal"gt;    lt;ImageButton  android:layout_width="wrap_content"  android:layout_height="wrap_content"/gt;   lt;/LinearLayoutgt;  

обработайте щелчок по layout просмотру, если он работает, поэтому вам нужно изменить кнопку прозрачного прямоугольника на выделенный жирным шрифтом тот или иной подход

лучше добавить немного кода с вашей стороны, чтобы помочь нам хорошо понять проблему

Комментарии:

1. проблема в том, что я не знаю, куда мне следует поместить OnClickListener. Если я включу его в действие onCreate, кнопка не существует, поэтому она вызывает сбой. Я сделал проверку if != null, но все еще не могу поймать щелчки. Так что, вероятно, этого не произойдет с другой точки зрения.

2. Конечно, это приведет к нулевому сбою, потому что кнопка принадлежит элементу списка, поэтому вы должны, но прослушиватель щелчков внутри адаптера, который вы создаете

3. сначала определите значок изображения в держателе просмотра, как вы сделали с помощью TextView, затем откройте значок изображения внутри держателя onBindViewHolder

4. Обновил основной пост с изменениями. Я определил кнопку ImageButton, как вы сказали, и попытался добавить OnClickListener в onBindViewHolder, но функция startActivity отмечена красным цветом, я предполагаю, что здесь она не определена.

5. Для запуска требуется, чтобы вызывался контекст действия, и здесь вы передаете контекст адаптеру, чтобы вы могли использовать свой код, который будет выглядеть так: Намерение намерение = новое намерение(SiparisActivity.this, classDominos.class); mContext.способность к началу(намерение);