View Full Version : کلیک برای ریسایکلر ویو
pouria_m90
یک شنبه 22 اسفند 1395, 00:30 صبح
سلام
من یه برنامه دارم که وقتی باز میشه یه ریسایکلر ویو توش هست و وقتی روی هر آیتمش کلیک میشه تو اکتیویتی بعدی دوباره یه ریسایکلر ویو مربوط به همون گزینه باز میشه
ریسایکلر ویو اولی حدود 30 آیتم داره
من برای هر کدوم تو ی آداپترم یه onclick تعریف کردم و تو صفحه ی بعدی یه یه کوئری به دیتابیس زدم
این باعث سنگین شدن برنامه شده
می خوام بدونم راهی هست که بشه با یه onclick همه رو تعریف کنم یا نه
ممنون میشم سریع جوابمو بدین
BOB
یک شنبه 22 اسفند 1395, 11:59 صبح
سلام، برای Recycler عموما به 2 روش عمل میشود:
1. استفاده از رویداد OnTouch خود Recyler به ازای هر آیتم
2. ایجاد رویداد OnClick در Adapter مربوطه
که در حالت دوم بهتر است یک رویداد کلی onClick در Adapter تعریف کرده و همان را در متد OnBindView به view اصلی آیتمهایتان نسبت دهید.
pouria_m90
یک شنبه 22 اسفند 1395, 18:16 عصر
ممنون
اینکارو کردم قبلا
ولی مشکل اینجاست که برنامه سنگین شده
چون 30 تا onclick ساختم و برای هرکدوم یه intent و putextra و گذاشتم
بعد تو صفحه ی بعد دوباره تمام این 30 تا رو فراخوانی کردم
می خوام بدونم راه دیگه ای نداره که سرعت برنامه کم نشه؟
Nevercom
دوشنبه 23 اسفند 1395, 17:32 عصر
یک اینترفیس بساز:
public interface OnItemClickListener {
void onItemClick(View view, int position, Object data);
}
تو کلاس Adapterی که واسه RecyclerView استفاده می کنی، یه متد بساز که اینترفیسی که ساختی رو بعنوان پارامتر قبول کنه و در یک فیلد ذخیره کنه:
private OnItemClickListener mItemClickListener;
public void setOnItemClickListener(final OnItemClickListener itemClickListener) {
this.mItemClickListener = itemClickListener;
}
تو کلاس ViewHolder رو آیتمی که میخوای OnClickListener رو ست کن:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override public void onClick(View v) {
if (mItemClickListener != null) {
int adapterPosition = getAdapterPosition();
mItemClickListener.onItemClick(v, adapterPosition, list.get(adapterPosition));
}
}
}
حالا کافیه جایی که آبجکت Adapter رو داری، متد setOnItemClickListener رو کال کنی:
adapter.setOnItemClickListener(new OnItemClickListener() {
@Override public void onItemClick(View view, int position, Object data) {
}
});
younes372
جمعه 12 خرداد 1396, 09:58 صبح
بهینه ترین حالتشو میگم بهتون .ولی قبلش اینو از من یادگاری داشته باشید چرا نمیرید داکیومنت های اندروید گوگل نمیخونید .شاید بگید زیانم خوب نیست باید بگم برنامه نویسی رو ببوس بزار کنار وقتتو میگیره یا روزی یک ساعت زبان کار کن هر کی خواست بهم ایمیل یا پیام بزنه بهترین راهکار ها رو بهش بگم 09393861966 یونس
خوب یه کلاس درست کنید اینا رو بریزید داخلش
فقط دقت کنید پکیج و عوض کنید ها اصلا کلا تو کد های که میدم هر چیزی که باید عوض بشه و برگرده به نرم افزارتون عوض کنید مثلا من اینجا تو کلاس post تعریف کردم ریسایکلر رو شاید شما تو کلاس مایناکتیویتی تعریف کرده باشید . و نکته دیگه این که باید برای ست کردن دیتا روی ریسایکلر از دیتا مدل استفاده کرده باشید اگر نمیدونید چیه یه کم سخت میشه این کد پیاده کرد .کلاس دیتا مدل یعنی کلاسی که دیتای که قرار ست بشه روی رسایکلر رو اونجا تعریف میکنیم و گتر و ستر هاشو مینویسم .
package ir.aliabdi.younes.app;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
}
کلاس بالا رو باید جای که ریسایکلر ویو شما تعریف شده اونجا به شکل زیر فراخونی کنید .
RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler_post);
Adabterpost aa = new Adabterpost(G.context);
aa.setdatapost(post);
recycler.setAdapter(aa);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(new LinearLayoutManager(G.context, LinearLayout.VERTICAL, false));
recycler.addOnItemTouchListener(new RecyclerTouchListener(G.context, recycler, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
DataPost movie = post.get(position);
Intent i=new Intent(G.context,OpenPost.class);
i.putExtra("title",movie.getTitle());
G.context.startActivity(i);
}
@Override
public void onLongClick(View view, int position) {
DataPost movie = post.get(position);
Toast.makeText(getApplicationContext(),movie.getDe s()+" is selected!", Toast.LENGTH_SHORT).show();
}
}));
دقت کنید میبینید که هم میشه وقتی کلیک کرد بگیم چیکار کنه هم روی ایتم کلیک طولانی کرد بگیم چیکار کنه مگه نه
کلاس های که نیازه برای ساخت ش رو هم ضمیمه کردم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.