رفتن به مطلب
  • 0

مشکل در اجرای interface


coco

سوال

سلام دوستان

من اومدم داخل فرگمنتم یه ریسایکلر ویو گذاشتم و یه اینترفیس ساختم که کلیک شدنه آیتما رو از اکتیویتی کنترل کنم

حالا مشکل داره

 

کده اینترفیس :

public interface ItemClickListener{
        public abstract void onItemClick(int ID,String text);
    }

اینم متودی که تعریف کردم و از توی کلیک لیسنر ها داخله Adapter عه ریسایکلر ویو اجراش میکنم :

public void OnItemClick(int ID,String text){
        FehrestList.itemClickListener.onItemClick(ID,text);
    }

پیشاپیش ممنون از راهنمایی هاتون :give_rose:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

4 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

ببینید دوست عزیز شما به این صورت نمیتونید واسه ریسایکر ویو کلیک لیستنر تعریف کنید دوتا راه دارید

1- یه کلاس درست کنید و از نوع RecyclerView.OnItemTouchListener اونو ایمپلمنت کنید و اونجا interface رو درست کنید نمونه زیر رو ببینید

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;


    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }


    GestureDetector mGestureDetector;
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

حالا باید اونو به ریسایکلر بدین به شکل زیر

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        startActivity(new Intent(MainActivity.this, Sms.class).putExtra("Sgroup", position));
                    }
                })
        );

راه دوم که خیلی هم ساده است اینه که از طریق خود آداپتر این کارو بکنید شما تو دوتا متد که میتونید به ویوهای آداپتر دستترسی پیدا کنید این کار رو انجام بدید یکی متد onbindviewholder و یکی هم کلاس viewholder 

  @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
   
holder.smsbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity( new ShareApp(v.getContext()).sendsms(holder.smstxt.getText().toString()));
            }
        });
}
 public static class MyViewHolder extends RecyclerView.ViewHolder{
        ImageButton smsbtn;
        ImageButton sharbtn;
        ImageButton favimg;
        TextView smstxt;
        TextView serchactnam;
        public MyViewHolder(final View itemView) {
            super(itemView);
               sharbtn=( ImageButton)itemView.findViewById(R.id.serchsharbtn);
            //onclic
            sharbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                       }
            });
        }
    }
لینک ارسال
به اشتراک گذاری در سایت های دیگر

 

ببینید دوست عزیز شما به این صورت نمیتونید واسه ریسایکر ویو کلیک لیستنر تعریف کنید دوتا راه دارید

1- یه کلاس درست کنید و از نوع RecyclerView.OnItemTouchListener اونو ایمپلمنت کنید و اونجا interface رو درست کنید نمونه زیر رو ببینید

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;


    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }


    GestureDetector mGestureDetector;
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

حالا باید اونو به ریسایکلر بدین به شکل زیر

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        startActivity(new Intent(MainActivity.this, Sms.class).putExtra("Sgroup", position));
                    }
                })
        );

راه دوم که خیلی هم ساده است اینه که از طریق خود آداپتر این کارو بکنید شما تو دوتا متد که میتونید به ویوهای آداپتر دستترسی پیدا کنید این کار رو انجام بدید یکی متد onbindviewholder و یکی هم کلاس viewholder 

  @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
   
holder.smsbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity( new ShareApp(v.getContext()).sendsms(holder.smstxt.getText().toString()));
            }
        });
}
 public static class MyViewHolder extends RecyclerView.ViewHolder{
        ImageButton smsbtn;
        ImageButton sharbtn;
        ImageButton favimg;
        TextView smstxt;
        TextView serchactnam;
        public MyViewHolder(final View itemView) {
            super(itemView);
               sharbtn=( ImageButton)itemView.findViewById(R.id.serchsharbtn);
            //onclic
            sharbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                       }
            });
        }
    }

خب ببینین من هم اومدم از روش دوم انجام دادم

اما میخوام کد های داخل onClick رو از توی اکتیویتی دیگه بدم :(

لینک ارسال
به اشتراک گذاری در سایت های دیگر

روش دوم فقط تو اداپتر اجرا میشه و همونجا باید مقادیر رو بدی اگه میخوای خارج از آداپتر کلیک بزنی از روش اول استفاده کن

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کد های Interface درسته فقط طرز دادنش به اکتیویتی فرق داره ، به این صورت بده   (تست نکردم اگه جاییش مورد داشت تغییر بده)

public class MainActivity extends AppCompatActivity implements MyClickListener{
    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recycler);
        recyclerView.setAdapter(new CheckedDays(this));
        
    }

    @Override
    public void onItemClick(int ID, String text) {
        //Code hat
    }
}

کد های ادپتر 

public class CheckedDays extends RecyclerView.Adapter {

    Activity listener;
    CheckedDays(Activity activity){
        listener = activity;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MyClickListener)listener).onItemClick(ID,"felan");
            }
        });
    }

    @Override
    public int getItemCount() {
        return 0;
    }
}
لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...