简体   繁体   中英

How do I properly remove an item from ListView in Android?

I have try to implement a delete procedure for my item inside the ListView, whe i call adapter.remove(itemToRemove); the itemToRemove is null, and no remove item appear... please Help me!, this is my code:

package com.bandweb.ordinefornitore;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import com.bandweb.ordinefornitore.adapter.CommentArrayAdapter;
import com.bandweb.ordinefornitore.datastructure.CommentObject;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.util.Log;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {

    private Spinner spin_prodotto, spin_tipo;
    private Button btnAggiungi,btnView_order,btnNew_order;
    private EditText EtQta;
    private TextView tvOrder;
    private String  Order,Msg;
    private ArrayList<CommentObject> commentList = null;
    private ListView commentListView = null;
    private Number Riga=0;
    public CommentArrayAdapter adapter;
    protected static final int DIALOG_REMOVE_CALC = 1;
    protected static final int DIALOG_REMOVE_PERSON = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);

         //Prepare the Dataset
        prepareDataList();

        commentListView = (ListView)findViewById(R.id.listComment);
        TextView emptyList = (TextView)findViewById(R.id.txtEmptyList);
        emptyList.setText("No comments to display!");
        commentListView.setEmptyView(emptyList);
        adapter = new CommentArrayAdapter(this, R.id.txtLoadingList, commentList);
        commentListView.setAdapter(adapter);

        //Manage the onItemClick method
        commentListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                CommentObject currComment = (CommentObject)parent.getItemAtPosition(position);
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(MainActivity.this, 
                        "You clicked on a comment by "+currComment.senderName, duration);
                toast.show();

            }
        });

        commentListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
            @Override
            public boolean  onItemLongClick(AdapterView<?> arg0, View v, int pos, long id) {
                // TODO Auto-generated method stub
                 return onLongListItemClick(v,pos,id);
            }

            protected boolean onLongListItemClick(View v, final int pos, long id) {
                final String str=commentListView.getItemAtPosition(pos).toString();
                Log.i("ListView", "onLongListItemClick stirng=" + str);

                AlertDialog diaBox = AskOption();
                diaBox.show();
                CommentObject itemToRemove = (CommentObject)v.getTag();
                adapter.remove(itemToRemove);
                adapter.notifyDataSetChanged();

                return false;
                }

        }); 

        addListenerOnButton();
    }




    public void removeProductOnClickHandler(View v) {

        AlertDialog diaBox = AskOption();
        diaBox.show();
        CommentObject itemToRemove = (CommentObject)v.getTag();
        adapter.remove(itemToRemove);
        adapter.notifyDataSetChanged();
    }

    private AlertDialog AskOption()
     {
        AlertDialog myQuittingDialogBox =new AlertDialog.Builder(this) 
            //set message, title, and icon
            .setTitle("Delete") 
            .setMessage(R.string.calculation_dialog_remove_text) 
            .setIcon(R.drawable.trash_empty)

            .setPositiveButton(R.string.calculation_dialog_button_ok, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) { 
                    //your deleting code

                    dialog.dismiss();
                }   

            })

            .setNegativeButton(R.string.calculation_dialog_button_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    dialog.dismiss();

                }
            })
            .create();
            return myQuittingDialogBox;

        }   

//  private Dialog createDialogRemoveConfirm(final int dialogRemove) {
//      return new AlertDialog.Builder(getApplicationContext())
//      .setIcon(R.drawable.trash_empty)
//      .setTitle(R.string.calculation_dialog_remove_text)
//      .setPositiveButton(R.string.calculation_dialog_button_ok, new DialogInterface.OnClickListener() {
//          public void onClick(DialogInterface dialog, int whichButton) {
//              handleRemoveConfirm(dialogRemove);
//          }
//      })
//      .setNegativeButton(R.string.calculation_dialog_button_cancel, null)
//      .create();
//  }
//  
//  protected void handleRemoveConfirm(int dialogType) {
//      if(dialogType == DIALOG_REMOVE_PERSON){
//          //calc.removePerson();
//      }else if(dialogType == DIALOG_REMOVE_CALC){
//          //removeCalc();
//      }
//  }
//  
////    OnClickListener removeCalcButtonClickListener = new OnClickListener() {
////        public void onClick(View v) {
////            showDialog(DIALOG_REMOVE_CALC);
////        }
////    };
//  
//  @Override
//  protected Dialog onCreateDialog(int id) {
//      switch (id) {
//      case DIALOG_REMOVE_CALC:
//          return createDialogRemoveConfirm(DIALOG_REMOVE_CALC);
//      case DIALOG_REMOVE_PERSON:
//          return createDialogRemoveConfirm(DIALOG_REMOVE_PERSON);
//      }
//      return null;
//  }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

     private void prepareDataList(){
            commentList = new ArrayList<CommentObject>();       
        }   


    // get the selected dropdown list value
      public void addListenerOnButton() {

        spin_prodotto = (Spinner) findViewById(R.id.spin_prodotto);
        spin_tipo = (Spinner) findViewById(R.id.spin_tipo);
        btnAggiungi = (Button) findViewById(R.id.btn_aggiungi);
        btnView_order = (Button) findViewById(R.id.btn_view_order);
        btnNew_order = (Button) findViewById(R.id.btn_new_order);
        EtQta = (EditText) findViewById(R.id.Et_qta);
        //tvOrder = (TextView) findViewById(R.id.tv_ordine);

        btnAggiungi.setEnabled(false);
        btnView_order.setEnabled(false);

        btnNew_order.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                btnAggiungi.setEnabled(true);
                Date now = new Date();
                Order = "Ordine del:\n" +
                        String.valueOf(now.toString())+"\n";

                CommentObject comment = new CommentObject();
                comment.senderName = Order;
                comment.commentText = "Aggiugere i prodotti...";        
                commentList.add(comment);
                adapter.notifyDataSetChanged();
            }

        });

        btnAggiungi.setOnClickListener(new OnClickListener() { 
          @Override
          public void onClick(View v) {

            try {           
                CommentObject comment = new CommentObject();
                comment.senderName = String.valueOf(spin_prodotto.getSelectedItem());
                comment.commentText = "Qtà: "+ String.valueOf(EtQta.getText())+" "+String.valueOf(spin_tipo.getSelectedItem());         
                commentList.add(comment);
                adapter.notifyDataSetChanged();

            } catch (Exception e) {


            }
          }

        });
      }
}

this is my MainActivity.java

package com.bandweb.ordinefornitore.adapter;

import java.util.ArrayList;
import java.util.List;

import com.bandweb.ordinefornitore.R;
import com.bandweb.ordinefornitore.R.id;
import com.bandweb.ordinefornitore.R.layout;
import com.bandweb.ordinefornitore.datastructure.CommentObject;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class CommentArrayAdapter extends ArrayAdapter<CommentObject>{
    private Context m_context = null;
    private ArrayList<CommentObject> m_comments = null;
    private LayoutInflater m_inflater = null;

    public CommentArrayAdapter(Context context, int textViewResourceId,
            List<CommentObject> objects) {
        super(context, textViewResourceId, objects);

        m_context = context;
        m_comments = (ArrayList<CommentObject>)objects;
        m_inflater = LayoutInflater.from(m_context);
    }

    @Override
    public int getCount() {
        if( m_comments != null ){
            return m_comments.size();
        }
        return 0;
    }

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

        CommentViewHolder holder = null;

        //form the view
        if( convertView == null ){
            holder = new CommentViewHolder();
            convertView = m_inflater.inflate(R.layout.order_list_row, parent, false);
            //holder.senderImage = (ImageView)convertView.findViewById(R.id.imgUserImage);
            holder.senderName = (TextView)convertView.findViewById(R.id.txtUserName);
            holder.commentText = (TextView)convertView.findViewById(R.id.txtUserComment);
            holder.removeProductButton = (ImageButton)convertView.findViewById(R.id.remove_product);
            //holder.link = (TextView)convertView.findViewById(R.id.txtClickableLink);

            convertView.setTag(holder);

        }else{

            holder = (CommentViewHolder)convertView.getTag();
        }

        //bind the data to the view
        CommentObject comment = m_comments.get(position);
        holder.senderName.setText(comment.senderName);
        holder.commentText.setText(comment.commentText);
        //final ImageButton clickableText = comment.removeProductButton;
        //holder.link.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              int duration = Toast.LENGTH_SHORT;
//              Toast toast = Toast.makeText(m_context, clickableText, duration);
//              toast.show();               
//          }
//      });
//      holder.removeProductButton.setOnClickListener(new OnClickListener() {
//          public void onClick(View v) {
//              int duration = Toast.LENGTH_SHORT;
//              Toast toast = Toast.makeText(m_context, "rimuovere", duration);
//              toast.show();   
//
//          }
//      });

        return convertView;
    }

    private class CommentViewHolder{
        ImageButton removeProductButton;
        TextView senderName;
        TextView commentText;
    }
}

this is my CommentArrayAdapter.java

package com.bandweb.ordinefornitore.datastructure;

public class CommentObject 
{       
public String senderName;   
public String commentText; 
}

this is my CommentObject.java

package com.bandweb.ordinefornitore;

import android.app.Application;
import android.content.Context;


public class CustomAppContext extends Application {

    private static CustomAppContext context;

    @Override
    public void onCreate() {
        super.onCreate();

        context = this;
    }

    public static CustomAppContext getInstance(){
        return context;
    }

    public static Context getContext(){
        return context.getApplicationContext();
    }

    /*Add your other methods and global variables here*/
}

This is my CustomAppContext.java

You can call .remove on your list that populates your view. Afterwards you will want to notifyDataSetChanged to "refresh" the ArrayAdapter

So if you have an array called mylist that populates your listView

mylist.remove(int index):
notifyDataSetChanged();

You can try following :

Replace adapter.remove(itemToRemove);

By adapter.remove(adapter.getItem(pos));

So that your code becomes:

protected boolean onLongListItemClick(View v, final int pos, long id) {
                final String str=commentListView.getItemAtPosition(pos).toString();
                Log.i("ListView", "onLongListItemClick stirng=" + str);

                AlertDialog diaBox = AskOption();
                diaBox.show();
                CommentObject itemToRemove = (CommentObject)v.getTag();
                adapter.remove(adapter.getItem(i)); // changed this line
                adapter.notifyDataSetChanged();

                return false;
                }

In your code ArrayList<CommentObject> commentList is collection of CommentObject , hence you must remove that item from your collection using commentList.remove(itemToRemove) and then call adapter.notifyDataSetChanged() , but you are calling remove(itemToRemove) on adapter .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM