我想在listview项目上添加一个删除按钮。当用户在文本视图内部长按单击列表视图项目:
时,必须显示此按钮<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/mybackground"
android:orientation="horizontal" >
<EditText
android:id="@+id/edittext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="2"
android:inputType="textMultiLine"
android:singleLine="false"
android:textSize="12dp"
android:visibility="gone" >
</EditText>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="2"
android:singleLine="false"
android:textColor="#000000"
android:textSize="14dp" >
</TextView>
<ImageButton
android:id="@+id/editButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_menu_close_clear_cancel"
android:visibility="gone" />
</LinearLayout>
这是java代码:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.affichageitem, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.textview);
holder.button = (ImageButton) convertView.findViewById(R.id.editButton);
convertView.setTag(holder);
holder.button.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
ListView listView0=(ListView)findViewById(R.id.listView0);
Toast.makeText(getApplicationContext(),"Clicked on position : " + listView0.getPositionForView(v),Toast.LENGTH_SHORT).show();
}
});
holder.text.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
TextView tv = (TextView) v ;
Toast.makeText(getApplicationContext(),"Clicked on app : " + tv.getText(),Toast.LENGTH_LONG).show();
}
});
holder.text.setOnLongClickListener( new View.OnLongClickListener() {
public boolean onLongClick(View v) {
TextView tv = (TextView) v ;
ImageButton editButton = (ImageButton) findViewById(R.id.editButton);
editButton.setVisibility(View.VISIBLE);
editButton.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
ImageButton iB = (ImageButton) v ;
ListView listView0=(ListView)findViewById(R.id.listView0);
Toast.makeText(getApplicationContext(),"Deleting app : " + listView0.getPositionForView(v),Toast.LENGTH_LONG).show();
iB.setVisibility(View.GONE);
}
});
Toast.makeText(getApplicationContext(),"Long Clicked on app : " + tv.getText(),Toast.LENGTH_LONG).show();
return true;
}
});
}
else {
holder = (ViewHolder) convertView.getTag();
}
Appreciation currentApp = appList.get(position);
holder.text.setText(currentApp.getValue());
holder.button.setTag(currentApp);
return convertView;
}
我的问题:当我长按一个项目时,删除按钮出现在另一个项目上......
答案 0 :(得分:1)
由于您想要的视图的ID在列表中多次出现,因此您需要确保使用与TextView相同的列表项中显示的ID获取视图。
如果你改变了
ImageButton editButton = (ImageButton) findViewById(R.id.editButton);
到
ImageButton editButton = (ImageButton) ((ViewGroup) v.getParent()).findViewById(R.id.editButton);
这只在ViewGroup中搜索TextView的父级,因此会找到正确的R.id.editButton实例。
<强>更新强>
或者,您可以更改
ViewHolder holder = null;
到
final ViewHolder holder;
然后您根本不需要变量editButton
,因为您可以将代码更改为
holder.button.setVisibility(View.VISIBLE);
并在setOnClickListener
而不是holder.button
上致电editButton
。我还会将调用移至setOnClickListener
方法之外的onLongClick
。