android从listview中删除任何项目删除最后一个元素

Posted

技术标签:

【中文标题】android从listview中删除任何项目删除最后一个元素【英文标题】:android delete any item from listview deleting last element 【发布时间】:2013-01-11 18:47:21 【问题描述】:

我创建了一个列表视图,你可以通过触摸该列表视图的行来删除一个项目,但它总是删除最后一个项目,并且在一些删除时间后它显示索引超出范围错误

系统是当你点击一个项目时打开一个对话框你点击打印然后项目将删除该项目并打开一个活动几秒钟。

这里是列表适配器类

   @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final int positionplayer = position;
        ViewHolderaway1 holder;

        if (convertView == null) 

            View row = inflater.inflate(R.layout.readonlyvendorlist, parent,
                    false);

            row.setOnClickListener(new OnClickListener() 

                @Override
                public void onClick(View v) 
                    // TODO Auto-generated method stub
                    // set title
                    try 
                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                context);

                        alertDialogBuilder.setTitle(values.get(positionplayer).Voucherref
                                + "  Sell");

                        // set dialog message
                        alertDialogBuilder
                                .setMessage(
                                        values.get(positionplayer)
                                                .getVoucherref() + "For Print")
                                .setCancelable(false)
                                .setPositiveButton("Print Voucher",
                                        new DialogInterface.OnClickListener() 
                                            public void onClick(
                                                    DialogInterface dialog,
                                                    int id) 
                                                // if this button is clicked,
                                                // close

                                                PrintTestAcitvity.printettext = values
                                                        .get(positionplayer).PrinterText;
                                                ListService.printerlist
                                                        .remove(positionplayer);

                                                Datasync.storedataprint(context);
                                                notifyDataSetChanged();
                                                Intent ia = new Intent(context,
                                                        PrintTestAcitvity.class);

                                                context.startActivity(ia);

                                            
                                        )
                                .setNegativeButton("Cancell",
                                        new DialogInterface.OnClickListener() 
                                            public void onClick(
                                                    DialogInterface dialog,
                                                    int id) 
                                                // if this button is clicked,
                                                // just close
                                                // the dialog box and do nothing
                                                Toast.makeText(
                                                        context,
                                                        "Printing Data store for locally",
                                                        Toast.LENGTH_LONG)
                                                        .show();

                                                dialog.cancel();
                                            
                                        );

                        // create alert dialog
                        AlertDialog alertDialog = alertDialogBuilder.create();

                        // show it
                        alertDialog.show();
                     catch (IndexOutOfBoundsException e) 
                        // TODO: handle exception
                        notifyDataSetChanged();
                    
                
            );

            holder = new ViewHolderaway1();

            holder.ProductItemID = (TextView) row
                    .findViewById(R.id.ProductItemID);

            holder.VoucherCost = (TextView) row.findViewById(R.id.VoucherCost);

            holder.SupplierID = (TextView) row.findViewById(R.id.SupplierID);

            Log.d("goru", "gadha");

            row.setTag(holder);

            holder = (ViewHolderaway1) row.getTag();
//          Printer Productsdata = values.get(positionplayer);
//          if (Productsdata != null) 
//              holder.ProductItemID.setText("Print");
//              holder.VoucherCost.setText(Productsdata.getVoucherref());
//              // holder.SupplierID.setText(resid)
//              // holder.SupplierID.setVisibility(View.GONE);
//
//              if (Productsdata.getVoucherref().contains("Voda")) 
//                  holder.VoucherCost.setBackgroundColor(Color.RED);
//                  holder.VoucherCost.setTextColor(Color.WHITE);
//                  holder.SupplierID.setBackgroundDrawable(getContext()
//                          .getResources().getDrawable(R.drawable.voda));
//              
//              if (Productsdata.getVoucherref().contains("Eco")) 
//                  holder.VoucherCost.setBackgroundColor(Color.BLUE);
//                  holder.VoucherCost.setTextColor(Color.WHITE);
//                  holder.SupplierID.setBackgroundDrawable(getContext()
//                          .getResources().getDrawable(R.drawable.eco));
//              
//
//          
            convertView = row;
        else
        
            holder = (ViewHolderaway1) convertView.getTag();
        
            Printer Productsdata = values.get(positionplayer);
            if (Productsdata != null) 
                holder.ProductItemID.setText("Print");
                holder.VoucherCost.setText(Productsdata.getVoucherref());
                // holder.SupplierID.setText(resid)
                // holder.SupplierID.setVisibility(View.GONE);

                if (Productsdata.getVoucherref().contains("Voda")) 
                    holder.VoucherCost.setBackgroundColor(Color.RED);
                    holder.VoucherCost.setTextColor(Color.WHITE);
                    holder.SupplierID.setBackgroundDrawable(getContext()
                            .getResources().getDrawable(R.drawable.voda));
                
                if (Productsdata.getVoucherref().contains("Eco")) 
                    holder.VoucherCost.setBackgroundColor(Color.BLUE);
                    holder.VoucherCost.setTextColor(Color.WHITE);
                    holder.SupplierID.setBackgroundDrawable(getContext()
                            .getResources().getDrawable(R.drawable.eco));
                

            
        return convertView;
    

【问题讨论】:

【参考方案1】:

你在getView()中的逻辑有一些重大缺陷,这是最大的一个:

    if (convertView != null)
      
        holder = new ViewHolderaway1();


        return convertView;
    

这将返回回收的行而不更改它...您至少需要更改布局的书面内容。

查看此答案中的代码:https://***.com/a/4145996/1267661。您应该使用它作为模板。它演示了如何正确使用 ViewHolder 并在从 ListView 的 RecycleBin 返回 View 后显示准确的数据。


加法 这段新代码更加更有效率!另外我想我明白为什么只删除最后一行。在您的 AlertDialog 中,您引用了 positionplayer,但此 onClick() 代码在 getView() 完成后运行,因此 positionplayer 在这里没有帮助。由于您的 OnClickListener 指的是整行,因此您应该在 Activity 中使用 OnItemClickListener,这将有助于删除相应的行:

listView.setOnItemClickListener(new OnItemClickListener() 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        // Move your AlertDialog code here and use position instead of positionplayer
    
);

【讨论】:

它们以 ViewHolder 为中心,您实际上并没有使用它的任何好处。如果您遵循模板并且仅在convertView == null 时使用findViewById(),您将拥有更快的代码。一个小的改进是在你的构造函数中只获取一次 LayoutInflater,因为它总是一样的。 如果您重新编写代码,请将其发布在您的问题中,然后在您完成此操作时通知您。我很乐意为您提供更多指点(我只是不会为您重新编写代码。) 这段代码效率更高!现在是否删除了正确的行? 我不这么认为,但我的新答案可能会。 :) @Sam 你能回答类似的问题吗:***.com/questions/23489233/…

以上是关于android从listview中删除任何项目删除最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Android:从 ListView/ArrayAdapter Activity 中删除项目

如何从android的listview中删除一个项目

从listView中删除项目仅删除最后一项未选择的元素android

Android:如何从 listView 和 arrayAdapter 中删除项目

无法从 Listview 中删除项目(待办事项列表),长按没有任何反应

android - 长按从 ListView 中删除项目