0
I have a Fragment called Fragmentopedidos with a button that adds a new item to a Recycleview, and this Recycleview is in a separate class: Adapterhistorico.java. Each item in this Recycleview has an edit button that opens a Alertdialog in which I edit the item, and after completing the edit I wanted the fragment to update or the Asynctask class that is in Fragmentopedidos to be called again, the same as when I click the remove button.
Inside the Fragment Fragmentopedidos I can give a refresh so:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(FragmentoPedidos.this).attach(FragmentoPedidos.this).commit();
But how do I do the same inside the Ordering Adapter?
Code of Fragmentopedidos:
public class FragmentoPedidos extends Fragment {
private static final String TAG = MainActivity.class.getSimpleName();
private String Cliente;
private String Endereco;
private Double Total;
private List Conteudo;
private ArrayList<Produtos> ClienteInfo=new ArrayList<>();
private SqliteDatabase mDatabase;
private ArrayList<Produtos> todosProdutos=new ArrayList<>();
private AdapterPedido mAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
View v = inflater.inflate(R.layout.fragmento_pedidos, container, false);
RecyclerView contactView = (RecyclerView)v.findViewById(R.id.product_list);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
contactView.setLayoutManager(linearLayoutManager);
contactView.setHasFixedSize(true);
mDatabase = new SqliteDatabase(getActivity());
todosProdutos = mDatabase.listaProdutos();
ClienteInfo = mDatabase.getClienteInfo();
Cliente = mDatabase.getCliente();
Endereco = mDatabase.getEndereco();
Total = mDatabase.getTotal();
Conteudo = mDatabase.getInfo();
if(todosProdutos.size() > 0 || ClienteInfo.size() > 0){
contactView.setVisibility(View.VISIBLE);
mAdapter = new AdapterPedido(getActivity(), todosProdutos);
contactView.setAdapter(mAdapter);
final TextView txtTotal = (TextView)v.findViewById(R.id.tvPedidoTotal);
String formatado = myFormat(new BigDecimal(Total));
if(formatado.contains(".00")){
String formatado1 = formatado.replace(".00","");
txtTotal.setText("R$ " + formatado1);
}else {
txtTotal.setText("R$ " + formatado);
}
final EditText campoCliente = (EditText)v.findViewById(R.id.etCliente);
final EditText campoEndereco = (EditText)v.findViewById(R.id.etEndereco);
campoCliente.setText(Cliente);
campoEndereco.setText(Endereco);
}else{
contactView.setVisibility(View.GONE);
Toast.makeText(getActivity(), "Não há nenhum pedido em andamento.", Toast.LENGTH_SHORT).show();
}
FloatingActionButton addProd = (FloatingActionButton) v.findViewById(R.id.addProd);
FloatingActionButton enviPed = (FloatingActionButton) v.findViewById(R.id.enviPed);
final EditText campoCliente = (EditText)v.findViewById(R.id.etCliente);
final EditText campoEndereco = (EditText)v.findViewById(R.id.etEndereco);
addProd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String cliente = campoCliente.getText().toString();
final String endereco = campoEndereco.getText().toString();
if(cliente.matches("")){
DynamicToast.makeError(getActivity(), "Preencha o nome do cliente!").show();
}else if(endereco.matches("")){
DynamicToast.makeError(getActivity(), "Preencha o endereço do cliente!").show();
}else {
if (ClienteInfo.size() > 0) {
Produtos updt_cliente_info = new Produtos(cliente, endereco);
mDatabase.updateCli_End(updt_cliente_info);
}else{
Produtos add_cliente_info = new Produtos(cliente, endereco);
mDatabase.addCli_End(add_cliente_info);
}
addTaskDialog();
}
}
});
enviPed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String cliente = campoCliente.getText().toString();
final String endereco = campoEndereco.getText().toString();
final String pedido_cliente = Cliente;
final String pedido_endereco = Endereco;
final List pedido_conteudo1 = Conteudo;
String pedido_conteudo = String.valueOf(pedido_conteudo1);
if(todosProdutos.size() > 0 || ClienteInfo.size() > 0) {
String formatado = myFormat(new BigDecimal(Total));
if(formatado.contains(".00")){
String formatado1 = formatado.replace(".00","");
new ServiceLogin().execute(pedido_cliente, pedido_endereco, pedido_conteudo, formatado1);
mDatabase.deletardb();
RefreshFragment();
DynamicToast.makeSuccess(getActivity(), "Pedido criado com sucesso", Toast.LENGTH_LONG).show();
}else {
new ServiceLogin().execute(pedido_cliente, pedido_endereco, pedido_conteudo, formatado);
mDatabase.deletardb();
RefreshFragment();
DynamicToast.makeSuccess(getActivity(), "Pedido criado com sucesso", Toast.LENGTH_LONG).show();
}
}else if(cliente.matches("")){
DynamicToast.makeError(getActivity(), "Preencha o nome do cliente!").show();
}else if(endereco.matches("")){
DynamicToast.makeError(getActivity(), "Preencha o endereço do cliente!").show();
}else if(todosProdutos.size() <= 0) {
DynamicToast.makeError(getActivity(), "Adicione pelo menos um produto ao pedido!").show();
}
}
});
return v;
}
public void RefreshFragment() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(FragmentoPedidos.this).attach(FragmentoPedidos.this).commit();
}
private class ServiceLogin extends AsyncTask<String, Void, String> {
ProgressDialog mProgressDialog;
private String res;
@Override
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(getActivity(),
"", "Aguarde...");
}
@Override
protected String doInBackground(String... params) {
res = null;
PutUtility put = new PutUtility();
put.setParam("pedido_cliente", params[0].toString());
put.setParam("pedido_endereco", params[1].toString());
put.setParam("pedido_conteudo", params[2].toString());
put.setParam("pedido_total", params[3].toString());
try {
res = put.postData("http://10.0.2.2/cadjobel/public/novo-pedido-app.php");
Log.v("res", res);
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
protected void onPostExecute(String res) {
mProgressDialog.dismiss();
}
}
public static boolean isInteger(BigDecimal bigDecimal) {
int intVal = bigDecimal.intValue();
return bigDecimal.compareTo(new BigDecimal(intVal)) == 0;
}
public static String myFormat(BigDecimal bigDecimal) {
String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00";
return new DecimalFormat(formatPattern).format(bigDecimal);
}
private void addTaskDialog(){
LayoutInflater inflater = LayoutInflater.from(getActivity());
View subView = inflater.inflate(R.layout.layout_adc_produto, null);
new AsyncFetch(getActivity(), subView).execute();
final EditText campoNome = (EditText)subView.findViewById(R.id.tvProduto_Nome);
final EditText campoQuantidade = (EditText)subView.findViewById(R.id.etProduto_Quantidade);
final EditText campoPreco = (EditText)subView.findViewById(R.id.tvProduto_Preco);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Adicionar produto ao pedido");
builder.setView(subView);
builder.create();
builder.setPositiveButton("ADICIONAR", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String nome = campoNome.getText().toString();
final String quantidade1 = campoQuantidade.getText().toString();
final int quantidade = Integer.parseInt(campoQuantidade.getText().toString());
final String preco1 = campoPreco.getText().toString();
final double preco = Float.parseFloat(campoPreco.getText().toString());
if(TextUtils.isEmpty(quantidade1)){
DynamicToast.makeError(getActivity(), "Digite a quantidade do produto").show();
}else if(TextUtils.isEmpty(nome)){
DynamicToast.makeError(getActivity(), "Digite o nome do produto").show();
}else if(TextUtils.isEmpty(preco1)){
DynamicToast.makeError(getActivity(), "Digite o preço do produto").show();
}
else{
Produtos novoProduto = new Produtos(nome, quantidade, preco);
mDatabase.addContacts(novoProduto);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(FragmentoPedidos.this).attach(FragmentoPedidos.this).commit();
}
}
});
builder.setNegativeButton("CANCELAR", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "Operação cancelada", Toast.LENGTH_LONG).show();
}
});
builder.show();
}
@Override
public void onDestroy() {
super.onDestroy();
if(mDatabase != null){
mDatabase.close();
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchItem.getActionView();
search(searchView);
searchView.setQueryHint("Procurar no pedido...");
super.onCreateOptionsMenu(menu, inflater);
}
private void search(SearchView searchView) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (mAdapter!=null)
mAdapter.getFilter().filter(newText);
return true;
}
});
}
// Create class AsyncFetch
private class AsyncFetch extends AsyncTask<String, String, String> {
private String result;
private Context mContext;
private View rootView;
ProgressDialog pdLoading = new ProgressDialog(getActivity());
public AsyncFetch(Context context, View rootView){
this.mContext=context;
this.rootView=rootView;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//this method will be running on UI thread
pdLoading.setMessage("\tCarregando...");
pdLoading.setCancelable(false);
pdLoading.show();
}
@Override
protected String doInBackground(String... params) {
result = null;
PutUtility put = new PutUtility();
try {
result = put.postData("http://10.0.2.2/cadjobel/public/autocomplete-app.php");
/* put.setParam("UserId", params[0].toString());
put.setParam("Latitude", params[1].toString());
put.setParam("Longitude", params[2].toString());
put.setParam("DateTime", params[3].toString()); */
Log.v("result", result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
//this method will be running on UI thread
//ArrayList<String> dataList = new ArrayList<String>();
List<String> dataList=new ArrayList<>();
pdLoading.dismiss();
if(result.equals("no rows")) {
// Do some action if no data from database
}else{
try {
JSONArray jArray = new JSONArray(result);
// Extract data from json and store into ArrayList
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
dataList.add(json_data.getString("produto_nome"));
}
final AutoCompleteTextView text = (AutoCompleteTextView)
rootView.findViewById(R.id.tvProduto_Nome);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>
(mContext.getApplicationContext(), android.R.layout.simple_spinner_item, dataList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
text.setThreshold(1);
text.setAdapter(dataAdapter);
} catch (JSONException e) {
// You to understand what actually error is and handle it appropriately
DynamicToast.makeError(getActivity(), e.toString()).show();
DynamicToast.makeError(getActivity(), result.toString()).show();
}
}
}
}}
Code of the requested Adapter:
public class AdapterPedido extends RecyclerView.Adapter<ViewHolderPedido> implements Filterable{
private Context context;
private ArrayList<Produtos> listaProdutos;
private ArrayList<Produtos> mArrayList;
private SqliteDatabase mDatabase;
public AdapterPedido(Context context, ArrayList<Produtos> listaProdutos) {
this.context = context;
this.listaProdutos = listaProdutos;
this.mArrayList=listaProdutos;
mDatabase = new SqliteDatabase(context);
}
@Override
public ViewHolderPedido onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_lista_produtos, parent, false);
return new ViewHolderPedido(view);
}
public static boolean isInteger(BigDecimal bigDecimal) {
int intVal = bigDecimal.intValue();
return bigDecimal.compareTo(new BigDecimal(intVal)) == 0;
}
public static String myFormat(BigDecimal bigDecimal) {
String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00";
return new DecimalFormat(formatPattern).format(bigDecimal);
}
@Override
public void onBindViewHolder(ViewHolderPedido holder, int position) {
final Produtos produtos = listaProdutos.get(position);
holder.pNome.setText(produtos.getNome());
holder.pQtd.setText(String.valueOf(produtos.getQtd()));
final int quantidade = Integer.parseInt(String.valueOf(produtos.getQtd()));
double preco = produtos.getPreco();
double precox = quantidade * preco;
String formatado = myFormat(new BigDecimal(precox));
if(formatado.contains(".00")){
String formatado1 = formatado.replace(".00","");
holder.pPrecox.setText("R$ " + formatado1);
}else {
holder.pPrecox.setText("R$ " + formatado);
}
holder.edtProduto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
editTaskDialog(produtos);
}
});
holder.delProduto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//delete row from database
mDatabase.deleteContact(produtos.getId());
}
});
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
listaProdutos = mArrayList;
} else {
ArrayList<Produtos> filteredList = new ArrayList<>();
for (Produtos produtos : mArrayList) {
if (produtos.getNome().toLowerCase().contains(charString)) {
filteredList.add(produtos);
}
}
listaProdutos = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = listaProdutos;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listaProdutos = (ArrayList<Produtos>) filterResults.values;
notifyDataSetChanged();
}
};
}
@Override
public int getItemCount() {
return listaProdutos.size();
}
private void editTaskDialog(final Produtos produtos){
LayoutInflater inflater = LayoutInflater.from(context);
View subView = inflater.inflate(R.layout.layout_adc_produto, null);
final EditText campoNome = (EditText)subView.findViewById(R.id.tvProduto_Nome);
final EditText campoQtd = (EditText)subView.findViewById(R.id.etProduto_Quantidade);
final EditText campoPreco = (EditText)subView.findViewById(R.id.tvProduto_Preco);
if(produtos != null){
campoNome.setText(produtos.getNome());
campoQtd.setText(String.valueOf(produtos.getQtd()));
String formatado = myFormat(new BigDecimal(produtos.getPreco()));
if(formatado.contains(".00")){
String formatado1 = formatado.replace(".00","");
campoPreco.setText(formatado1);
}else {
campoPreco.setText(formatado);
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Editar produto");
builder.setView(subView);
builder.create();
builder.setPositiveButton("SALVAR", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String nome = campoNome.getText().toString();
final int quantidade = Integer.parseInt(campoQtd.getText().toString());
final double preco = Float.parseFloat(campoPreco.getText().toString());
if(TextUtils.isEmpty(nome)){
Toast.makeText(context, "Algo está errado. Cheque os dados digitados.", Toast.LENGTH_LONG).show();
}
else{
mDatabase.updateContacts(new Produtos(produtos.getId(), nome, quantidade, preco));
}
}
});
builder.setNegativeButton("CANCELAR", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "Operação cancelada.", Toast.LENGTH_LONG).show();
}
});
builder.show();
}}
This part I want Fragment to update
builder.setPositiveButton("SALVAR", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String nome = campoNome.getText().toString();
final int quantidade = Integer.parseInt(campoQtd.getText().toString());
final double preco = Float.parseFloat(campoPreco.getText().toString());
if(TextUtils.isEmpty(nome)){
Toast.makeText(context, "Algo está errado. Cheque os dados digitados.", Toast.LENGTH_LONG).show();
}
else{
mDatabase.updateContacts(new Produtos(produtos.getId(), nome, quantidade, preco));
//atualizar fragmento aqui
}
}
});
Requested fragment:
Hello, John! You don’t need to call
FragmentTransaction
. After sending the data to theAdapter
, just callmSeuAdapter.notifyDataSetChanged();
– Ivan Silva
I added
mAdapter..notifyDataSetChanged();
just belowmDatabase.addContacts(novoProduto);
, which is when the data is sent to the database, and gave a crashAttempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged()' on a null object reference
... I also added this line in the part where a new item is added to the list but nothing happens.– Joao Victor Menom
I had already tried this method to update Recycleview but did not succeed, so I went to the premise that I needed to update the fragment at once.
– Joao Victor Menom
And it also has the total part, which is outside of Recycleview and needs to be synchronized with the Recycleview items, so I think anyway the whole fragment needs to update.
– Joao Victor Menom