使用基本适配器解决方案从自定义列表中删除行视图

Posted

技术标签:

【中文标题】使用基本适配器解决方案从自定义列表中删除行视图【英文标题】:Delete row view from custom list using base Adapter solution 【发布时间】:2016-01-26 19:45:26 【问题描述】:

您好,我无法从列表视图中删除一行我不知道如何删除它我从互联网上搜索了很多我尝试了很多示例但我无法解决问题。当我单击 hldr.delete 按钮时,请从列表解决方案中删除完整的列表视图行。

下单活动

public class PlaceOrder extends Activity 

    String [] pIds; 
    String [] pNames; 
    String [] pPrizes; 
    static ListView lv;
    ImageView bck;
    String [] listImages;
    String food_id;
    String userdata[];
    Intent i;
    TextView totalprze;
    float tprize;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_place_order);

        lv=(ListView)findViewById(R.id.cart_list);
        bck=(ImageView) findViewById(R.id.placeholder_bg_btn);
        totalprze =(TextView) findViewById(R.id.place_order_price);

        i=new Intent(this,Menu.class);

        bck.setOnClickListener(new OnClickListener() 


            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                 Bundle bundle=new Bundle();

                    //bundle.putStringArray("images", ListImages);
                    bundle.putString("food_id", food_id);
                    bundle.putStringArray("images", listImages);
                    bundle.putStringArray("userData",userdata);
                    i.putExtras(bundle);
                    startActivity(i);
            
        );


        if(this.getIntent().getExtras()!=null)
        

         Bundle b=this.getIntent().getExtras();

         pIds=b.getStringArray("pId");
         pNames=b.getStringArray("PName");
         pPrizes=b.getStringArray("pPrize");
         userdata=b.getStringArray("userData");
         tprize=b.getFloat("totalprize");


         food_id=b.getString("food_id");
         listImages=b.getStringArray("images");
         String prz=Float.toString(tprize);
         totalprze.setText("$"+prz);
         lv.setAdapter(new cartAdapter(PlaceOrder.this, pIds, pNames, pPrizes,userdata));

         pIds=null;
         pNames=null;
         pPrizes=null;
       
    
        public void onBackPressed() 
         pIds=null;
         pNames=null;
         pPrizes=null;
        


购物车适配器

public class cartAdapter  extends BaseAdapter

     String [] pIdz;
     String [] pNamz;
     String [] pPrizs;
     String [] userData;
    // List<String> imges;
     Context context;
    // private ShopingCartHelper obj;

     private static LayoutInflater inflater=null;
     JSONArray jCat = null;
     int count=0;
     ProgressDialog pDialog;


     public cartAdapter(PlaceOrder ctx,
             String[] pIds,String[] pNams, String[] pprise,String [] userdata) 

         pIdz=pIds;
         pNamz=pNams;

         context=ctx;
         pPrizs=pprise;
         userData=userdata;

         inflater = ( LayoutInflater )context.
                         getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // TODO Auto-generated constructor stub

     

        @Override
    public int getCount() 
        // TODO Auto-generated method stub
            if(pIdz==null)
                Toast.makeText(context, "There is issue with net connection.", Toast.LENGTH_LONG).show();
                //Intent i=new Intent(context,WelcomeActivity.class);
                //context.startActivity(i);
                return count ;
            else
                return pIdz.length;
            

        

    @Override
    public Object getItem(int position) 
        // TODO Auto-generated method stub
        return position;
    

    @Override
    public long getItemId(int position) 
        // TODO Auto-generated method stub
        return position;

    

    public class holder
         TextView pid;
         TextView pname;
         TextView pprise;
         Button delete;
         ListView lv;

    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 

       final  holder hldr=new holder();
        View rowView = null;
        Bitmap bitmap = null;



          rowView = inflater.inflate(R.layout.place_order_item_list, null);
          hldr.pid=(TextView) rowView.findViewById(R.id.item_id);
          hldr.pname=(TextView) rowView.findViewById(R.id.item_name);
          hldr.pprise=(TextView) rowView.findViewById(R.id.item_price);
          hldr.delete=(Button) rowView.findViewById(R.id.delete);   
          hldr.pid.setText(pIdz[position]);
          hldr.pname.setText(pNamz[position]);
          hldr.pprise.setText(pPrizs[position]);

          /* convertView.setTag(hldr);
          hldr.delete.setTag(hldr);*/
          //
          //  Picasso.with(context).load(imgs[position]).into(hldr.img);
          hldr.delete.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                // rowView.remove(position); //removing from your List
                //Toast.makeText(context, "Delete",Toast.LENGTH_LONG).show();
                int pid=Integer.parseInt(hldr.pid.getText().toString());
                //Toast.makeText(context, "pid"+pid, Toast.LENGTH_LONG).show();
                new ShopingCartHelper(context).delProduct(pid);
                 //PlaceOrder.lv.removeViewAt(position);

                notifyDataSetChanged();

            
        );
           rowView.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
//              // TODO Auto-generated method stub
//               cartAdapter.this.pIdz.remove[position];

            //  Toast.makeText(context, "hi",Toast.LENGTH_LONG).show();
            
        );
         return rowView;

        // TODO Auto-generated method stub
    

【问题讨论】:

【参考方案1】:

您无法从数组中删除任何内容 - 它们始终是固定长度的。一旦您创建了一个长度为 3 的数组,该数组的长度将始终为 3。如果您想从列表视图中删除,您使用的数组应该是动态的(添加和删除)。所以把pIdz; pNamz;pPrizs;userData变成一些Modal Object,并准备好Modal Objects列表并传递给adapter,让生活更轻松

您最好使用列表,例如一个数组列表:

hldr.delete.setTag(position);
hldr.delete.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub
            int position = (int)v.getTag();                
            list.remove(position);
            notifyDataSetChanged();

        
    );

【讨论】:

【参考方案2】:

首先。

您应该创建一个对象来存储所有不同的字符串,而不是为每个值使用多个数组。

Ej:

class MyClass

    String id;
    String name
    String price;

    public MyClass(String id, String name, String price)
    
        this.id = id;
        this.name = name;
        this.price = price;
    

这样您就不必删除每个数组的位置。

最后回答您的问题,只需删除您要为每个数组删除的位置值。

由于它们是 Array 而不是 ArrayList,您需要使用正确的新维度重新创建它(注意,使用 ArrayList 会更容易)。

然后只需在您的 Adapter 类上调用 notifyDataSetChanged()。

希望这会有所帮助。

【讨论】:

以上是关于使用基本适配器解决方案从自定义列表中删除行视图的主要内容,如果未能解决你的问题,请参考以下文章

列表视图中的页脚按钮,如何从自定义列表适配器中获取值

Android - 从自定义列表视图中删除一个项目并在长按时更新它

使用 sqliteDatabase 从自定义列表视图中删除项目

使用微调器从自定义列表视图中删除了错误的行

如果自定义列表视图行内容是动态的,如何使用视图持有者?

使用sqliteDatabase从自定义列表视图中删除项目