#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.способность к началу(намерение);