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

Android: How to pass all the data from RecyclerView adapter to NewActivity by clicking button outside of RecyclerView?

我想将价格(没有标题)从 RecyclerView 传递到 NewActivity,然后通过单击按钮按顺序显示它们。我在通过单击一个按钮(按钮位于 RecyclerView 下)将所有价格传递给 NewActivity 时遇到问题


 class MyAdapter(val context: Context, val costs: List<Cost>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val cos = costs[position]
        holder.title.text = cos.price.toString()
        holder.price.text = cos.price.toString()

    }

    override fun onCreateViewHolder(parent: ViewGroup, convertVie: Int): MyViewHolder {
        val myView = LayoutInflater.from(context).inflate(R.layout.one_item,parent,false)
        return MyViewHolder(myView)
    }
    override fun getItemCount(): Int {
        return costs.size
    }
    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var price = itemView.findViewById(R.id.title) as TextView
        var price = itemView.findViewById(R.id.price) as TextView
}
class MainActivity : AppCompatActivity() {



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)




        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)


        var costs = ArrayList<Cost>()
        costs.add(Cost(3.00))
        costs.add(Cost(5.00))
        costs.add(Cost(1.00))
        costs.add(Cost(7.00))

        val adapter = MyAdapter(this, costs)
        recyclerView.adapter = adapter
}

您可以使用 gson 库将整个列表转换为 json 字符串,方法是将其从当前 activity 传递给意图,然后在收到 [=33] 时将其恢复回列表=].

当前 Activity:

  1. Gson gson = new Gson();
  2. 字符串 json = gson.toJson(列表);

注意:将 json 字符串传递给意图。

接收Activity: 注意:从 intent.

接收 json 字符串
  1. Gson gson = new Gson();
  2. Type type = new TypeToken>() {}.getType(); 列表列表 = gson.fromJson(json, 类型);

在你的适配器中添加一个方法,getList() returns 只是价格的列表,我不确定在 kotlin 中排序所以你必须找到它,但你会能够从同一个 activity 中的按钮调用 adapter.getList() 以获取所有项目,然后您可以通过几种方式在活动之间传递它们,您可以使用 bundle 并在意图中传递它如果列表很小,你可以在成本对象上实现parcleable 如果它有很多字段,你可以将它传递给视图模型并从另一个视图模型访问它class,你可以创建一个接口并传递它在任何方式之间,或者您可以使用 gson 库将其转换为 JSON 字符串,根据您的用例,有多种方法

为了获取适配器的结果

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;}
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

由于您使用的是 kotlin,并且您的成本对象是在将适配器设置为 recyclerview 之前实例化的,因此您只需调用

costs.sortedBy { it.price }.map { it.price } 这会给你一个 Int 的 lsit,你可以用 writeIntArray 传递到你的意图中。 (您可能需要按 .toArray() 进行转换)然后您可以轻松地从 activity 的意图

中获取它