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

时间:2019-05-17 21:19:33

标签: android kotlin android-recyclerview android-adapter recycler-adapter

我想将价格(不带标题)从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
}

5 个答案:

答案 0 :(得分:2)

为了获取适配器的结果

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

答案 1 :(得分:0)

在适配器中添加一个方法,getList()返回价格列表,我不确定要在kotlin中进行排序,因此您必须找到它,然后才能调用adapter.getList ()从同一个活动中的按钮获取所有项目,然后您可以通过几种方式在活动之间传递它们,可以使用bundle并在意图中传递它,如果列表很小,则可以在cost对象,如果它具有很多字段,则可以将其传递给视图模型并从另一个类访问它,可以创建接口并以任何方式在任何对象之间传递它,也可以使用来将其转换为JSON字符串。 gson库,有很多方法取决于您的用例

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

costs.sortedBy { it.price }.map { it.price }会给您带来一点点Int的困扰,您可以使用writeIntArray来传达您的意图。 (您可能需要通过.toArray()进行投射),然后可以轻松地从您的活动意图中获取它

答案 4 :(得分:-2)

您可以使用gson库将整个列表转换为json字符串,方法是将其从当前活动传递到意图,然后在接收到的活动中恢复到列表。

当前活动:

  1. Gson gson =新的Gson();
  2. 字符串json = gson.toJson(list);

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

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

  1. Gson gson =新的Gson();
  2. 类型类型=新的TypeToken>(){} .getType(); 列表列表= gson.fromJson(json,type);