我有一个带有自定义单元格布局的列表视图。实际上它显示来自表格的数据,有两个按钮用于编辑,另一个用于删除记录。这两个按钮是隐藏的,当长按行时,这两个按钮就会显示出来。 这是cell_layout:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Customer Code and Name "
android:textSize="16sp"
android:textColor="#ff000000" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginRight="25dp">
<TextView
android:id="@+id/txtCusCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cus code"
android:textSize="16sp"
android:textColor="#ff000000" />
<TextView
android:id="@+id/txtCusName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="cus Name"
android:textSize="16sp"
android:textColor="#ff000000"
android:layout_marginLeft="10dp" />
</LinearLayout>
<ImageView
android:id="@+id/imgbtnOrderActions"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/down"
android:layout_alignParentEnd="false"
android:clickable="true"
android:layout_alignParentRight="true"
android:background="@drawable/test"/>
</RelativeLayout>
<TableLayout
android:id="@+id/tblLayoutOrderAction"
android:layout_width="fill_parent"
android:layout_height="0dp">
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<ImageView
android:id="@+id/lmgbtnOrderEdit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:src="@drawable/edit"
android:layout_weight="1"
android:layout_column="1"
android:clickable="true"
android:background="#ff00b4df" />
<ImageView
android:id="@+id/ImgbtnOrderDelete"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:src="@drawable/delete"
android:layout_weight="1"
android:layout_column="2"
android:background="#ffff625a"
android:clickable="true" />
</TableRow>
</TableLayout>
</LinearLayout>
这两个按钮在表格布局中我给它们0dp高度来隐藏它们。
这是listView的OnLongItemClick事件:
lstviewOrders.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l)
{
final TableLayout tblLay = (TableLayout) view.findViewById(R.id.tblLayoutOrderAction);
TableLayout.LayoutParams lay = new TableLayout.LayoutParams(30, ViewGroup.LayoutParams.MATCH_PARENT);
tblLay.setLayoutParams(lay);
return false ;
}
});
这就是问题所在。当列表视图中的项目被长时间点击时,它会显示该项目的编辑和删除按钮,但它也会显示项目中位于下一个第7位置的那些按钮。例如,如果我点击位置3上的项目,那么3,10,17,....的按钮也会显示... 如何解决这个问题?
答案 0 :(得分:0)
这听起来像是你正在处理ListView的视图回收功能。 This answer提供了很好的解释。
基本示例:如果ListView总共有20个项目,但只有足够的空间同时在屏幕上显示4个,那么ListView将只使用4个视图对象,但会为列表中的每个项目回收它们。因此,如果您在视图2上更改某些内容,然后向下滚动,您会发现此更改也适用于视图6.这就是使ListViews难以生成动态视图的原因。
在上面的示例中,如果您的适配器正在加载视图6,则在适配器的getView
方法中,convertView
对象是2的视图,然后将其重新用于数据元素6.我会讨论存储按钮是否显示在数据中并重置此方法中的convertView
,然后根据基础数据显示/隐藏按钮< / em>的。
ListViews专注于显示基础数据,但不一定在视图中编辑该数据。
您可以尝试跳过试图使用getView
的{{1}}部分,以便您始终制作新视图,但我发现这可能导致一些其他意外的UI体验。祝你好运!
答案 1 :(得分:0)
问题正在发生,因为listview单元格正在重用。 当您显示特定单元格的按钮并滚动列表视图时,重新使用该单元格的项目也将显示按钮。
为了避免这个问题,你可以做的是在任何int变量的适配器中取一个位置,并在适配器中长按更新位置。
在适配器的getView方法中,位置检查项目是否具有相同的位置将显示按钮,否则它将设置visibilty GONE。
与适配器类似: -
int selectedposition = -1;
public View getView(.........){
// your code
if (position == selectedposition){
button.setVisibility(VISIBLE);
}
else{
button.setVisibility(GONE);
}
return convertedView;
}