简体   繁体   中英

OnItemLongClick event of listView Android

I have a list view with custom cell layout. Actually it shows data from a table, there are two button one for editing and the other is for deleting the record. these two buttons are hidden, when long click on the row then these two buttons shows up . Here is the 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>

those two buttons are in Table Layout i give them 0dp height fro hiding them.

And this is OnLongItemClick event of listView :

 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 ;
        }
    });

Here comes the problem . When an item in listview is long clicked then it shows the edit and delete button of that items but it also shows those button in the item which is at next 7th position . For example if i click item on position 3 then button of 3,10,17,.... are also showed ... how to get ride of this problem ???

This sounds to me like you're dealing with the ListView's view recycling feature. This answer provides a great explanation.

Basic example: if a ListView has a total of 20 items but only enough room to show 4 on screen at the same time, then the ListView will only use 4 view objects but recycle them for each item in the list. So if you change something on view 2, then scroll down you'll find that this change also applied to view 6. This is what makes dynamic views difficult with ListViews.

In the above example, if your adapter is loading view 6, in your adapter's getView method, the convertView object is the view from 2, which is then repurposed for data element 6. I would play around with storing whether the buttons are shown in your data and resetting the convertView in this method and then showing/hiding the buttons based on the underlying data .

ListViews handle focus on displaying underlying data, but not necessarily editing that data in a view.

You could try skipping the part of your getView that tries to use the convertView so that you're always making a new view, but I'm found this can cause some other unexpected UI experiences. Good luck!

The problem is occuring because listview cells are reusing. And when you are showing the button for a particular cell and scroll the list view then the item which is reusing that cell will also show the buttons.

To avoid the problem what you can do is take a position in adapter by any int variable and update the posion on long press in adapter.

In getView method of adapter put the position check if items are having same postion will show the button else it will set visibilty GONE.

Like in adapter : -

int selectedposition = -1; 
 public View getView(.........){ 
// your code 
 if (position == selectedposition){
    button.setVisibility(VISIBLE);
 }
else{ 
      button.setVisibility(GONE);
 }

return convertedView;

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM