Best way to send data from ArrayAdapter to MainActivity

江枫思渺然 提交于 2019-12-13 03:52:02

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!