Кнопки в ListView не работают должным образом - Android

У меня есть listView, который содержит кнопки. Каждый элемент listView имеет либо Button1, либо Button2. Я хочу, чтобы после нажатия кнопки Button1 она становилась невидимой, а кнопка2 становилась видимой. Мой текущий код работает, делая кнопку Button1 невидимой, но когда он делает видимой кнопку2, он делает видимой кнопку2 последнего элемента listView. Не button2 в своем собственном listView.

Вот мой текущий XML-код

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
<View android:id="@+id/topInformationBar"
            android:layout_height="6dip"
            android:layout_width="fill_parent"
            android:background="@drawable/top_infomation_bar"/>
<RelativeLayout
    android:paddingLeft="10dip"
    android:paddingRight="10dip"
    android:paddingBottom="10dip"
    android:paddingTop="4dip"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <TextView android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textColor="#454545"
        android:textStyle="bold"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        />

    <Button
        android:visibility="invisible"
        android:layout_alignParentRight="true"
        android:id="@+id/button1"
        android:text="button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textStyle="bold"
        android:padding="5dip"
        android:textColor="#FFFFFF"/>
    <Button 
        android:visibility="invisible"
        android:layout_alignParentRight="true"
        android:id="@+id/button2"
        android:text="button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textStyle="bold"
        android:padding="5dip"
        android:textColor="#FFFFFF"/>

</RelativeLayout>
</LinearLayout>

Вот мой ArrayAdapter, который создает элементы ListView.

class ListAdapter extends ArrayAdapter<Item> {

            public ListAdapter(Context context, int textViewResourceId) {
                super(context, textViewResourceId);
            }

            private List<Item> items;

            public ListAdapter(Context context, int resource, List<Item> items) {
                super(context, resource, items);
                this.items = items;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi;
                    vi = LayoutInflater.from(getContext());
                    v = vi.inflate(R.layout.list_item, null);

                }

                final Item p = items.get(position);
                if (p != null) {

                    Button1 = (Button)v.findViewById(R.id.Button1);
                    Button2 = (Button)v.findViewById(R.id.Button2);

                            Button1.setOnClickListener(new View.OnClickListener() {
                                public void onClick(View view) {
                                    view.setVisibility(View.INVISIBLE);
                                    Button2.setVisibility(View.VISIBLE);
                                }
                            });

                            Button2.setOnClickListener(new View.OnClickListener() {
                                public void onClick(View view) {
                                    view.setVisibility(View.INVISIBLE);
                                    Button1.setVisibility(View.VISIBLE);
                                }
                            });
                }
                return v;
            }
         }

Итак, если я нажму Button1, он станет невидимым, но он сделает Button2 видимым в последних элементах ListView. Он не делает его видимым в своем собственном listView.


person Community    schedule 12.09.2013    source источник


Ответы (2)


Из вашего кода я не понимаю, что вы пытаетесь сделать для Button2 onClick. Когда вы щелкаете Button2, вы устанавливаете видимость представления (которая является Button2) на INVISIBLE и снова устанавливаете видимость Button2 на VISIBLE? Почему ты переключаешься туда?

Когда вы нажимаете Button1, Button1 становится ВИДИМЫМ, а Button2 становится НЕВИДИМЫМ.

person prijupaul    schedule 13.09.2013
comment
Предполагается, что кнопка 1 становится видимой после нажатия кнопки 2. Я исправил ошибку. - person ; 13.09.2013
comment
Неееет, это не мой точный код, я просто сузил то, что я хочу, чтобы было легче понять, потому что я запутался, пытаясь объяснить это, лол. - person ; 13.09.2013

Я не думаю, что в вашем коде что-то не так. ListViews "перерабатывает" виды, которые он использует для рендеринга каждой строки, поэтому при прокрутке вверх, как только верхний вид исчезает, он повторно используется для рендеринга вида, который появляется снизу.

Таким образом, чтобы решить эту проблему, вы можете хранить информацию о состоянии того, какая кнопка отображается/скрывается в вашем классе Item, и обновлять видимость кнопок в вашем методе getView.

Пример того, как вы можете этого добиться.

В Item.java

private boolean showingButton1;

public boolean getShowingButton1() {
    return showingButton1;
}

public void setShowingButton1(boolean show) {
   showingButton1 = show;
}

Кнопка обновления на ClickListeners

Button1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        view.setVisibility(View.INVISIBLE);
        Button2.setVisibility(View.VISIBLE);
        p.setShowingButton1(false);
    }
});

Button2.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        view.setVisibility(View.INVISIBLE);
        Button1.setVisibility(View.VISIBLE);
        p.setShowingButton1(true);
    }
});

В вашем методе getItem

if (p != null) {
    Button1 = (Button)v.findViewById(R.id.Button1);
    Button2 = (Button)v.findViewById(R.id.Button2);

    if (p.getShowingButton1()) {
        Button1.setVisibility(View.VISIBLE);
        Button2.setVisibility(View.INVISIBLE);
    } else {
        Button1.setVisibility(View.INVISIBLE);
        Button2.setVisibility(View.VISIBLE);
    }
}
person ssantos    schedule 12.09.2013
comment
Я понимаю, о чем вы говорите, но как я мог это сделать? Любой пример кода? - person ; 13.09.2013
comment
Просто добавил краткий фрагмент, на случай, если вы все еще не решили его. - person ssantos; 13.09.2013