Удаление элемента с помощью кнопки в ListView с помощью пользовательского ArrayAdapter - PullRequest
2 голосов
/ 07 июля 2011

У меня есть собственный list_row:

    <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content" android:baselineAligned="false">
<Button android:layout_width="30dip" android:layout_marginTop="7dip" android:gravity="right"
android:id="@+id/delete" android:layout_height="30dip" android:background="@drawable/delete"
android:layout_gravity="top"></Button>
<TextView android:textSize="20dip"
android:text="TextView" android:id="@+id/tavsiye" android:layout_marginTop="10dip" 
android:layout_gravity="top" android:layout_width="wrap_content" 
android:layout_height="wrap_content"></TextView>
</LinearLayout>

У меня есть ListView, подобный этому:

<ListView 
        android:id="@+id/tavsiyeler"
        android:layout_height="300dip"
        android:layout_width="170dip"
        android:fastScrollEnabled="true"
        android:scrollbars="vertical"/>

и специальный адаптер, расширяющий ArrayAdapter:

public class HekimTavsiyeleriAdapter extends ArrayAdapter<String> {


private Context context;
private int resource;
private ArrayList<String> tavsiyeler;


public HekimTavsiyeleriAdapter(Context context, int resource,
         ArrayList<String> objects) {
    super(context, resource,  objects);
    this.context=context;
    this.resource=resource;
    this.tavsiyeler=objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(this.resource, null);
    }

    if (this.tavsiyeler.size()!=0) {
            TextView tavsiye = (TextView) v.findViewById(R.id.tavsiye);
            Button but= (Button) v.findViewById(R.id.delete);

            if (tavsiye != null) {
                String st=this.tavsiyeler.get(position);
                tavsiye.setText(st);     
            }
            if( but!=null){
                but.setId(position);
                but.setOnClickListener(new AdapterView.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        int id=v.getId();       
                        tavsiyeler.remove(id);
                        notifyDataSetChanged();

                    }                           
                  });

            }

    }
    return v;
}

Я создаю адаптер и заполняю список следующим образом:

    eklenecekTavsiyeler=new ArrayList<String>();
    adapter= new HekimTavsiyeleriAdapter(context,
            R.layout.hekim_tavsiyeleri_row, eklenecekTavsiyeler);

    ListView tavsiyelerListesi = (ListView)findViewById(R.id.tavsiyeler);
    tavsiyelerListesi.setAdapter(adapter);

И добавляю новые элементы, подобные этому:

this.adapter.add(<some-string>);
    this.adapter.notifyDataSetChanged();

, и мой вид списка выглядит так:

http://imageshack.us/photo/my-images/97/listir.jpg/

Вот мой вопрос:

Я добавляю новые элементы в список.Я установил высоту для списка.Когда я заполняю список до тех пор, пока не будет занята вся высота, я добавляю в список один новый элемент, который требует прокрутки из-за переполнения высоты списка.Последний элемент, который я добавил, получает неправильный идентификатор, и когда я нажимаю крестик, он удаляет неправильный элемент.Однако, когда список не переполнен, все работает нормально.После переполнения идентификаторы кнопок установлены неправильно (кажется случайным образом).Кстати, для установки идентификатора кнопки я использую аргумент позиции getView.

Заранее спасибо.

1 Ответ

2 голосов
/ 07 июля 2011

Боюсь, что у вас есть недостатки в коде.Вы должны прекратить звонить but.setId().При этом вы переопределяете внутренний идентификатор представления, значение которого равно R.id.delete.Возможно, вы хотели использовать but.setTag() / but.getTag()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...