列表视图中的删除按钮项目在长按时显示在另一个位置

时间:2014-08-14 13:35:25

标签: java android listview onclicklistener

我想在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;

      }

我的问题:当我长按一个项目时,删除按钮出现在另一个项目上......

1 个答案:

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