java如何更新片段中的recyclerView
我使用选项卡式浏览,它包含两个选项卡,每个选项卡都显示一个recyclerView,但在其中一个选项卡中,我将其作为收藏夹,在另一个选项卡中,我将其从收藏夹中删除。当用户从一个选项卡转到另一个选项卡时,如何更新列表
餐厅碎片。爪哇
package com.curso安卓.testegit.Fragment;
import 安卓.content.Intent;
import 安卓.os.Bundle;
import 安卓.view.LayoutInflater;
import 安卓.view.Menu;
import 安卓.view.MenuInflater;
import 安卓.view.MenuItem;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.LinearLayout;
import 安卓.widget.SearchView;
import 安卓.widget.Toast;
import 安卓x.annotation.NonNull;
import 安卓x.annotation.Nullable;
import 安卓x.appcompat.app.AlertDialog;
import 安卓x.fragment.app.Fragment;
import 安卓x.recyclerview.widget.DefaultItemAnimator;
import 安卓x.recyclerview.widget.DividerItemDecoration;
import 安卓x.recyclerview.widget.LinearLayoutManager;
import 安卓x.recyclerview.widget.RecyclerView;
import com.curso安卓.testegit.Adapter.RestauranteAdapter;
import com.curso安卓.testegit.Helper.RestauranteDAO;
import com.curso安卓.testegit.Model.Restaurante;
import com.curso安卓.testegit.R;
import com.curso安卓.testegit.activity.AddRestauranteActivity;
import com.curso安卓.testegit.databinding.FragmentRestauranteBinding;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import static 安卓.app.Activity.RESULT_OK;
public class RestauranteFragment extends Fragment implements RestauranteAdapter.OnRestauranteAdapterClick {
private final static int REQUEST_CODE_ACTIVITY = 1;
private final List<Restaurante> listaRestaurantes = new ArrayList<>();
private FragmentRestauranteBinding bind;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
bind = FragmentRestauranteBinding.inflate(inflater, container, false);
setupRecyclerView();
initViewListeners();
return bind.getRoot();
}
@Override
public void setTargetFragment(@Nullable Fragment fragment, int requestCode) {
super.setTargetFragment(fragment, requestCode);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.menu_principal, menu);
MenuItem searchItem = menu.findItem(R.id.itemPesquisar);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Pesquisar restaurantes");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
RestauranteAdapter adapter = (RestauranteAdapter) bind.recyclerView.getAdapter();
if (adapter != null) {
adapter.getFilter().filter(s);
}
return true;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
private void editarItemRecycler(int position) {
//recuperar restaurante para edicao
Restaurante restauranteSelecionado = listaRestaurantes.get(position);
Intent intent = new Intent(getContext(), AddRestauranteActivity.class);
intent.putExtra("Restaurante Selecionado", restauranteSelecionado);
startActivityForResult(intent, REQUEST_CODE_ACTIVITY);
}
private boolean deleteItemToRecycler(int position) {
String exluirRestauranteMessage = getResources().getString(R.string.deseja_excluir_restaurante);
Restaurante restauranteSelecionado = listaRestaurantes.get(position);
AlertDialog.Builder dialog = null;
if (getContext() != null) {
dialog = new AlertDialog.Builder(getContext());
}
assert dialog != null;
dialog.setTitle(R.string.confirmar_exclusao);
dialog.setTitle(R.string.confirmar_exclusao);
dialog.setMessage(exluirRestauranteMessage + ": " + restauranteSelecionado.getNome() + " ?");
dialog.setPositiveButton("Sim", (dialogInterface, i) -> {
RestauranteDAO restauranteDAO = new RestauranteDAO(getContext());
if (restauranteDAO.deletar(restauranteSelecionado)) {
RestauranteAdapter adapter = (RestauranteAdapter) bind.recyclerView.getAdapter();
if (adapter != null) {
adapter.notifyItemRemoved(position);
popularLista();
}
Toast.makeText(getContext(), R.string.sucesso_excluir_restaurante, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getContext(), R.string.erro_excluir_restaurante, Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton(R.string.nao_dialog, null);
dialog.show();
return false;
}
private void initViewListeners() {
bind.fab.setOnClickListener(view -> adicionarRestaurante());
}
private void setupRecyclerView() {
//Carrega elementos do banco
popularLista();
//Configurar adapter
RestauranteAdapter restauranteAdapter = new RestauranteAdapter(listaRestaurantes, this);
//Configurar recyclerView
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
bind.recyclerView.setLayoutManager(layoutManager);
bind.recyclerView.setHasFixedSize(true); // performance
if (getContext() != null) {
bind.recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayout.VERTICAL)); // add um divisor
}
bind.recyclerView.setItemAnimator(new DefaultItemAnimator());
bind.recyclerView.setAdapter(restauranteAdapter);
}
private void adicionarRestaurante() {
startActivityForResult(new Intent(getContext(), AddRestauranteActivity.class), REQUEST_CODE_ACTIVITY);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_ACTIVITY && resultCode == RESULT_OK) {
RestauranteAdapter adapter = (RestauranteAdapter) bind.recyclerView.getAdapter();
if (adapter != null) {
popularLista();
adapter.notifyDataSetChanged();
}
}
}
private void popularLista() {
RestauranteDAO restauranteDAO = new RestauranteDAO(getContext());
listaRestaurantes.clear();
listaRestaurantes.addAll(restauranteDAO.listar());
}
@Override
public View.OnClickListener onRestauranteClickEdit(int position) {
return view -> editarItemRecycler(position);
}
@Override
public View.OnClickListener onRestauranteClickFavorito(int position) {
return view -> {
RestauranteDAO restauranteDAO = new RestauranteDAO(getContext());
RestauranteAdapter adapter = (RestauranteAdapter) bind.recyclerView.getAdapter();
Restaurante restaurante = listaRestaurantes.get(position);
restaurante.setFavorito(true);
if (restauranteDAO.atualizar(restaurante)) {
popularLista();
Toast.makeText(getContext(), "Adicionado aos favoritos", Toast.LENGTH_SHORT).show();
adapter.notifyDataSetChanged();
}
};
}
@Override
public View.OnLongClickListener onRestauranteLongClickDelete(int position) {
return view -> deleteItemToRecycler(position);
}
}
偏爱碎片。爪哇
package com.curso安卓.testegit.Fragment;
import 安卓.os.Bundle;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.LinearLayout;
import 安卓.widget.Toast;
import 安卓x.fragment.app.Fragment;
import 安卓x.recyclerview.widget.DefaultItemAnimator;
import 安卓x.recyclerview.widget.DividerItemDecoration;
import 安卓x.recyclerview.widget.LinearLayoutManager;
import 安卓x.recyclerview.widget.RecyclerView;
import com.curso安卓.testegit.Adapter.FavoritosAdapter;
import com.curso安卓.testegit.Helper.RestauranteDAO;
import com.curso安卓.testegit.Model.Restaurante;
import com.curso安卓.testegit.databinding.FragmentFavoritosBinding;
import java.util.ArrayList;
import java.util.List;
public class FavoritosFragment extends Fragment implements FavoritosAdapter.OnFavoritosClick {
private final List<Restaurante> listaRestaurantes = new ArrayList<>();
private FragmentFavoritosBinding bind;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
bind = FragmentFavoritosBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
initRecyclerView();
return bind.getRoot();
}
public void initRecyclerView() {
popularLista();
FavoritosAdapter adapter = new FavoritosAdapter(listaRestaurantes, this);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
bind.recyclerViewFav.setLayoutManager(layoutManager);
bind.recyclerViewFav.setHasFixedSize(true);
if(getContext() != null){
bind.recyclerViewFav.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayout.VERTICAL));
}
bind.recyclerViewFav.setItemAnimator(new DefaultItemAnimator());
bind.recyclerViewFav.setAdapter(adapter);
}
private void popularLista() {
RestauranteDAO restauranteDAO = new RestauranteDAO(getContext());
listaRestaurantes.clear();
listaRestaurantes.addAll(restauranteDAO.buscarFavoritos());
}
@Override
public View.OnClickListener removeItemFavorite(int position) {
return view -> {
FavoritosAdapter adapter = (FavoritosAdapter) bind.recyclerViewFav.getAdapter();
RestauranteDAO restauranteDAO = new RestauranteDAO(getContext());
Restaurante restauranteDesfavoritado;
restauranteDesfavoritado = listaRestaurantes.get(position);
restauranteDesfavoritado.setFavorito(false);
if(restauranteDAO.atualizar(restauranteDesfavoritado)){
Toast.makeText(getContext(), "O Restaurante: " + restauranteDesfavoritado.getNome() + "Foi Removido dos favoritos", Toast.LENGTH_LONG).show();
adapter.notifyItemRemoved(position);
popularLista();
}
};
}
}
主要活动。爪哇
package com.curso安卓.testegit.activity;
import 安卓.os.Bundle;
import 安卓x.appcompat.app.AppCompatActivity;
import com.curso安卓.testegit.Adapter.ViewPagerAdapter;
import com.curso安卓.testegit.Fragment.FavoritosFragment;
import com.curso安卓.testegit.Fragment.RestauranteFragment;
import com.curso安卓.testegit.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding bind = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(bind.getRoot());
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle("RESTAURANTE MARCAO");
}
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new RestauranteFragment(), "Restaurantes");
adapter.addFragment(new FavoritosFragment(), "Favoritos");
bind.viewPager.setAdapter(adapter);
bind.tabs.setupWithViewPager(bind.viewPager);
}
}
上面是2段代码和我的主代码。如上所述,我希望在幻灯片中更新此列表。多谢各位
# 1 楼答案
我建议您在
activity
中使用两个列表,并在每个名为updateList()
的片段中创建两个方法,其中一个将元素列表作为参数因此,一旦您从第一个选项卡的列表中删除一个项目,您就可以通过
activity
通知第二个选项卡的RecyclerView
中的更改。您可以对添加新项执行相同的操作