Добавление данных в RecyclerView, который находится во фрагменте во время выполнения, когда данные создаются в отдельном фрагменте - PullRequest
0 голосов
/ 09 марта 2019

Я создал приложение с 3 различными фрагментами.У одного фрагмента есть кнопка, которая добавляет данные к представлению реселлера в отдельном фрагменте, однако она не работает должным образом.Я попытался использовать FragmentManager, который вызывает исключение нулевого указателя, я попробовал notifyDataChanged как в моем адаптере, так и в классах данных, которые не обновляют данные во фрагменте, и я попытался сбросить видоискатель, который также вызывает исключение нулевого указателя.У меня заканчиваются идеи.

Мой адаптер здесь:

package com.example.dogwalk;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class DogInfoAdapter extends RecyclerView.Adapter<DogInfoAdapter.ViewHolder>
{
    private static final String TAG = "DogInfoAdapter";

    private ArrayList<String> mDogType;
    private ArrayList<String> mImages;
    private ArrayList<String> mDogInfo;
    private Context mContext;

    public DogInfoAdapter(ArrayList<String> mDogType, ArrayList<String> mImages,
                          ArrayList<String> mDogInfo, Context mContext)
    {
        this.mDogType = mDogType;
        this.mImages = mImages;
        this.mDogInfo = mDogInfo;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem_doginfo, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

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

        Glide.with(mContext)
                .asBitmap()
                .load(mImages.get(position))
                .into(holder.imageView);

        holder.dogType.setText(mDogType.get(position));

        holder.dogInfo.setText(mDogInfo.get(position));
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder
    {

        ImageView imageView;
        TextView dogType;
        TextView dogInfo;
        RelativeLayout parentLayout;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.image);
            dogType = itemView.findViewById(R.id.dogType);
            dogInfo = itemView.findViewById(R.id.dogInfo);
            parentLayout = itemView.findViewById(R.id.parent_layout);

        }
    }

}

И мой класс данных

Обратите внимание, что мой метод «AddData» внизу предназначен только для тестирования различных решений, план состоит в том, чтобы динамически добавлять данные в отдельный фрагмент.

package com.example.dogwalk;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;


public class DogInfo extends Fragment 
{
    private static final String TAG = "DogInfo";
    private ArrayList<String> mNames = new ArrayList<>();
    private  ArrayList<String> mImageUrls = new ArrayList<>();
    private ArrayList<String> mDogInfo = new ArrayList<>();
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private View mView;

    public static DogInfo newInstance() {
        DogInfo fragment = new DogInfo();
        return fragment;
    }


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        initImageBitmaps();
        View mView = inflater.inflate(R.layout.doginfo_layout, container, false);
        mRecyclerView = mView.findViewById(R.id.recyclerview);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
        mAdapter = new DogInfoAdapter(mNames, mImageUrls, mDogInfo, mView.getContext());
        mLayoutManager = new LinearLayoutManager(getContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        return mView;
    }

    private void initImageBitmaps()
    {
        Log.d(TAG, "initImageBitmaps: Preparing Bitmaps.");

        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/d/de/Smooth_Dachshund_red_and_tan_portrait.jpg");
        mNames.add("Dachshund");
        mDogInfo.add("You should be giving your dog a 45-60 minute walk a day (maybe split in two lots). Once adult, your Dachshund will take any amount of exercise you care to give. ");


        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/2/26/YellowLabradorLooking_new.jpg");
        mNames.add("Labrador");
        mDogInfo.add("A normal, healthy adult Labrador Retriever will need 1 hour of exercise every day. The more relaxed Labs just 45 minutes per day, the more energetic 1.5 hours+.");

        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/2/2c/West_Highland_White_Terrier_Krakow.jpg");
        mNames.add("West Highland Terrier");
        mDogInfo.add("The length of the walk is only limited by your time and energy as a West Highland Terrier can go all day long. Ideally, the minimum should be 30 to 60 minutes daily. This can be just once a day, but ideally split over two walks a day");

        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/f/fa/Buster_the_red_grizzle_border_terrier_%282006%29.jpg");
        mNames.add("Border Terrier");
        mDogInfo.add("The length of the walk is only limited by your time and energy as a Border Terrier can go all day long. Ideally, the minimum should be 45 to 60 minutes daily. This can be just once a day, but two walks a day would be better.");


        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/6/6d/Alaskan_malamut_465.jpg");
        mNames.add("Alaskan Malamut");
        mDogInfo.add("A couple of daily walks (one is at least 45 minutes) or a shorter walk and a vigorous play session (30 minutes or more). Malamutes can be stubborn, but they are also eager to please. Training early on will make play and exercise and life in general easier.");


        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/6/6c/Border_Collie_rojo_mirlo_tricolor_%28Birdy_de_los_Baganicos%29.jpg");
        mNames.add("Border Collie");
        mDogInfo.add("Although as much as they possibly can should be the right answer, but at least 20-30 minutes of running everyday is ideal. However, undoubtedly your Border Collie would definitely prefer a lot more.");


//        mImageUrls.add("https://en.wikipedia.org/wiki/English_Springer_Spaniel#/media/File:%C3%89pagneul_Anglais.jpg");
//        mNames.add("Springer Spaniel");

        mImageUrls.add("https://upload.wikimedia.org/wikipedia/commons/d/de/Beagle_Upsy.jpg");
        mNames.add("Beagle");
        mDogInfo.add("You should walk your Beagle for a minimum of 20 minutes, ideally 30, and some Beagles may need up to 40 minutes.");

//
//        mImageUrls.add("https://en.wikipedia.org/wiki/Shiba_Inu#/media/File:Shiba_inu_taiki.jpg");
//        mNames.add("Shiba Inu");
//
//        mImageUrls.add("https://en.wikipedia.org/wiki/Samoyed_dog#/media/File:Samojed00.jpg");
//        mNames.add("Samoyed");
    }

    public void AddData()
    {

        mNames.add("Test");
        mImageUrls.add("Test");
        mDogInfo.add("Test");
        FragmentManager manager = getActivity().getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        Fragment newFragment = this;
        this.onDestroy();
        ft.remove(this);
        ft.replace(getView().getId(),newFragment);
        //container is the ViewGroup of current fragment
        ft.addToBackStack(null);
        ft.commit();
    }



}

1 Ответ

0 голосов
/ 09 марта 2019

У вас есть действие, которое содержит два фрагмента:

  • FragmentB, в котором хранится переработчик. View
  • FragmentA, который динамически добавляет элементы в программу просмотра FragmentB

Итак, требуется, чтобы FragmentA имел ссылку на FragmentB для его изменения. (Пожалуйста, поправьте меня, если я ошибаюсь)

Существует несколько подходов для достижения этой цели:

Один из подходов состоит в том, чтобы фрагменты могли общаться друг с другом посредством своей деятельности следующим образом:

  1. Деятельность хочет прослушивать FragmentA всякий раз, когда она хочет изменить элементы в recyclerView; это можно сделать, создав интерфейс @ FragmentA, который реализуется действием
  2. Когда действие запускается FragmentA, он должен отправить запрос Открытый метод FragmentB для изменения recyclerView

Фрагмент кода вы можете найти в моем ответе здесь ; разница в том, что FragmentA изменяет содержимое TextView вместо RecyclerView ... если вам нужен другой фрагмент для RecyclerView, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...