Android: как передать все данные из адаптера RecyclerView в NewActivity, нажав кнопку за пределами RecyclerView? - PullRequest
0 голосов
/ 18 мая 2019

Я хочу передать цены (без заголовков) из RecyclerView в NewActivity, а затем отобразить их отсортированными, нажав на кнопку.У меня проблема с передачей всех цен в NewActivity, нажав одну кнопку (кнопка находится под RecyclerView)


 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 ]

2 голосов
/ 18 мая 2019

Для получения результата для адаптера

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;}
0 голосов
/ 18 мая 2019

Поскольку вы используете kotlin, и объект затрат создается перед настройкой адаптера в утилита-просмотр, вы можете просто позвонить

costs.sortedBy { it.price }.map { it.price }, который даст вам список Int, который вы можете передать в свое намерение с помощью writeIntArray. (возможно, вам нужно будет разыграть его на .toArray()), а затем вы можете легко получить его из намерения вашей деятельности

0 голосов
/ 18 мая 2019
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
0 голосов
/ 18 мая 2019

Добавьте метод в свой адаптер, getList (), который возвращает список только цен, я не уверен насчет сортировки в kotlin, так что вам нужно будет найти это, но тогда вы сможете вызывать adapter.getList () с помощью кнопки в том же действии, чтобы получить все элементы, затем вы можете передать их между действиями несколькими способами, вы можете использовать пакет и передать его по назначению, если список очень маленький, вы можете реализовать parcleable на объект стоимости, если в нем много полей, вы можете передать его в модель представления и получить доступ к нему из другого класса, вы можете создать интерфейс и передать его между чем угодно таким образом, или вы можете преобразовать его в строку JSON, используя Библиотека gson, есть много способов, в зависимости от вашего варианта использования в будущем

0 голосов
/ 18 мая 2019

Вы можете использовать библиотеку gson , чтобы преобразовать весь список в строку json, передав его в намерение из текущей активности, а затем восстановить его в списке при получении активности.

Текущая активность:

  1. Gson gson = new Gson ();
  2. String json = gson.toJson (список);

Примечание. Передать строку json в намерение.

Получение действия: Примечание. Получите строку json из намерения.

  1. Gson gson = new Gson ();
  2. Type type = new TypeToken> (){} .getType ();Список список = gson.fromJson (json, тип);
...