Как отсортировать адаптер из другого фрагмента - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть RecyclerView на LightsFragment, и я хочу отсортировать его по MainActivity, который содержит этот фрагмент.

Вот что у меня сейчас:

Это функция, котораясортировка моего адаптера:

Collections.sort(lights);
lightsAdapter.updateData(lights);

LightsFragment - обработка адаптера, который должен быть отсортирован.

public class LightsFragment extends Fragment implements LightsPresenter, View.OnClickListener {

    private RecyclerView RVLights;
    private ArrayList<Light> lights = new ArrayList<>();
    private Light light;
    private LightsAdapter lightsAdapter;
    private LightsView presenter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_lights, container, false);
        presenter = new LightsView(lights, light, this);
        RVLights = view.findViewById(R.id.RVLights);
        presenter.loadData();
        return view;
    }

    @Override
    public void setAdapter() {
        lightsAdapter = new LightsAdapter(getActivity(), lights);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
        RVLights.setLayoutManager(layoutManager);
        RVLights.setAdapter(lightsAdapter);
    }
}

MainActivity - обработка 3 кнопок, одна из кнопок должна сортировать адаптер.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Greetings mGreetings = new Greetings();
    private TextView mTVgreetings;
    private Button BTNmLights, BTNmGarage, BTNmSortBy;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        mTVgreetings = findViewById(R.id.TVgreetings);
        initFunctions();
    }

    public void showLightsFragment() {
        getSupportFragmentManager().beginTransaction().add(R.id.main_fragment_container, new LightsFragment())
                .commit();
    }

    public void initFunctions() {
        showLightsFragment();
        showGreetings();
    }

    public void showGreetings() {
        mTVgreetings.setText(mGreetings.getGreetings());
    }

    public void initView() {
        BTNmLights = findViewById(R.id.BTNlights);
        BTNmGarage = findViewById(R.id.BTNgarage);
        BTNmSortBy = findViewById(R.id.BTNsort);
        BTNmLights.setOnClickListener(this);
        BTNmGarage.setOnClickListener(this);
        BTNmSortBy.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.BTNlights:
                //TODO open lights fragment...
                break;
            case R.id.BTNgarage:
                //TODO open garage fragment...
                break;
            case R.id.BTNsort:
                //TODO make drop down with sort light and garage.
                break;
        }
    }
}

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

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Сохраните экземпляр Fragment в Activity и получите к нему доступ в любое время.

 private LightsFragment lightsFragment= new LightsFragment();

 public void showLightsFragment() { 
   getSupportFragmentManager()
     .beginTransaction().add(R.id.main_fragment_container, this.lightFragment)
                    .commit();
 }


@Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.BTNlights:
                //TODO open lights fragment...
                break;
            case R.id.BTNgarage:
                //TODO open garage fragment...
                break;
            case R.id.BTNsort:
                this.lightFragment.sortLights()
                //TODO make drop down with sort light and garage.
                break;
        }
    }

, и в вашем LightFragment у вас должен быть метод для поиска RecylerView и его адаптера для обновления списка и notifyDataSetChanged

0 голосов
/ 07 ноября 2019

Вы можете сделать это, используя interface.

. Создайте интерфейс, подобный

public interface UpdateFrag {
     void sortAdapter(int sortType);
}

. В своей деятельности выполните следующие действия:

 UpdateFrag updatFrag ;// add this line

  public void showLightsFragment() {
        Fragment lightsFragment = new LightsFragment();
        updatFrag = lightsFragment; // here you initialize updatFrag

        fragment.getSupportFragmentManager().beginTransaction().add(R.id.main_fragment_container, lightsFragment)
                .commit();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.BTNlights:

                break;
            case R.id.BTNgarage:
                //TODO open garage fragment...
                break;
            case R.id.BTNsort:
                // here you should call sortAdapter method.
                updatFrag.sortAdapter(1) // suppose 1 for light and 2 for garage
                break;
        }
    }

Теперь в вашем LightsFragment реализовать интерфейс.

public class LightsFragment extends Fragment implements LightsPresenter, View.OnClickListener, UpdateFrag {
    // ....

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // ....
    }

    @Override
    public void setAdapter() {
       // ....
    }

     @Override
     public void sortAdapter(int sortType) {
        if (sortType == 1){
          // here you can sort your adapter according to light
        }else{
          // here you can sort your adapter according to garage
        }

     }
}


0 голосов
/ 07 ноября 2019

Сначала создайте метод получения для вашего адаптера LightsAd во фрагменте. После этого получите фрагмент в mainActivity с помощью

        Fragment yourFragment=getSupportFragmentManager().findFragmentById(R.id.main_fragment_container);

. Позже проверьте, является ли фрагмент вашим фрагментом:

if(yourFragment instanceOf LightsFragment)
{
   yourFragment.getAdapter();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...