首页 > 解决方案 > 如何将 Room 实体的 ArrayList 传递给另一个活动?(安卓室)

问题描述

我正在制作一个名为 MotoDescriptive 的应用程序,您可以在其中搜索有关特定摩托车的信息。但问题是我无法将一组房间实体(MotoEntity)发送到另一个活动,以便从我点击的项目中获取数据。

这是我用来展示摩托车回收者视图的片段:

package com.example.motodescriptive;

import android.content.Intent;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SearchView;

import java.util.ArrayList;

public class RecFragment extends Fragment implements MotorAdapter.OnNoteClicked {

    private ArrayList<MotoEntity>motorcycle;
    private RecyclerView recyclerView;
    private MotorAdapter adapter;
    private SearchView searchView;
    MotoEntity motoEntity, motoEntity2, motoEntity3, motoEntity4, motoEntity5;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_rec, container, false);
        recyclerView = v.findViewById(R.id.recyclerView);
        searchView = v.findViewById(R.id.search_bar);
        motoEntity = new MotoEntity();
        motoEntity.setMoto_name("Aprilia dorsoduro 750");
        motoEntity.setMoto_desc("test");
        motoEntity.setMoto_img("https://upload.wikimedia.org/wikipedia/commons/c/c8/Aprilia_SMV750_Dorsoduro.jpg");

        motoEntity2 = new MotoEntity();
        motoEntity2.setMoto_name("Yamaha YZF R125");
        motoEntity2.setMoto_desc("this is awesome");
        motoEntity2.setMoto_img("https://motosvet.com/tabla/uploads/monthly_2019_06/large.yamaha_yzf_r125.jpg.1c366691f4ec323971ed7ffabf931e1e.jpg");

        motoEntity3 = new MotoEntity();
        motoEntity3.setMoto_name("KTM duke 125");
        motoEntity3.setMoto_desc("this is awesoasssme");
        motoEntity3.setMoto_img("https://bd.gaadicdn.com/processedimages/ktm/125-duke/source/125-duke5ecdf3eee8762.jpg?tr=w-360");

        motoEntity4 = new MotoEntity();
        motoEntity4.setMoto_name("suzuki");
        motoEntity4.setMoto_desc("test teste");
        motoEntity4.setMoto_img("https://prod-suzuki.azureedge.net/media/13851/jimnytransparent.png?anchor=center&mode=crop&rnd=132255608430000000");


        motoEntity5 = new MotoEntity();
        motoEntity5.setMoto_name("tomos ");
        motoEntity5.setMoto_desc("tasasss is awesoasssme");
        motoEntity5.setMoto_img("https://www.kolo.si/wp-content/uploads/2016/03/MOPED-TOMOS-FLEXER.ZELEN_.jpg");




        MainActivity.appDatabase.motoDao().insert(motoEntity);
        MainActivity.appDatabase.motoDao().insert(motoEntity2);
        MainActivity.appDatabase.motoDao().insert(motoEntity3);
        MainActivity.appDatabase.motoDao().insert(motoEntity4);
        MainActivity.appDatabase.motoDao().insert(motoEntity5);

        motorcycle = new ArrayList<>();
        motorcycle.add(motoEntity);
        motorcycle.add(motoEntity2);
        motorcycle.add(motoEntity3);
        motorcycle.add(motoEntity4);
        motorcycle.add(motoEntity5);

        adapter = new MotorAdapter(motorcycle, this, getContext());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                adapter.getFilter().filter(s);
                return false;
            }
        });
        return v;
    }

    @Override
    public void OnNote(Bundle bundle) {
        Intent intent = new Intent(getContext(), Fragments.class);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

这是我的那个 recyclerview 的适配器

package com.example.motodescriptive;

import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.List;

public class MotorAdapter extends RecyclerView.Adapter<MotorAdapter.ViewHolder> implements Filterable {

    private ArrayList<MotoEntity> arr;
    private ArrayList<MotoEntity> arrFull;
    private OnNoteClicked onNoteClicked;
    private Context context;

    public MotorAdapter(ArrayList<MotoEntity> motorcycles, OnNoteClicked onNoteClicked, Context context) {
        this.arr = motorcycles;
        this.arrFull = new ArrayList<>(arr);
        this.onNoteClicked = onNoteClicked;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.motocycles, parent, false);
        return new ViewHolder(v, onNoteClicked);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.text1.setText(arr.get(position).getMoto_name());
        holder.text2.setText(arr.get(position).getMoto_desc());
        Glide.with(context).load(arr.get(position).getMoto_img()).into(holder.image1);

    }

    @Override
    public int getItemCount() {
        return arr.size();
    }

    @Override
    public Filter getFilter() {
        return ExampleFilter;
    }

    Filter ExampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            ArrayList<MotoEntity> filteredList = new ArrayList<>();

            if(charSequence == null || charSequence.length() == 0) {
                filteredList.addAll(arrFull);
            } else {
                String filteredPattern = charSequence.toString().toLowerCase().trim();
                for(MotoEntity item: arrFull) {
                    if(item.getMoto_name().toLowerCase().startsWith(filteredPattern)) {
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            arr.clear();
            arr.addAll((List) filterResults.values);
            notifyDataSetChanged();
        }
    };


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView text1;
        private TextView text2;
        private ImageView image1;
        private CardView cardView;
        OnNoteClicked onNoteClicked;
        public ViewHolder(@NonNull View itemView, OnNoteClicked onNoteClicked) {
            super(itemView);
            text1 = itemView.findViewById(R.id.text1);
            text2 = itemView.findViewById(R.id.text2);
            image1 = itemView.findViewById(R.id.image1);
            cardView = itemView.findViewById(R.id.cardView);
            this.onNoteClicked = onNoteClicked;

            cardView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putInt("id", getAdapterPosition());
            onNoteClicked.OnNote(bundle);
        }
    }

    public interface OnNoteClicked {
        void OnNote(Bundle bundle);
    }
}

我的问题在这里:

@Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putInt("id", getAdapterPosition());
            onNoteClicked.OnNote(bundle);
        }
    }

如何将 MotoEntities 的数组列表发送到另一个活动?

标签: javaandroidandroid-recyclerviewandroid-room

解决方案


首先, make MotoEntityimplement Serializable,然后你可以传递列表。

Bundle bundle = new Bundle();
bundle.putSerializable();

推荐阅读