簡體   English   中英

如何通過引用傳遞對象通過活動?

[英]How to pass object through activities by reference?

這是我在這里的第一篇文章,所以請保持溫柔:p這是問題,我面臨的是一個真正的問題,但經過多次研究,我仍未設法找到一個干凈的解決方案。 讓我解釋:

我實際上是在開發用於餐廳管理的android應用。 在活動A中,我可以創建一些具有不同參數(圖片,名稱,價格..)的文章。 我還可以創建一個菜單,在其中指示要包括的文章。 為此,我運行活動B,其中包含要選擇的可用文章(我創建的文章)的動態列表。 拾取其中一些對象后,定制的選定對象將通過包裹發送到活動A。 所選文章列表將在菜單中更新。 但是據我所知,這是使用宗地創建對象的另一個實例的事情。 結果,如果我修改或刪除文章,菜單中包含的文章列表不會更改,顯然我希望菜單中的列表能夠自動更新。

有沒有一種方法可以通過引用簡單地將定制對象傳遞給活動? 什么是使菜單中的文章列表動態化的干凈解決方案?

這是一些代碼:

在活動A的菜單界面中,我單擊+按鈕添加運行活動B的文章(其他內容是菜單中之前已經包含的文章列表,因此一開始是空的)。

//Add article
    FloatingActionButton addArticleButton = (FloatingActionButton)parentActivity.findViewById(R.id.addArticleButton);
    addArticleButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showMenuDetails(menuListView,menuAdapter,currentMenu);
            parentActivity.startActivityForResult(new Intent(parentActivity.getApplicationContext(),ChooseArticleActivity.class).putParcelableArrayListExtra("menuArticleList",currentMenu.getArticles()),PICK_ARTICLES);
        }
    });

在活動B中:我在可用文章(我創建的文章)列表中選擇文章。 取貨后,我按確定按鈕以將所選商品的清單放入結果中作為包裹可包裹的附加物品

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.choose_article_layout);
    initializeLists();

    this.resultIntent = new Intent();
}

private void initializeLists(){
    final ListView articleToChoose = (ListView)findViewById(R.id.articleToChoose);
    final ListView articleChosen = (ListView)findViewById(R.id.articleChosen);

    final ArrayList<Article> articleToChooseList = (ArrayList<Article>)MainActivity.model.getArticleList().getArticleList().clone();
    final ArrayList<Parcelable> articleChosenListParcelable = (ArrayList<Parcelable>)this.getIntent().getParcelableArrayListExtra("menuArticleList");
    final ArticleAdapter articleToChooseAdapter = new ArticleAdapter(getApplicationContext(), articleToChooseList);
    articleToChoose.setAdapter(articleToChooseAdapter);


    ArrayList<Article> articleChosenListTemp = new ArrayList<>();
    ArrayList<Article> articleToRemove = new ArrayList<>();
    for(Parcelable a:articleChosenListParcelable){
        articleChosenListTemp.add((Article)a);
        for(Article article:articleToChooseList){
            if(article.getName().equals(((Article) a).getName())){
                articleToRemove.add(article);
            }
        }
    }
    articleToChooseList.removeAll(articleToRemove);
    articleToChooseAdapter.notifyDataSetChanged();

    final ArrayList<Article> articleChosenList = articleChosenListTemp;

    final ArticleAdapter articleChosenAdapter = new ArticleAdapter(getApplicationContext(),articleChosenList);


    articleChosen.setAdapter(articleChosenAdapter);

    articleChosen.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Article articleClicked = articleChosenAdapter.getItem(position);
            articleChosenList.remove(articleClicked);
            articleToChooseList.add(articleClicked);
            articleChosenAdapter.notifyDataSetChanged();
            articleToChooseAdapter.notifyDataSetChanged();
        }
    });

    articleToChoose.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Article articleClicked = articleToChooseAdapter.getItem(position);
            if(!articleChosenList.contains(articleClicked)){
                articleChosenList.add(articleClicked);
                articleToChooseList.remove(articleClicked);
                articleToChooseAdapter.notifyDataSetChanged();
                articleChosenAdapter.notifyDataSetChanged();
            }
        }
    });



    Button okButton = (Button)findViewById(R.id.okButton);
    okButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            chosenArticleListAttr = articleChosenList;
            resultIntent.putParcelableArrayListExtra("articleList",chosenArticleListAttr);
            setResult(RESULT_OK,resultIntent);
            finish();
        }
    });

    Button cancelButton = (Button)findViewById(R.id.cancelButton);
    cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

在活動A中,在onActivityResult中,我捕獲結果並更新列表,但是此處添加的Articles與模型中的Articles列表不是同一實例

if(requestCode==PICK_ARTICLES && resultCode==RESULT_OK){
        ArticleAdapter articleAdapter = (ArticleAdapter) gestionMenusLayout.getMenuArticleListView().getAdapter();

        ArrayList<Parcelable> chosenArticleList = (ArrayList<Parcelable>)data.getParcelableArrayListExtra("articleList");
        gestionMenusLayout.getCurrentMenu().getArticles().clear();
        for(Parcelable a:chosenArticleList){
            gestionMenusLayout.getCurrentMenu().addArticle((Article)a);
        }
        articleAdapter.notifyDataSetChanged();
    }

僅出於調試目的,建議您使用public static List<Article> articleList並直接從活動A或B調用它

更好但更輕松的解決方案是將列表存儲在數據庫中 ,然后進行每個更新,查詢……您可以使用服務器的數據庫(人們通常從那里獲取文章),或者像Realm這樣的離線數據庫

最后,我用一個非常簡單的解決方案解決了這個問題。

我不斷通過包裹的意圖傳遞我的Article對象。 但是,當它創建一個新實例時,我沒有添加該實例,而是在進行相等性鍵檢查(文章名稱)之后添加了原始實例(來自模型的實例)。 通過這樣做,我在我的文章上保留了引用。

感謝您的幫助!

編輯:這是代碼:

if(requestCode==PICK_ARTICLES && resultCode==RESULT_OK){
        ArticleAdapter articleAdapter = (ArticleAdapter) gestionMenusLayout.getMenuArticleListView().getAdapter();

        ArrayList<Parcelable> chosenArticleList = (ArrayList<Parcelable>)data.getParcelableArrayListExtra("articleList");
        gestionMenusLayout.getCurrentMenu().getArticles().clear();
        ArrayList<Article> modelArticles = MainActivity.model.getArticleList().getArticleList();
        for(Parcelable a:chosenArticleList){
            for(Article modelArticle:modelArticles){
                if(((Article)a).getName().equals(modelArticle.getName())){
                    gestionMenusLayout.getCurrentMenu().addArticle(modelArticle);
                }
            }
        }
        articleAdapter.notifyDataSetChanged();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM