Android 使用自定义ArrayAdapter在ListView中删除带有按钮的项

Android 使用自定义ArrayAdapter在ListView中删除带有按钮的项,android,listview,button,Android,Listview,Button,我有自定义列表行: <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

我有自定义列表行:

    <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 
        android:id="@+id/tavsiyeler"
        android:layout_height="300dip"
        android:layout_width="170dip"
        android:fastScrollEnabled="true"
        android:scrollbars="vertical"/>
this.adapter.add(<some-string>);
    this.adapter.notifyDataSetChanged();

以及扩展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;
}
公共类HekimTavsiyeleriAdapter扩展了ArrayAdapter{
私人语境;
私有int资源;
私人ArrayList tavsiyeler;
公共HekimTavsiyeleriAdapter(上下文,int资源,
ArrayList对象){
超级(上下文、资源、对象);
this.context=context;
这个。资源=资源;
this.tavsiyeler=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)this.context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(该资源为空);
}
if(this.tavsiyeler.size()!=0){
TextView tavsiye=(TextView)v.findviewbyd(R.id.tavsiye);
Button=(Button)v.findViewById(R.id.delete);
if(tavsiye!=null){
字符串st=this.tavsiyeler.get(位置);
tavsiye.setText(st);
}
如果(但是!=null){
但是,setId(位置);
但是.setOnClickListener(新的AdapterView.OnClickListener(){
@凌驾
公共void onClick(视图v){
int id=v.getId();
tavsiyeler.remove(id);
notifyDataSetChanged();
}                           
});
}
}
返回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);
eklenecekTavsiyeler=newarraylist();
适配器=新的HekimTavsiyeleriAdapter(上下文,
R.layout.hekim_tavsiyeleri_row,eklenecekTavsiyeler);
ListView tavsiyelerListesi=(ListView)findViewById(R.id.tavsiyeler);
tavsiyelerListesi.setAdapter(适配器);
并添加新项目,如:

<ListView 
        android:id="@+id/tavsiyeler"
        android:layout_height="300dip"
        android:layout_width="170dip"
        android:fastScrollEnabled="true"
        android:scrollbars="vertical"/>
this.adapter.add(<some-string>);
    this.adapter.notifyDataSetChanged();
this.adapter.add();
this.adapter.notifyDataSetChanged();
我的列表视图如下所示:

<ListView 
        android:id="@+id/tavsiyeler"
        android:layout_height="300dip"
        android:layout_width="170dip"
        android:fastScrollEnabled="true"
        android:scrollbars="vertical"/>
this.adapter.add(<some-string>);
    this.adapter.notifyDataSetChanged();

我的问题是:

我正在向列表中添加新项目。我有固定的列表高度。当我填充列表直到所有高度都被占用时,我会向列表中添加一个新项目,该项目需要滚动,因为列表高度溢出。我添加的最后一个项目的id错误,当我按下交叉按钮时,它会删除错误的项目。但是,当列表没有溢出时当然,一切正常。溢出后,按钮的id设置错误(似乎是随机的)。顺便说一下,为了设置按钮的id,我使用了getView的位置参数


提前谢谢。

恐怕您的代码有漏洞。 您必须停止调用
but.setId()
。这样您将覆盖视图的内部id,该id是
R.id.delete
的值。您可能打算使用
but.setTag()
/
but.getTag()