ListView Android的OnItemLongClick事件

时间:2014-11-11 17:14:11

标签: android android-listview

我有一个带有自定义单元格布局的列表视图。实际上它显示来自表格的数据,有两个按钮用于编辑,另一个用于删除记录。这两个按钮是隐藏的,当长按行时,这两个按钮就会显示出来。 这是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,....的按钮也会显示... 如何解决这个问题?

2 个答案:

答案 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;

}