سؤال

الاعتذار إذا تم طرح هذا السؤال سابقا.

لدي ليستفراغمنت الذي يحتوي على زر في كل عنصر القائمة.يجب أن يؤدي النقر فوق الزر إلى تغيير لون الخلفية لعنصر القائمة المحدد.وأنا أفهم أن ليستفيو داخل ليستفراغمنت ينعش نفسه مما يعني أنه إذا كان المستخدم مخطوطات فمن المرجح أن عنصر القائمة التي لم يتم النقر سابقا سوف يكون لون الخلفية تغيرت.

العديد من الحلول لقد جئت عبر تنطوي على تخزين موقف عنصر القائمة التي تم النقر عليها في جيتفيو تجاوز(موقف إنت ، عرض كونفيرتفيو ، فيوغروب الأصل) طريقة تنفيذها في محول مخصص (الذي يمتد سيمبليدابتر في حالتي).

ومع ذلك ، فإن مشكلتي تتفاقم بسبب وجود زر داخل كل عنصر قائمة مما يعني أن الزر لن يكون قابلا للنقر ما لم أرفق أونكليكليستينر داخل محول مخصص (يتم هذا الجزء).الآن ، في محاولة لتخزين موقف عنصر القائمة الزر فشل لأن الموقف المحفوظ هو دائما موقف منتعشة وليس الموقف المطلق لعنصر القائمة.حاولت أيضا وضع علامات لكل زر ولكن حتى تلك الحصول على إعادة تدويرها كما مخطوطات الصفحة ، وهو (للأسف) السلوك المتوقع النظر في تصميم ليستفيو.

أفهم أن هذه المشكلة قابلة للحل بسهولة إذا كان عنصر القائمة لا يحتوي على أطفال يحتاجون إلى النقر.ولكن ماذا لو كان هناك أطفال داخل كل عنصر قائمة يحتاجون إلى الاستجابة للنقرات المنفصلة عن طريقة العرض الأصلية التي تحتوي على كل عنصر قائمة ?لقد حاولت أيضا استخدام المحددات لمعالجة خلفية عنصر القائمة ولكن هذا لم يساعد أيضا.

هنا هو طريقة جيتفيو محول مخصص بلدي:

@Override
public View getView(int position, View convertView, ViewGroup parent){

    View view = convertView;
    final int pos = position;

    if(view == null){

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.fragment_layout, null);

        Button button = (Button) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){


            @Override
            public void onClick(View v) {

                Log.d("CLICKED POSITION",Integer.valueOf(pos).toString());
                View parent = (View) v.getParent();

                parent.setBackgroundColor(Color.GREEN);

            }
        });

    }


    return view;
}

وملف تخطيط شمل:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="match_parent"
android:orientation="vertical" 
android:layout_weight="1"
android:descendantFocusability="blocksDescendants"
android:layout_margin="5dp" 
>

<ListView android:id="@id/android:list"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 

/> 

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/label" 
        android:layout_gravity="start"
    />

    <TextView 
        android:id="@+id/text_id"
        android:layout_width="0dp"
        android:layout_height="wrap_content" 
        android:layout_weight="1"
        android:layout_gravity="end"
    />

     <Button
         android:id="@+id/button"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/button"
         android:layout_margin="2dp"
         android:layout_marginLeft="2dp"
         android:layout_marginRight="2dp"
         android:clickable="true"

      />


</LinearLayout> 

لقد قضيت ساعات طويلة على هذه المشكلة وأنا غير قادر على التوصل إلى حل.أي توجيه أو توجيه أو حل سيكون موضع تقدير كبير.

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

المحلول

في المحول المخصص الخاص بك getView() الطريقة ، كنت تضخيم وجهة النظر وإرفاق أونكليكليستينر فقط إذا كان convertView لاغية. convertView هو وجهة النظر المعاد تدويرها.إذا convertView ليست فارغة ، فأنت بحاجة إلى تغيير القيم في هذا العرض.الخاص بك getView() يجب أن تكون الطريقة مثل هذا بدلا من ذلك

    @Override
    public View getView(int position, View convertView, ViewGroup parent){

        View view = convertView;
        final int pos = position;
        //No recycled view, so create a new one 
        if(view == null){

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.fragment_layout, null);

        }
        //By this line, we either have a view that is created in the if block above or passed via convertView
        Button button = (Button) view.findViewById(R.id.button);
        //attach listener to the view, recycled or not
        button.setOnClickListener(new View.OnClickListener(){


                @Override
                public void onClick(View v) {

                    Log.d("CLICKED POSITION",Integer.valueOf(pos).toString());
                    //parent not required as we are have the view directly
                    //View parent = (View) v.getParent();

                    v.setBackgroundColor(Color.GREEN);

                }
            });


        return view;
    }

في الواقع يجب عليك أيضا تغيير أي قيم مرتبطة بهذا العنصر وفقا لذلك position, ، إذا تغيروا.على سبيل المثال ، إذا كان كل button يعرض الموضع في القائمة ، يجب عليك أيضا إضافة السطر التالي

button.setText("Button " + position);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top