سؤال

أرغب في تنفيذ RadiObutton و EditText داخل صف من ListView. أنا أستخدم ArrayAdapter لملء القائمة. ولكن المشكلة هي أنه عندما أقوم باختيار Radiobutton وأرسل القائمة والتمرير لأعلى مرة أخرى ، لم يتم تحديد Radiobutton الذي تم اختياره. نفس الشيء مع محتوى edittext. يتم إزالة النص عند التمرير لأعلى.

هل كانت مفيدة؟

المحلول

تحقق من محولك ، ربما لا تقوم بالمهمة بشكل صحيح bindView(). عليك تعيين مرة أخرى bindView() القيم.

سأقوم بإعادة صياغة الجملة وستفهمها على الأرجح. ال newView() يخلق فقط 5-10 طرق عرض (حيث يتناسب العديد منها على الشاشة) ، ويتم إعادة استخدامها في صفوف أخرى. اذا كان لديك ListView مع وجود 200 سطر فيه ، في الواقع ، لديك فقط 5-10 طرق عرض ، وعليك التأكد من تحديث طرق العرض مع التغييرات الصالحة في bindView(). يجب عليك تخزين/حفظ التغييرات على كائن لإعادة الاستخدام لاحقًا.

نصائح أخرى

المشكلة هي أن جميع المشاهدات التي تترك الشاشة قد يتم تدميرها لحفظ الذاكرة على الهاتف. إذا لم يفعل الهاتف هذه قائمة مع 1000 إدخالات ستملأ ذاكرة جهازك.

ولهذا السبب ، سيتم حذف التغيير الذي يحدث إلى Radiobutton والنص الذي تم إدراجه في EditText ببساطة وإذا تم تمرير المستخدم ، فسيتم إعادة إنشاء العرض.

تحتاج إلى حفظ حالة Radiobutton ونص التحرير في محولك وإعادة تطبيق الحالة في اللحظة التي تقوم فيها بإعادة إنشاء هذا العنصر الخاص فيك GetView طريقة.

وظيفة getView في محول الأساس. يحفظ قيمة edittext ويعرض نفسه إذا لم يكن ConvertView فارغًا.

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.list_row_person, null);
            holder = new ViewHolder();
            holder.PersonNameView = (TextView) convertView.findViewById(R.id.PersonNameView);
            holder.SpendAmount = (EditText) convertView.findViewById(R.id.SpendAmt);
            holder.SpendAmount.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // TODO Auto-generated method stub
                    int position2 = holder.SpendAmount.getId();
                    EditText Caption = (EditText) holder.SpendAmount;
                    Person per= (Person)holder.SpendAmount.getTag();
                    //SpendAmount is of Double type
                    if(s.toString().length()>0){
                    per.setSpendAmount(Double.parseDouble(s.toString()));
                    per.setFlag(true);}
                    else{
                         Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
                        }





                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub

                }
            });




            holder.SpendAmount.setTag(listData.get(position));
            convertView.setTag(holder);

        } else {

            ((ViewHolder)convertView.getTag()).SpendAmount.setTag(listData.get(position));
            holder = (ViewHolder) convertView.getTag();

        }


        holder.PersonNameView.setText(listData.get(position).getPersonName());
        holder.SpendAmount.setText(listData.get(position).getSpendAmount().toString());



        return convertView;




    }
     class ViewHolder {
        TextView PersonNameView;
        EditText SpendAmount ;
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top