问题
I have an ArrayAdapter and while pressing on a button I want to:
- delete some data from my Array which is being held in MainActivity
- delete one line from txt file (FileManager handles deleting but i have to access a file which is private in MainActivity)
How can I send this data?
deleteDeckButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//i've done it with DECK_NAMES being static public in
//MainActivity and i really dont like this solution
FileManager deckNamesManager = new FileManager(DECK_NAMES); deckNamesManager.deleteLine(manager.getFileName());
// deck files is static public in MainActivity as well
deckFiles.remove(getPosition(manager));
manager.deleteFile();
notifyDataSetChanged();
}
});
That's how I'd like my MainActivity to look like:
public class MainActivity extends AppCompatActivity {
static final int DECK_NAME_REQUEST = 1;
private ListView mListView;
private FlashCardsAdapter deckAdapter;
// ATM deckFiles is static public
private ArrayList<FileManager> deckFiles;
// ATM DECK_NAMES is static public
private File DECK_NAMES; // ATM it's static public
EDIT: final version of ArrayAdapter
public class FlashCardsAdapter extends ArrayAdapter<FileManager> {
interface Callback {
void onFileDeleted(String fileName);
}
private final Callback mCallback;
public FlashCardsAdapter(Context context, ArrayList<FileManager> users, final Callback callback) {
super(context, 0, users);
mCallback = callback;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final FileManager manager = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_view_item, parent, false);
}
TextView mainTextView = convertView.findViewById(R.id.deck_name_id);
Button addCardButton = convertView.findViewById(R.id.action_add_card);
Button deleteDeckButton = convertView.findViewById(R.id.action_delete);
mainTextView.setText(manager.getFileName());
mainTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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) {
manager.deleteFile();
mCallback.onFileDeleted(manager.getFileName());
}
});
return convertView;
}
}
回答1:
You can send a callback from your adapter back to your activity.
You adapter would have something like that
class Adapter {
interface Callback {
void onFileDeleted(String fileName);
}
private final Callback callback;
Adapter(final Callback callback) {
this.callback = callback;
}
..
..
..
deleteDeckButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FileManager deckNamesManager = new FileManager(DECK_NAMES); //i've done it with DECK_NAMES being static public in MainActivity and i really dont like this solution
deckNamesManager.deleteLine(manager.getFileName());
deckFiles.remove(getPosition(manager)); // deck files is static public in MainActivity as well
manager.deleteFile();
notifyDataSetChanged();
callback.onFileDeleted(manager.getFileName());
}
});
}
And when you are creating your adapter you would do something like that
new Adapter(new Adapter.Callback() {
@Override
public void onFileDeleted(final String fileName) {
// Do your magic in the activity
}
});
来源:https://stackoverflow.com/questions/47659686/best-way-to-send-data-from-arrayadapter-to-mainactivity