Как я могу передать эти значения списка массивов между двумя действиями? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь передать пару значений из действия «Пример» в другое действие «MemberExample.class»

Я знаю, что это кажется простым вопросом, на который уже много раз отвечали , но, как показано в приведенном ниже коде, и я попытаюсь объяснить, это не так просто, как кажется.

Ниже приведен первый код активности, который я пытаюсь передать, но он получает «mImagesUrl», «mName», «mParties» из адаптера представления переработчика. Я не уверен, где в каком-либо классе я должен поместить методы "putIntent" и "getExtras". Положить ли их в адаптер RecyclerView или в класс активности?

Example.class

public class Example extends AppCompatActivity {

    private ArrayList<String> mNames = new ArrayList<>();
    private ArrayList<String> mParties = new ArrayList<>();
    private ArrayList<String> mImageUrls = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.example);


        getImages();
    }

    private void getImages() {


        mImageUrls.add("https://data.oireachtas.ie/ie/oireachtas/member/id/Kathleen-Funchion.D.2016-10-03/image/large");
        mNames.add("Kathleen Funchion");
        mParties.add("Sinn Féin");

        mImageUrls.add("https://data.oireachtas.ie/ie/oireachtas/member/id/John-Paul-Phelan.S.2002-09-12/image/large");
        mNames.add("John Paul Phelan");
        mParties.add("Fine Gael");



        initExampleRV();
    }

    private void initExampleRV() {

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        RecyclerView recyclerView = findViewById(R.id.rv_Example);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(this, MemberExample.class);

//?????????????????????



            }

        });
        ClareMembersRecyclerView adapter = new ClareMembersRecyclerView(this, mNames, mParties, mImageUrls);
        recyclerView.setAdapter(adapter);
    }
}

Adapter.class

public class RecyclerView extends RecyclerView.Adapter<ClareMembersRecyclerView.ViewHolder>{


    private  static final  String TAG = "ClareMembersRV";

    //vars
    private ArrayList<String> mNames = new ArrayList<>();
    private ArrayList<String> mParties = new ArrayList<>();
    private ArrayList<String> mImageUrls = new ArrayList<>();
    private Context mContext;

    public RecyclerView(Context context, ArrayList<String> names, ArrayList<String> parties, ArrayList<String> imageUrls){

        mNames = names;
        mParties = parties;
        mImageUrls = imageUrls;
        mContext = context;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.d(TAG, "onCreateViewHolder: called.");

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_members_clare, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder: called.");

    Glide.with(mContext)
            .asBitmap()
            .load(mImageUrls.get(position))
            .into(holder.image);

    holder.name.setText(mNames.get(position));

    holder.party.setText(mParties.get(position));

    holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: clicked on an image" + mNames.get(position));
            Toast.makeText(mContext, "Profile: " + mNames.get(position), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(mContext, MembersMapDetailed.class);
            intent.putExtra(mNames.get(position),mParties,mImageUrls);
                    }
    });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        CircleImageView image;
        TextView name;
        TextView party;

        public ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.imgClareCircle);
            name = itemView.findViewById(R.id.tvClareName);
            party = itemView.findViewById(R.id.tvClareParty);
        }
    }

1 Ответ

0 голосов
/ 08 марта 2020

Если вы хотите начать новое действие и передать им эти значения везде, где пользователь нажимает на представление рециркуляции, вы можете сделать это следующим образом:

recyclerView.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
     Intent intent = new Intent(this, MemberExample.class);
     intent.putExtra("EXTRA_KEY_NAMES", mNames);
     intent.putExtra("EXTRA_KEY_PARTIES", mParties);
     intent.putExtra("EXTRA_KEY_IMAGES", mImageUrls);
     startActivity(intent);
  }

Если вы хотите начать новое действие и передать значения на основе элемента, который пользователь щелкнул в предыдущем упражнении, вы можете использовать onItemClickListener. Я думаю, что это более полезно и это то, что вы хотите сделать, но, возможно, я ошибаюсь.:

recyclerView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
     Intent intent = new Intent(this, MemberExample.class);
     intent.putExtra("EXTRA_KEY_NAME", mNames.get(position);
     intent.putExtra("EXTRA_KEY_PARTY", mParties.get(position));
     intent.putExtra("EXTRA_KEY_IMAGE", mImageUrls.get(position));
     startActivity(intent);
  }

Чтобы получить эти значения из намерения в вашей новой деятельности, вам нужно написать эту часть кода в вашем MemberExample.class:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        Intent intent = getIntent();
        ArrayList<String> mNames = intent.getStringArrayListExtra("EXTRA_KEY_NAMES");
        ArrayList<String> mParties = intent.getStringArrayListExtra("EXTRA_KEY_PARTIES");
        ArrayList<String> mImageUrls = intent.getStringArrayListExtra("EXTRA_KEY_IMAGES");
        // Or in second proposed by me solution (with passing single item):
        //String mName = intent.getStringExtra("EXTRA_KEY_NAME");
        //String mParty = intent.getStringExtra("EXTRA_KEY_PARTY");
        //String mImage = intent.getStringExtra("EXTRA_KEY_IMAGE");
}
...