Search code examples
androidlistviewonclicklistener

click listeners for each item in listview


Hi I would like to listen for a clicks on each item in list view I have this code that partially does the job but i.e if I have 5 items and i have a method that deletes one of them it always deletes the last one not the one I clicked on. I've read that I should do interface with onClick method that takes view and position into its constructor but then I'd have a listener for whole item in list and I want to have 4 listeners in this case here is code sample:

public class FlashCardsDecksArrayAdapter extends ArrayAdapter<FileManager> {
interface Callback {
    void onFileDeleted(String fileName);
}

private final Callback mCallback;

private FileManager manager;

public FlashCardsDecksArrayAdapter(Context context, ArrayList<FileManager> files, final Callback callback) {
    super(context, 0, files);
    mCallback = callback;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    manager = getItem(position);

    if (convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_view_item, parent, false);
    }


    TextView deckNameTextView = convertView.findViewById(R.id.deck_name_id);

    Button addCardButton = convertView.findViewById(R.id.action_add_card);

    Button deleteDeckButton = convertView.findViewById(R.id.action_delete);

    Button settingsButton = convertView.findViewById(R.id.action_deck_settings);

    deckNameTextView.setText(manager.getFileName());

    deckNameTextView.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            if(manager.length() == 0){
                Toast toast = Toast.makeText(getContext(), "deck is empty", Toast.LENGTH_SHORT);
                toast.show();
            } else{
                Intent intent = new Intent(getContext(), FlashCardActivity.class);
                intent.putExtra("fileName", manager.getFileName());
                getContext().startActivity(intent);
            }
        }
    });

    addCardButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            Intent intent = new Intent(getContext(), AddCardActivity.class);
            intent.putExtra("fileName", manager.getFileName());
            getContext().startActivity(intent);
        }
    });

    deleteDeckButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buildAlertDialog();
        }
    });

    settingsButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view){
            if(manager.length() == 0){
                Toast toast = Toast.makeText(getContext(), "deck is empty", Toast.LENGTH_SHORT);
                toast.show();
            } else {
                Intent intent = new Intent(getContext(), FlashCardsDeckSettingsActivity.class);
                intent.putExtra("fileName", manager.getFileName());
                getContext().startActivity(intent);
            }
        }
    });

    return convertView;
}
private AlertDialog buildAlertDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
            .setNegativeButton("No", dialogClickListener).show();
    return builder.create();
}

DialogInterface.OnClickListener dialogClickListener = new 
DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
            case DialogInterface.BUTTON_POSITIVE:
                manager.deleteFile();
                mCallback.onFileDeleted(manager.getFileName());
                break;
            case DialogInterface.BUTTON_NEGATIVE:
                //No button clicked
                break;
        }
    }
};
}

Solution

  • setTag(position) and then int pos view.getTag() solves the problem