开发者

Removing an Item with a Button in ListView with Custom ArrayAdapter

I have custom 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" 
a开发者_Go百科ndroid:layout_gravity="top" android:layout_width="wrap_content" 
android:layout_height="wrap_content"></TextView>
</LinearLayout>

I have a ListView like that:

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

and a custom adapter which extends 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;
}

I am creating adapter and fill the list like that :

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

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

And adding new items like that:

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

and my list view is seen like that:

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

Here is my question:

I am adding new items to the list. I have fixed height for the list. When I fill the list until all height is occupied, then I add one new item to the list which requires scrolling becasue overflow in list height. The last item I added gets wrong id and when I pressed the cross button, it removes wrong item. However, when the list is not overflowed, everything works fine. After overflow, the ids of buttons are set wrongly (seems randomly). By the way, for setting the button's id, I am using getView's position argument.

Thanks in advance.


I am afraid that you have flaw in the code. You have to stop calling but.setId(). With this you are overriding internal id of the view which is the value of R.id.delete. Probably you meant to use but.setTag() / but.getTag()?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜