آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

نوشتن رویداد onClick برای سوئیچ کردن بین اکتویتی

احسان منصوری  9 سال پیش  9 سال پیش
0 0

سلام دوستان. من میخوام با کلیک روی یکی از دکمه های آیتم RecyclerView، به اکتیویتی دیگه منتقل بشم و همراهش یه مقداری رو putExtra کنم. الان هر کاری میکنم، خطای nullPointerException میده. اینم کد:

 public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.viewHolder>{
    private LayoutInflater inflater;
    List<Information> data = Collections.emptyList();
    public AdapterRecyclerView(Context context, List<Information> data){
        inflater=LayoutInflater.from(context);
        this.data=data;
    }

    @Override
    public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View view = inflater.inflate(R.layout.adapter_recycler, parent, false);
        viewHolder holder = new viewHolder(view);
        return holder;
    }


    @Override
    public void onBindViewHolder(viewHolder holder, final int position) {
        Information current = data.get(position);
        holder.title.setText(current.p_uname);
        holder.desc.setText(current.p_desc);


        holder.btnProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    Intent intentRegister = new Intent(G.currentActivity, ActivityShopProfile.class);
                    intentRegister.putExtra("POSITION", position);
                    G.currentActivity.startActivity(intentRegister);
            }
        });
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class viewHolder extends RecyclerView.ViewHolder{
        TextView title;
        TextView desc;
        FrameLayout btnProfile;


          public viewHolder(View itemView) {
                super(itemView);
                title = (TextView) itemView.findViewById(R.id.txtTitle);
                desc = (TextView) itemView.findViewById(R.id.txtDesc);
                btnProfile = (FrameLayout) itemView.findViewById(R.id.btnProfile);

        }
    }
}

من رویداد کلیک رو داخل onBind نوشتم. نمیدونم چرا از همون خط اول اینتنت خطا میگیره

 برای این سوال 9 پاسخ وجود دارد.
پاسخ به سوال 
Hajhosseini  9 سال پیش
+1 0

وقتی که برنامتون خطا میده، متن خطا رو درج کنید. من توی کدتون خطایی نمیبینم، ولی 3 مسئاله هست:
1: باید تیک clicable رو برای btnProfile در adapter_recycler تیک بزنید.
2: نباید اسم گذاریتون به طوری باشه که از FrameLayout استفاده کنید و اسم ویوتون رو btn... بذارید.
3: زمانی که میخواید روی کل یک آیتم کلیک ست کنید نباید در adapter کلیک رو بنویسید، باید در اکتیویتی از متد:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               
            }
        });

استفاده کنید.(متد بالا در لیست ویو و RecyclerView کاملا مشابه نوشته میشه)

0 0
بله درسته. در مورد اسم گذاری هم واسه اینکه قاطی نکنم، اسم FrameLayout رو btnProfile نوشتم. من میخوام وقتی روی btnProfile کلیک شد، سوئیچ کنم به اکتیویتی دیگه. حالا این کد رو چجوری و کجا بنویسم؟ (9 سال پیش)
0 0
احسان جان بستگی به نوع پیاده سازیت داره، اگر میخوای روی هرکدوم از آیتم ها که کلیک انجام شد بره به یک اکتیویتی، باید از متد بالا در اکتیویتی استفاده کنی، اگر هر آیتم از لیست ویوت، چند تا دکمه، تکست ویو و ... داره که میخوای کلیک روی هرکدوم کار خاصی انجام بده، باید همونجوری که خودت نوشتی در آداپتر تعریف بشه. الان مشکل حل شد؟ (9 سال پیش)
0 0
نه متاسفانه. از همون خط اول Intent خطا میده. خطاش هم این پایینه (9 سال پیش)
پاسخ به سوال 
احسان منصوری  9 سال پیش
0 0

اینم خطا:

پاسخ به سوال 
Hajhosseini  9 سال پیش
+1 0

خطایی که درج کردید 2 دلیل میتونه داشته باشه:
1: کلاس G رو در منیفست تعریف نکردید، یا در اکتیویتی تون به currentActivity مقدار ندادید.
2: کلاس ActivityShopProfile رو در منیفست تعریف نکردید،
که به احتمال 99% مورد اول رعایت نشده.

0 0
نه من اول از همه، اینارو تو منیفست تعریف میکنم. چک کردم، تعریف شده بود (9 سال پیش)
0 0
در اکتیویتی تون توی onCreate اولین کدی که نوشتید باید G.currentActivity = this; باشه، همینه؟ (9 سال پیش)
0 0
کجا؟ متوجه نشدم. اولین باره این رو میبینم (9 سال پیش)
پاسخ به سوال 
Hajhosseini  9 سال پیش
+2 0

ببینید شما وقتی میخواید از G.currentActivity استفاده کنید، باید به هر اکتیویتی که میرید بگید

  G.currentActivity = this;

این currentActivity که در کلاس G تعریف کردید یک متغیر استاتیک هست، و خودش خود به خود نمیتونه تشخیص بده که شما توی کدوم اکتیویتی هستی، پس باید مقدار دهی بشه.
میتونید در onCreate هر اکتیویتی کد بالا رو درج کنید، ولی اگر بازگشت به اکتیویتی هم دارید میتونید در متد onResume کد بالا رو بنویسید.

+1 0
اوکی. حل شد ممنونم علی جان. حالا وقتی میره توی اکتیویتی بعد، این ارور پایین رو میده که خطا از position دریافتیه. توی اون اکتیویتی که از position لوگ میگیرم، مشکلی نداره و position رو نشون میده. این پایین اطلاعات رو نوشتم. شرمنده اذیتت کردم (9 سال پیش)
پاسخ به سوال 
احسان منصوری  9 سال پیش
+1 0

اومدم با position دریافتی، ID مورد نظرم رو گرفتم از توی آرایه

توی یه ترد نوشتم که ID رو پست کن به سرور و پاسخ سرور رو که یک کد جیسون هست رو بگیر و ذخیره کن توی یه آرایه و توی TextView ها نشونشون بده:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop_profile);
        G.currentActivity = this;

        //Get Extra
        Bundle extras = getIntent().getExtras();
        int position = 0;
        if (extras != null){
            position = extras.getInt("POSITION");
            Log.e("LOG", "POSITION: " +position);
        }
        final Information shopId = G.ilamList.get(position); //Error
        final int id = shopId.p_uid;
        final String finalId = Integer.toString(id);

        //end

        //Post kardane id
        Thread postThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("Userid", finalId));
                    Log.i("LOG", "PHONE_NUMBER: " + params);
                    String responseText = PostClass.readUrl(url, params);
                    JSONArray jsonCategory = new JSONArray(responseText);
                    for (int i = 0; i < jsonCategory.length(); i++) {
                        JSONObject object = jsonCategory.getJSONObject(i);
                        Information categoty = new Information();
                        categoty.p_uname = object.getString("p_uname");
                        categoty.rp_title = object.getString("p_title");
                        categoty.p_desc = object.getString("p_desc");
                        categoty.p_gpaddress = object.getString("p_gpaddress");
                        categoty.p_address = object.getString("p_address");
                        categoty.ygps = object.getString("ygps");
                        categoty.xgps = object.getString("xgps");
                        categoty.p_mobile = object.getString("p_mobile");
                        categoty.p_tell = object.getString("p_tell");
                        categoty.p_payment = object.getString("p_payment");

                        G.ilamList.add(categoty);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        postThread.start();


        //tarife kontrolha
        //ImageView imgProfile = (ImageView) findViewById(R.id.imgProfile);
        TextView txtName = (TextView) findViewById(R.id.txtName);
        TextView txtDesc = (TextView) findViewById(R.id.txtDesc);
        TextView txtAddress = (TextView) findViewById(R.id.txtAddress);
        TextView txtPhone = (TextView) findViewById(R.id.txtPhone);
        //end

        txtName.setText(shopId.p_uname);
        txtDesc.setText(shopId.p_desc);
        txtAddress.setText(shopId.p_address);
        txtPhone.setText(shopId.p_tell);

اینم خطای لوگ کت:

پاسخ به سوال 
Hajhosseini  9 سال پیش
+3 0

برای تایید پاسخ و همچنین تشکر به پاسخ امتیاز بدید(لایک کنید) و من هیچ وقت از پاسخ به سوالات شما دوستان عزیز اذیت نمیشم، من از همینجا برنامه نویسی اندروید رو شروع کردم و الان با پاسخ دادن به شما وظیفه ام رو انجام میدم.

شما position رو درست میگیرید، ولی وقتی به وب سرویس ارسال میکنید هیچ چیزی برنمیگردونه، مشکل میتونه حالت های مختلف داشته باشه.
1: توی دیتابیستون چک کنید که همین position که مقدار 0 داره وجود داشته باشه. اگر دارید id رو select میکنید، شاید در دیتابیس از 1 شروع کردید و position از 0 شروع میشه.
2: شاید وب سرویستون مشکل داره و ArrayList رو به درستی برنمیگردونه.
3: باید زمانی از ArrayList استفاده کنید که دیتا رو از وب سرویس دریافت کرده باشید. در حالت بالا شما میگید دیتا رو از وب سرویس بگیر و زمان نمیدید که دیتا گرفته بشه و بعد دیتا رو ست کنید. خوب مسلما دیتا خالیه.
4: باید برای وب سرویستون یک interface تعریف کنید که زمانی که دیتا رو گرفت، اگر دیتا خالی نبود یک متد که در اون عملیات ست کردن دیتا وجود داره رو اجرا کنه.

+1 0
درست میفرمائید. ولی من لایک کرده بودم علی جان:) پاسخم رو اصلاح کردم. من با position میرم توی آرایه و ID متناظر رو دریافت میکنم و اون ID رو میفرستم به سرور. ارور از قسمت پست کردن یا قسمت ترد پست کردن نمیده. از اون خطی که جلوش نوشتم Error خطا میده (9 سال پیش)
+1 0
خوب درسته دیگه، زمانی که G.ilamList.get(position); خالی باشه نمیتونه بریزدش توی shopId اررورتون رو دوباره بخونید، میگه G.ilamList هیچی توش نیست و نمیتونه ایندکس 1 امش رو پیدا کنه که بریزه توی shopId (9 سال پیش)
+1 0
احسان جان کدت رو دوباره چک کردم، شما باید اول دیتا رو از وب سرویس بگیری و در G.ilamList بریزی، بعد بیای ازش استفاده کنی، یعنی اون خطی که اررو داری رو بیار زیر اون خطی که از وب سرویس دیتا رو گرفتی. اگر اینا حلش نکرد، اون 4 موردی رو که گفتم رو چک کن. (9 سال پیش)
0 0
نه من حتما باید ID رو بفرستم به سرور و سرور در جواب، دیتا رو واسه من در قالب جیسون بفرسته. اینی که شما میگین، چون که سرور فقط اطلاعات رو توسط ID دریافتی از اندروید تولید میکنه، عملی نیست. این روشی که نوشتم، واسه لاگین کردن و Session Management هم جواب میده. اتفاقا دیروز سِشِن منیجرش رو تست کردم. جالب بود (9 سال پیش)
+1 0
خوب شما اینجا id رو نداری، باید position رو ارسال کنی که تازه id رو بگیری. شما یک آرایه خالی داری، بعد داری بهش میگی توی این آرایه توی position ی که من میگم id رو برگردون. خوب وقتی آرایه خالیه id برگردوندن معنی نمیده که. (9 سال پیش)
0 0
والا نمیدونم. آخه آرایه شون رو تغییر دادم به یه آرایه واحد. الان ارور نمیده. فقط باید با وب سرویس تست کنم ببینم اطلاعات رو برمیگردونه یا نه (9 سال پیش)
پاسخ به سوال 
احسان منصوری  9 سال پیش
0 0

مشکلی نیست الان در دریافت ID و درست دریافت و پستش میکنم. اطلاعات هم درست از سرور دریافت میکنم و همینطور، درست توی آرایه ذخیرش میکنم. فقط مشکل اینجاس که اون اطلاعات رو نمیتونم توی TextView ها نشون بدم. وارد این صفحه میشم، صفحه خالیه. باید چیکار کنم که وقتی اطلاعات رو دریافت و ذخیره میکنم توی آرایه، اونا رو توی TextView ها نشون بده؟

اینم کد:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop_profile);
        G.currentActivity = this;

        //Get Extra
        Bundle extras = getIntent().getExtras();
        int position = 0;
        if (extras != null){
            position = extras.getInt("POSITION");
            Log.e("LOG", "POSITION: " +position);
        }
        Information shopId = G.ilamList2.get(position);


        finalId = Integer.toString(shopId.p_uid);
        Log.e("LOG", "SHOPID: " + finalId);

        //end

        //Post kardane id
        Thread postThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    G.ilamList2.clear();
                    ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("Userid", finalId));
                    Log.i("LOG", "PHONE_NUMBER: " + params);
                    String responseText = PostClass.readUrl(url, params);
                    JSONObject json = new JSONObject(responseText);
                    Information categoty = new Information();
                    //categoty.p_uname = object.getString("p_uname");
                    categoty.s_title = json.getString("p_title");
                    categoty.s_desc = json.getString("p_desc");
                    categoty.p_gpaddress = json.getString("p_gpaddress");
                    categoty.p_address = json.getString("p_address");
                    categoty.ygps = json.getString("ygps");
                    categoty.xgps = json.getString("xgps");
                    categoty.p_mobile = json.getString("p_mobile");
                    categoty.p_tell = json.getString("p_tell");
                    categoty.p_payment = json.getString("p_payment");
                    categoty.p_group = json.getString("p_group");
                    categoty.p_state = json.getString("p_state");
                    Log.i("LOG", "PHONE_NUMBER: " + categoty.s_title);


                    G.ilamList2.add(categoty);


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        postThread.start();

        //tarife kontrolha
        //ImageView imgProfile = (ImageView) findViewById(R.id.imgProfile);
        TextView txtName = (TextView) findViewById(R.id.txtName);
        TextView txtDesc = (TextView) findViewById(R.id.txtDesc);
        TextView txtAddress = (TextView) findViewById(R.id.txtAddress);
        TextView txtPhone = (TextView) findViewById(R.id.txtPhone);
        //end

        txtName.setText(shopId.s_title);
        txtDesc.setText(shopId.s_desc);
        txtAddress.setText(shopId.p_address);
        txtPhone.setText(shopId.p_tell);
}

اروری هم نمایش نمیده

0 0
شما داری آرایه رو توی G.ilamList2.add(categoty); میریزی بعد به تکست ویو ها گفتی از shopId.s_title بخونن، باید 2 تاش رو یکی کنی! (9 سال پیش)
0 0
خب من اگه بخوام از آرایه اطلاعاتم رو توی TextViewها بریزم باید چیکار کنم؟ (9 سال پیش)
پاسخ به سوال 
Hajhosseini  9 سال پیش
+1 0

ببین احسان جان، من هنوزم نمیدونم چرا کدت درست کار میکنه و اررور نمیده. در کد بالا شما اول shopId  رو مقدار میدی، بعد میای میگی از وب سرویس اطلاعات رو بگیر و اطلاعات جدید رو که گرفتی در  G.ilamList2.add(categoty); قرار بده. خوب این کار از نظر اصولی اشتباهه. شما نباید متغیر استاتیک استفاده کنی(در اینجا). باید زمانی که وب سرویس آرایه رو برمیگردونه توی یک ArrayList یا یک متغیر از نوع Information  که خودتم همین کار رو کردی، درست کنی و اطلاعات رو بگیری. پس کاری که باید بکنی اینه که position رو برای وب سرویس بفرستی و یک ArrayList بگیری ازش، بعد یک متغیر Information درست میکنی و آیتم مورد نظرت رو توی position میریزی و در آخر همینجوری که تکست ویو هارو setText کردی پرشون میکنی.

0 0
خب واسه سرور باید حتما ID رو بفرستم. خب منم میام ID فلان position رو میگیرم و میفرستم واسه سرور. تا اینجا که مشکلی نیست؟ ارور چرا؟ (9 سال پیش)
0 0
من اگه بخوام وقتی روی دکمه فلان آیتم کلیک شد، آی دیش رو بفرست به سرور و جواب سرور که کد جیسونی حاوی اطلاعات اون آی دی هست رو بگیر و توی TextView ها نشون بده باید چی بنویسم؟ به نظرت با Async بنویسم؟ (9 سال پیش)
0 0
آیدی رو از کجا میارید؟ اگر آیدی رو در دیتابیس آفلاین (حافظه گوشی) ذخیره میکنید و بعد از گرفتن اطلاعات آیدی، اون رو ارسال میکنید به سرور، کارتون درسته. ولی وقتی آیدی در دیتابیس سرور ذخیره شده باشه شما باید اول لیست آیدی هارو از سرور بگیری، بعد ببینی اون position که کلیک شده شامل کدوم آیدی میشه و بعد آیدی رو ارسال کنی. (9 سال پیش)
+1 0
خب من قبلا اون آی دی رو توی یه آرایه ذخیره کردم. وقتی لوگ میگیرم آی دی درسته. اطلاعات رو هم درست دریافت میکنم. فقط نمیدونم اونارو چجوری بعد از دریافت از سرور توی TextView ها نشونشون بدم (9 سال پیش)
+1 0
من از روش دوم که گفتین، لیست آی دی ها رو از سرور میگیرم و میریزمشون توی یه آرایه (9 سال پیش)
پاسخ به سوال 
Hajhosseini  9 سال پیش
+1 0

کد زیر نحوه ریختن دیتا از ArrayList به یک متغیر، و در نهایت ست کردن برای تکست ویو هست:

 ArrayList<Information> arrayList = new ArrayList<Information>;
arrayList = data; // data = لیستی که از وب سرویس میگیرید
Information info = (Information) arrayList.get(position);
txtName.setText(info.s_title);

شما هم همین کار ها رو کردید. ولی زمانی که دارید مقادیر رو از وب سرویس میگیرید، در آرایه ای در کلاس G مقادیر رو پر میکنید ولی زمانی که دارید توی تکست ویو مقادیر رو setText میکنید از یک متغیر دیگه که اطلاعات رو من نمیدونم از کجا بهش دادید ست میکنید.

الان اگر شما کد زیر رو بنویسید باید درست بشه، ولی به نظرم روشتون یکم اشتباهه.

Information info = (Information) G.ilamList2.get(position);
        txtName.setText(info.s_title);
        txtDesc.setText(info.s_desc);
        txtAddress.setText(info.p_address);
        txtPhone.setText(info.p_tell);
0 0
همین دیگه. من میدونم این کاری که کردم اشتباه بوده. ولی اونقدر گیج شدم که نمیدونم چی بنویسم براش. (9 سال پیش)
0 0
کد بالا رو تست کردید؟ نتیجه چی شد؟ (9 سال پیش)
0 0
نه باید ظهر برم تست کنم. الان سرورشون خاموشه:( بعنوان آخرین سوال: به نظرتون منطقی ترین روشی که باید واسه اینکار پیاده کنم چی هست؟ اصن کجای کار من اشتباس؟ یعنی بعدا مشکل ساز میشه؟ چون که من توی همون صفحه اطلاعات رو هم پست میکنم، هم دریافت میکنم، هم توی آرایه ذخیره میکنم و هم توی تکس ویو باید نشون بدم. خودتون باشید چجوری اینکارو انجام میدین؟ (9 سال پیش)
0 0
ببین احسان جان کار شما اشتباه نیست، برای پیاده سازی روش های زیادی داریم، من کد کامل برنامه شما رو ندیدم و حتی نمیدونستم اول لیست آیدی هارو میگیرید و بعد از روی آیدی لیست دیتا رو میگیرید. حتی نمیدونم برنامتون در چه زمینه ایه. ولی به نظرم توی برنامه های کوچک بهتره تعداد کانکشن ها با سرور کم باشه. اگر برای هر کاری هر کاربر بخواد به سرور کانکت بشه، به 1 ماه نکشیده سرورتون down میشه. بهتری کل لیست رو یکبار از سرور بگیرید و در دیتابیس آفلاین ذخیره کنید. بعد اگر دیتابیس سرور تغییر کرد دیتا رو آپدیت کنید. (9 سال پیش)
+1 0
نه برنامه نسبتا بزرگیه. آخه مشکل از اینجاس که توی اون شرکتی که دارن این برنامه رو طراحی میکنن و سمت اندرویدش با منه، باید حتما واسه هر کاری، حتی ورود به اکتیویتی دیگه، با سرور ارتباط برقرار کرد چه برسه به نمایش اطلاعات. سرورشون هم خیلی قدرتمنده و به این راحتیا down نمیشه. اینه که من نمیتونم آفلاین طراحیش کنم. اگه آفلاین بود که کار خیلی راحت میشد (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .