2015-12-28 1 views
0

J'essaie de supprimer une ligne lorsque l'utilisateur clique sur le bouton pour supprimer. Le problème auquel je suis confronté est que si je supprime une ligne, il supprime la dernière ligne sur l'interface utilisateur. J'ai un adaptateur avec l'Arraylist. Au clic, je supprime l'élément de l'arraylist et appelle notifydatasetchanged. Le débogage je vois que bon article a été supprimé mais l'assurance-chômage, je vois que la dernière ligne ne se voit pas (la ligne supprimée peut encore être vu)Android listview Supprimer la ligne ne fonctionne pas

public class MenuDetailsAdapter extends BaseAdapter { 
    private Activity activity; 
    private LayoutInflater inflater; 
    private List<MenuItem> menuItems; 
    private View userView,itemView ; 
    public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) { 
     this.activity=activity; 
     this.menuItems = menuItems; 
    } 

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

    @Override 
    public Object getItem(int pos) { 
     return menuItems.get(pos); 
    } 

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

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

     if (inflater == null) { 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 
     if(convertView==null) 
     { 
      convertView= inflater.inflate(R.layout.menu_card_row, null); 
      ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow); 
      im.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        menuItems.remove(position); 
        notifyDataSetChanged(); 
       } 
      }); 
      TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name); 
      tvItemName.setText(((MenuItem) getItem(position)).getName()); 

      TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice); 
      tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost()); 

      TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty); 
      tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity()); 
     } 
     return convertView; 
    } 
} 
+0

@jetty: plz ne supprimez point à l'intérieur listView.SetOnItemClickListener(). Dans le getView() mth vous verrez toujours la dernière rangée visible dans ListView – kevz

+1

Problème lié à la méthode 'getView' utilisez ViewHolder dans la méthode getView. voir post suivant [Comment implémenter un support de vue?] (http://stackoverflow.com/questions/4145602/how-to-implement-a-view-holder) –

+0

@jetty .... Vérifie ma réponse ... Cela peut être utile pour vous ... –

Répondre

0

Changer la méthode ur getView comme ci-dessous -

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

    if(convertView == null){ 
     convertView= inflater.inflate(R.layout.menu_card_row, null); 
    } 

    ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow); 
    im.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      menuItems.remove(position); 
      notifyDataSetChanged(); 
     } 
    }); 
    TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name); 
    tvItemName.setText(((MenuItem) getItem(position)).getName()); 

    TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice); 
    tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost()); 

    TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty); 
    tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity()); 

return convertView; 

} 
+0

@jetty: Avez-vous essayé mon Solution? – kevz

0
private void deleteRow(int position) 
{ 
menuItems.remove(position); 

notifyDataSetChanged(); 
} 
0

Remplacez le code par ces codes .... Il pourrait être utile pour vous

public class MenuDetailsAdapter extends BaseAdapter { 
    private Activity activity; 
    private LayoutInflater inflater; 
    private List<MenuItem> menuItems; 
    private View userView,itemView ; 
    public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) { 
     this.activity=activity; 
     this.menuItems = menuItems; 
    } 

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

    @Override 
    public Object getItem(int pos) { 
     return menuItems.get(pos); 
    } 

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

    public class ViewHolder { 

    ImageView im; 
    TextView tvItemName; 
    TextView tvItemPrice; 
    TextView tvItemQty; 

    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder _viewHolder; 
    if (convertView == null) { 


      _viewHolder = new ViewHolder(); 

      LayoutInflater _layInflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      convertView = _layInflater.inflate(R.layout.menu_card_row, null); 


      _viewHolder.tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name); 

      _viewHolder.tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice); 
      _viewHolder.tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty) 



      convertView.setTag(_viewHolder); 


     } else { 
      _viewHolder = (ViewHolder) convertView.getTag(); 
     } 


      _viewHolder.tvItemName.setText(((MenuItem) getItem(position)).getName()); 
      _viewHolder.tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost()); 
      _viewHolder.tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity()); 

     _viewHolder.im.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        menuItems.remove(position); 
        notifyDataSetChanged(); 
       } 
      }) 


     return convertView; 
    } 
+0

J'obtiens des exceptions de pointeur NULL après avoir utilisé la vue Recycleur après avoir ajouté la deuxième ligne. Je suis à partir de maintenant avec @kevz réponse (même si elle ne peut pas être efficace) – jetty

+0

@jetty .... Il ok bro ...Qui que vous acceptiez la réponse ... Je m'en fous ... ma principale motivation est d'aider ... vous débarrasser de votre problème ... me suffit ... tout le meilleur .... codage heureux :) –

0

vous ne pouvez pas supprimer vue directement d'ici à moins que votre adaptateur dans la classe d'activité. En utilisant votre code, vous ne pouvez pas fournir de mises à jour au constructeur super classe.

Vous pouvez essayer ce code dans votre activité -

listview.setOnItemClickListner(.... use listner 


    menuItems.remove(position); 
    MenuDetailsAdapter adapter = MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems); 
    adapter.notifyDataSetChanged(); 


); 
0

Remplacez le code par ces codes .... Il pourrait être utile pour vous. vous pouvez modifier uniquement l'écouteur de clics imageview.

convertView= inflater.inflate(R.layout.menu_card_row, null); 
    ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow); 
    im.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      menuItems.remove(position); 
      notifyDataSetChanged(); 
     } 
    }); 
    TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name); 
    tvItemName.setText(((MenuItem) getItem(position)).getName()); 

    TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice); 
    tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost()); 

    TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty); 
    tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity()); 
0
public class MenuDetailsAdapter extends BaseAdapter { 
private Activity activity; 
private LayoutInflater inflater; 
private List<MenuItem> menuItems; 
private View userView,itemView ; 
public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) { 
    this.activity=activity; 
    this.menuItems = menuItems; 
} 

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

@Override 
public Object getItem(int pos) { 
    return menuItems.get(pos); 
} 

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

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

    if (inflater == null) { 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    if(convertView==null) 
    { 
     convertView= inflater.inflate(R.layout.menu_card_row, null); 
     ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow); 
     im.setOnClickListener(new Listener(position)); 
     TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name); 
     tvItemName.setText(((MenuItem) getItem(position)).getName()); 

     TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice); 
     tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost()); 

     TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty); 
     tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity()); 




    } 


    return convertView; 
} 

class Listener implements View.OnClickListener { 


     private int position; 

     Listener(int position) { 
      this.data = position; 

     } 

     @Override 
     public void onClick(View v) { 
       menuItems.remove(position); 
       notifyDataSetChanged(); 
     } 
    } 

    } 
0

Votre ListView fonctionne bien, cependant, il semble que vous avez mal compris comment un ListView dans Android fonctionne. Sous Android pour économiser de la mémoire, utilisez un recycling mechanism.

Votre logique dans getView n'est pas correcte, vous renvoyez tous les convertView s n'étant pas null. Tous les convertView s non-null sont en fait les vues de rebut qui ont été hors écran ou ont été retirées du modèle. Dans votre cas, chaque fois que vous supprimez une ligne, sa vue correspondante sera marquée comme rebut et sera supprimée du ListView. Ainsi, votre ListView perdra l'une de ses lignes et aura besoin d'une autre ligne pour couvrir tout. de sa région. Par conséquent, il demande une autre ligne de la méthode getView, et là, vous retournez la même vue enlevée/scrap que vous ne devriez pas.

0

utiliser ceci:

public void deleteRow(int position) 
{ 
    menuItems.remove(position); 

    adapter.notifyDataSetChanged(); 
} 
+0

Pouvez-vous expliquer un peu comment/pourquoi cela fonctionne? Les explications sont obligatoires-ish sur SO. – Will