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:
- Gson gson = new Gson();
- 字符串 json = gson.toJson(列表);
注意:将 json 字符串传递给意图。
接收Activity:
注意:从 intent.
接收 json 字符串
- Gson gson = new Gson();
- 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 的意图
中获取它
我想将价格(没有标题)从 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:
- Gson gson = new Gson();
- 字符串 json = gson.toJson(列表);
注意:将 json 字符串传递给意图。
接收Activity: 注意:从 intent.
接收 json 字符串- Gson gson = new Gson();
- 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 的意图