将所选项目从上下文菜单发送到另一个活动

Posted

技术标签:

【中文标题】将所选项目从上下文菜单发送到另一个活动【英文标题】:Send selected items from Context Menu to another Activity 【发布时间】:2018-03-22 20:19:07 【问题描述】:

我为ListView 制作了一个ContextMenu,一切正常。但是,我不知道如何将选定的项目发送到另一个活动?

看了很多教程,没有找到解决办法。

每个项目代表两列,两个字符串(产品、价格)用 JSON 字符串解析。

 listViewProduse.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    listViewProduse.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() 
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) 
            final int checkedCount = listViewProduse.getCheckedItemCount();
            mode.setTitle(checkedCount + " product selected");
        

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) 
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.main_context, menu);

            return true;
        

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) 
            return false;
        

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) 
            switch (item.getItemId())
                case R.id.add_id:
                    SparseBooleanArray selected = adapter.getSelectedIds();

                    String copyText="";
                    for (int i = (selected.size() - 1); i >= 0; i--)
                        if (selected.valueAt(i))
                            VanzatorProduse selectedListItem = adapter.getItem(selected.keyAt(i));                                
                        
                    
                    mode.finish();
                    return true;
                default:
                    return false;
            
        

【问题讨论】:

向另一个 Activity 发送内容的最基本方法是使用 Intent 并将要发送的内容添加为 Extra。请参阅***.com/questions/6707900/…、***.com/questions/18146614/… 或更多... 【参考方案1】:

您可以使VanzatorProduse 实现Parcelable 接口,以便将其放入用于启动新活动的Intent 中。如果你说这个类既有产品又有价格,一种可能的实现方式如下:

public class VanzatorProduse  implements Parcelable 
    private String product;
    private double price;

    public VanzatorProduse(String product, double price) 
        this.product = product;
        this.price = price;
    

    protected VanzatorProduse(Parcel in) 
        product = in.readString();
    

    public static final Creator<VanzatorProduse> CREATOR = new   Creator<VanzatorProduse>() 
        @Override
        public VanzatorProduse createFromParcel(Parcel in) 
            return new VanzatorProduse(in);
        

        @Override
        public VanzatorProduse[] newArray(int size) 
            return new VanzatorProduse[size];
        
    ;

    public String getProduct() 
        return product;
    

    public double getPrice() 
        return price;
    

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel parcel, int i) 
        parcel.writeString(product);
        parcel.writeDouble(price);
    

然后在您的 onActionItemClicked 上,您只需声明 ArrayListVanzatorProduse 并将其添加到 Intent,如下所示:

ArrayList<VanzatorProduse> products = new ArrayList<>();
for (int i = (selected.size() - 1); i >= 0; i--) 
    if (selected.valueAt(i)) 
        VanzatorProduse selectedListItem = adapter.getItem(selected.keyAt(i));      
        products.add(selectedListItem);      
    

Intent intent = new Intent(YourActivity.this, YourSecondActivity.class);
intent.putParcelableArrayListExtra("your_key", products);
startActivity(intent);

最后,在您的第二个活动中,您从 onCreate 方法中检索值,如下所示:

Intent intent = getIntent();
ArrayList<VanzatorProduse> products = intent.getParcelableArrayListExtra("your_key"); // same key used as before

希望对你有帮助。

【讨论】:

如何在第二个活动中的列表视图中显示它? 如上所示,在第二个活动中,您已经可以访问 ArrayList。因此,剩下的唯一事情就是通过扩展 BaseAdapter 类为 RecyclerView 创建一个适配器,或者如果您的要求非常非常简单,您可以使用 ArrayAdapter(并覆盖 VanzatorProduse 上的 toString 以返回每个项目在列表视图)。

以上是关于将所选项目从上下文菜单发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

将字符串从数据库从一个表单发送到另一个表单

带有引导导航栏的 MVC - 将所选项目设置为活动

如何获取所选列表视图项中的id以打开上下文菜单并通过下一个活动来实现目标。

通过更改将所选内容从一个表复制到另一个表

将 SendKey 发送到 Citrix 应用程序

从 ListView 项目中获取数据并发送到另一个活动 (Android)