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;
}
}
};
}
setTag(position) and then int pos view.getTag() solves the problem