Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何通过单击RecyclerView外部的按钮将所有数据从RecyclerView适配器传递到NewActivity?_Android_Kotlin_Android Adapter_Android Recyclerview - Fatal编程技术网

Android:如何通过单击RecyclerView外部的按钮将所有数据从RecyclerView适配器传递到NewActivity?

Android:如何通过单击RecyclerView外部的按钮将所有数据从RecyclerView适配器传递到NewActivity?,android,kotlin,android-adapter,android-recyclerview,Android,Kotlin,Android Adapter,Android Recyclerview,我想将不带标题的价格从RecyclerView传递到NewActivity,然后单击按钮按顺序显示它们。我有一个问题,通过点击RecyclerView下的一个按钮将所有价格传递给NewActivity 类MyAdapterval上下文:context,val成本:List:RecyclerView.Adapter{ 覆盖BindViewHolderHolder:MyViewHolder,位置:Int{ val cos=成本[职位] holder.title.text=cos.price.toSt

我想将不带标题的价格从RecyclerView传递到NewActivity,然后单击按钮按顺序显示它们。我有一个问题,通过点击RecyclerView下的一个按钮将所有价格传递给NewActivity

类MyAdapterval上下文:context,val成本:List:RecyclerView.Adapter{ 覆盖BindViewHolderHolder:MyViewHolder,位置:Int{ val cos=成本[职位] holder.title.text=cos.price.toString holder.price.text=cos.price.toString } 重写CreateViewHolderParent:ViewGroup、convertVie:Int:MyViewHolder上的乐趣{ val myView=LayoutInflater.fromcontext.inflateR.layout.one_项,父项,false 返回MyViewHoldermyView } 覆盖getItemCount:Int{ 返回成本。大小 } 类MyViewHolderitemView:View:RecyclerView.ViewHolderitemView{ var price=itemView.findviewbydr.id.title作为文本视图 var price=itemView.findviewbydr.id.price as TextView } 类MainActivity:AppCompativeActivity{ 覆盖乐趣onCreatesavedInstanceState:捆绑{ super.onCreatesavedInstanceState setContentViewR.layout.activity\u main val recyclerView=findviewbydr.id.recyclerView recyclerView.layoutManager=LinearLayoutManager此,LinearLayout.VERTICAL,false var成本=ArrayList 成本加成本3.00 成本加成本5.00 成本加成本1.00 成本加成本7.00 val适配器=MyAdapter此,成本 recyclerView.adapter=适配器 } 您可以使用库将整个列表转换为json字符串,方法是将其从当前活动传递给intent,然后在接收活动时将其还原回列表

当前活动:

Gson Gson=新Gson; 字符串json=gson.toJsonlist; 注意:将json字符串传递给intent

接收活动: 注意:从intent接收json字符串

Gson Gson=新Gson; Type Type=newtypetoken>{}.getType; List List=gson.fromJsonjson,类型;
在适配器getList中添加一个方法,该方法返回的只是价格列表,我不确定kotlin中的排序,因此您必须找到它,但是您可以从同一活动中的按钮调用adapter.getList来获取所有项目,然后您可以通过几种方式在活动之间传递它们,您可以使用捆绑包并在inte中传递它nt如果列表非常小,您可以在cost对象上实现parcleable,如果它有很多字段,您可以将其传递到视图模型并从另一个类访问它,您可以创建一个接口并以这种方式在任何对象之间传递它,或者您可以使用gson库将其转换为JSON字符串,根据您的使用情况有多种方法se前进

以获取适配器的结果

class MyAdapter extends RecyclerView.Adapter{
List<Cost> costs;
.. some other code

// Return total cost of items inside list
public float getTotal(){
float total = 0f;

for(Cost cost : costs)
     total+=cost.price;
return total;
}
通过单击Recyclerview外部的按钮对列表进行排序


button.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View v){

       MyAdapter adapter = (MyAdapter)recyclerview.getAdapter();// fetching adapter
       Collections.sort(adapter.getItems(),new Comparator<Cost>() {

        @Override
        public int compare(Cost c1, Cost c2) {
            return c1.price - c2.price;// sort item in list
        }
    });
adapter.notifyDataSetChanged();// update list

  }
});
adapter.getItems

public List<Cost> getItems(){return costs;}

由于您使用的是kotlin,并且您的costs对象在设置适配器到recyclerview之前被实例化,所以您只需调用


costs.sortedBy{it.price}.map{it.price}这将为您提供一个整型lsit,您可以使用WriteInArray将其传递到您的意图中。您可能需要将其转换为.toArray,然后您可以轻松地从活动的意图中获取它

这似乎是一个错误的选择。如果列表很大怎么办?我认为这将是最简单和最短的方法,而无需担心将数据作为字符串传递给大列表你应该担心大列表,你不能建立一个依赖于列表大小的系统。我建议你从基础上建立一个具有适当架构的系统。也许最简单的方法是mvvm+存储库模式+android arch组件,这在许多其他相关资源上都有很好的解释。真的,你会让你的生活更轻松。是的,哟你是对的,但这取决于积极方面和消极方面,然后再决定采用单例模式或这种模式。在需要或总是需要时分配内存也是一个部分。在存储库中,你可以控制对象的生命周期。我的最后一项工作是播放器,有许多来自不同资源的曲目本地光盘、服务,如oundcloud/spotify/dropbox/youtube,我在那里使用这种方法,它真的很有帮助。在适配器类getList或getdata中创建一个有趣的类,它返回一个成本对象列表,并将其发送给newActivity,然后从intent.extra函数接收它,并以这种方式对其应用排序listName.sort。就是这样。
You should provide some repository for your data. Singleton instance that will store your data, and you would retrieve from it in any activity you want.
Basic schema for example:
class Repo{
    private List<String> mData;
}

View (Ani fragment or activity). You just need call Repo.getInstance().getList();
And it won`t be depends on lifecyle of any android component.

P.S. Use Android Architecture Components https://developer.android.com/topic/libraries/architecture