2016-07-25 89 views
1

說明: 我知道這個問題沒有問。的時代。試着首先了解我的問題。我有一個listview,其中我使用了一個BaseAdapter來顯示我的listivew行上的動態項目,並且它不是一個固定的。我刪除了包含在該行中的數據,但刪除了該行。雖然我刪除了一行數據完全刪除,但不是一個列表視圖行。我想從列表中刪除一個特定的行。如何從android中的listview中刪除特定的行?

適配器

public class CartAdapter extends BaseAdapter { 

    private static final String TAG=CartAdapter.class.getSimpleName(); 

    public Context context; 
    public List<CartItems> cartItemList; 
    public LayoutInflater inflater; 
    public AppCompatActivity activity; 

    public CartAdapter(Context context, List<CartItems> cartItemList,AppCompatActivity activity) { 
     this.context = context; 
     this.cartItemList = cartItemList; 
     this.activity=activity; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return this.cartItemList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return this.cartItemList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


    private class CartHolder { 
     TextView txtItemName, txtItemPrice, txtQtyCount; 
     ImageButton btnImgDelete; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup viewGroup) { 

     final CartHolder holder; 
     if (view == null) { 
      holder = new CartHolder(); 
      view = inflater.inflate(R.layout.cart_items, null); 

      holder.txtItemName = (TextView) view.findViewById(R.id.txt_item_name); 
      holder.txtItemPrice = (TextView) view.findViewById(R.id.txt_item_price); 
      holder.txtQtyCount = (TextView) view.findViewById(R.id.txt_qty_count); 

      holder.btnImgDelete=(ImageButton)view.findViewById(R.id.btn_img_delete); 

      holder.btnImgDelete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(final View view) { 
        final AlertDialog.Builder alertDialog=new AlertDialog.Builder(activity,R.style.MyAlertDialogStyle); 
        alertDialog.setTitle("Delete"); 
        alertDialog.setIcon(R.drawable.ic_action_cancel); 
        alertDialog.setMessage("Do you really want to delete item??"); 
        alertDialog.setCancelable(true); 
        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          cartItemList.remove(position); 
          notifyDataSetChanged(); 
         } 
        }); 
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          dialogInterface.dismiss(); 
         } 
        }); 
        alertDialog.show(); 
       } 
      }); 
      view.setTag(holder); 
     } else { 
      holder = (CartHolder) view.getTag(); 
     } 

     CartItems cartItems = cartItemList.get(position); 
     holder.txtItemName.setText(cartItems.getItemName()); 
     holder.txtItemPrice.setText(Util.priceTODollar(cartItems.getItemPrice())); 
     holder.txtQtyCount.setText("" + cartItems.getItemQty()); 


     return view; 
    } 
} 

截圖從後

enter image description here

截圖列表視圖之前刪除項目從列表視圖中刪除項目

enter image description here

在第二個屏幕截圖中刪除了第二個項目,但白色背景顏色保持不變。

請幫我解決這個問題。

+0

它已經在我的文章中可用。在AlertDialog.Builder中 –

+0

它只有兩行cartItemList.remove(position); notifyDataSetChanged(); –

+0

不確定這是否是您的問題,但是您的代碼'cartItemList.remove(position);'是錯誤的,因爲位置在ListView中發生變化,並且Views也被重用。你應該保存在持有人的位置。 – lionscribe

回答

1

最後,我找到了解決辦法。經過大量的努力和嘗試。我不確定這是否是可行的解決方案。

從i設定處理程序的適配器除去後的項目,並通過所述捆綁到消息對象象下面這樣:

holder.btnImgDelete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(final View view) { 
        final AlertDialog.Builder alertDialog=new AlertDialog.Builder(activity,R.style.MyAlertDialogStyle); 
        alertDialog.setTitle("Delete"); 
        alertDialog.setIcon(R.drawable.ic_action_cancel); 
        alertDialog.setMessage("Do you really want to delete item??"); 
        alertDialog.setCancelable(true); 
        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          if(cartItemList.remove(cartItems)) { 
           notifyDataSetChanged(); 

           Message message=new Message(); 
           Bundle bundle=new Bundle(); 
           bundle.putSerializable("KEY",(Serializable)cartItemList); 
           message.setData(bundle); 
           activity.uiHomeHandler.sendMessage(message); 
          } 
         } 
        }); 
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          dialogInterface.dismiss(); 
         } 
        }); 
        alertDialog.show(); 
       } 
      }); 

在活動我再次cartitemList對象設置爲baseAdapter和移除後再次調用它項目

SuppressLint("HandlerLeak") 
    public class UiHandler extends Handler { 
     @Override 
     public void handleMessage(final Message msg) { 
      super.handleMessage(msg); 
      Bundle b=msg.getData(); 
      cartItemList=(List)b.getSerializable("KEY"); 

      mCartAdapter=new CartAdapter(getApplicationContext(),cartItemList,CartActivity.this); 
      lvCartItem.setAdapter(mCartAdapter); 
      Helper.getListViewSize(lvCartItem); 
     } 
    } 
0

你的問題是在這裏:

cartItemList.remove(position); 

正如你所知道的那樣,在列表視圖中,當他們離開屏幕時,行將是recycled。因此,在初始化一行時(getView方法中的view == null),實際上並不知道分配給此行的位置,因爲此行可以分配多個不同的位置。

爲了正確找到位置,您應該使用列表視圖的getPositionForView方法。所以,在你onClick監聽器這一個替換代碼:

int p = ((ListView) viewGroup).getPositionForView(view); 
cartItemList.remove(p); 
notifyDataSetChanged(); 

注意,在上面的代碼片段,viewGroup指列表視圖本身view是指該行被刪除。因此,請在onClick方法中重命名view,以避免名稱衝突。

相關問題