Atualizar um ListFragment criada por um ViewPager

32 views
Skip to first unread message

Henrique

unread,
Nov 9, 2016, 4:41:11 PM11/9/16
to Livro Dominando o Android
Olá Professor Glauber!
 Estou fazendo um projeto, e no meio do projeto me veio a necessidade de atualizar uma lista de um ListFragmen que esta sendo criado por um ViewPager​ e um FragmentPagerAdapter, a lista e a  SallidingTabs estao funcionando perfeitamente, porem, só consigo atualizar a lista, quando eu saio e entro de na activity, enquanto estou nela não consigo atualizar, o que eu estou querendo fazer e o seguinte, após clicar no botao ok de um dialogfragment, essa lista deveria atualizar com o novo item criado pelo dialogFragment e armazenado em um DAO, porem, o item e apenas salvo no DAO e não é atualizado nessa mesma lista.
   Tentei implementar uma interface no ListFragment do DialogFragment, para que o ListFragment receber um comando de usar um método para atualizar o adaptor do ListFragment após fechar o DialogFragment, porém me aparece o seguinte erro:

  java.lang.NullPointerException: Attempt to invoke interface method"Nome do Metodo" on a null object reference

O que eu consegui por meio de interface é só mandar o comando do Dialog para Acativity, ja que da activity para o ListFragment me aparece vários erros que nem consigo executar ​o projeto. 

Por favor, teria alguma solução para esse meu problema?
Obrigado!

Kleyton Santos

unread,
Nov 9, 2016, 5:03:40 PM11/9/16
to Henrique, Livro Dominando o Android

Olá.

Não dá muito o que dizer sem ver seu código, mas acredito que deva tá faltando você notificar seu adapter da alteração após a inclusão do seu item.
Algo como :

items.clear();
items = dbHelper.getItems();
// reload the items from database adapter.notifyDataSetChanged();

Items é sua fonte de dados que você passou inicialmente pro adapter da tua listview,  e o adapter é o mesmo que você utilizou no seu setlistadapter da sua listview.

Glauber pode dar uma resposta mais concreta mas eu espero ter ajudado. =)


--
Você recebeu essa mensagem porque está inscrito no grupo "Livro Dominando o Android" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para livro-dominando-o-...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/livro-dominando-o-android/018b4877-28ec-4a7b-a9ba-45cc60ea62ce%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Henrique

unread,
Nov 9, 2016, 6:06:18 PM11/9/16
to Livro Dominando o Android
public class ProjetoFragment extends ListFragment{

String[] arrayProj;
String[] arrayProf;
String[] arrayDescProj;

String nomeFinal;
String profFinal;
    String DescProjFinal;

    ArrayAdapter<String> adapter;
 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){
ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_list,container,false);


//RECEBE O VALOR DA ACTIVITY
TelaLugarProjeto activity = (TelaLugarProjeto) getActivity();
        arrayProj = activity.getProjData();
arrayProf = activity.getProfData();
arrayDescProj = activity.getDescProjData();

                   adapter = new ArrayAdapter<String>(getActivity(),R.layout.rowlayout,R.id.txtitem,arrayProj);
          setListAdapter(adapter);
adapter.notifyDataSetChanged();
 
        return rootView;
}











public class DialogProjetoAdd extends android.support.v4.app.DialogFragment {

LayoutInflater inflater;
View v;

EditText pjtNomeAdd,pjtProfAdd,pjtDescAdd;

String[] arrayProj;
String[] arrayProf;
String[] arrayDescProj;

String nomeFinal;
String profFinal;
String DescProjFinal;

Projeto projeto;
int idProjeto;

CommunicatorAtualizaPjt communicator;

@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {

idProjeto = getArguments().getInt("passaPjt");

inflater = getActivity().getLayoutInflater();
v = inflater.inflate(R.layout.dialog_projeto_add, null);
declaracoes();

//PEGA ARRAY
TelaLugarProjeto activity = (TelaLugarProjeto) getActivity();
arrayProj = activity.getProjData();
arrayProf = activity.getProfData();
arrayDescProj = activity.getDescProjData();

// String[] novoNome = new String[mNomeAdd +];

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v).setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

// String verificad = String.valueOf(aucM.getText());

// if (!verificad.matches("")) {
// String textMateria = String.valueOf(aucM.getText());
// if(textMateria.contains("—")){
// String[] mat = String.valueOf(aucM.getText()).split("—");
// String matDiv = mat[1];
// materia.setMateria(matDiv);
// }else{
// materia.setMateria(textMateria);
// }
// }
// materia.setTurma(String.valueOf(edtTur.getText()));
// materia.setBloco(String.valueOf(edtBloc.getText()));
// materia.setSala(String.valueOf(edtSal.getText()));
//
// dao = new MateriasDAO(getActivity());
// dao.alterarMateria(materia);
// dao.close();
//
// communicator.onDialogMessage();

}

}).setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});

return builder.create();
}

public void adicionadorProjeto(){

String mNomeAdd = pjtNomeAdd.getText().toString();
String mProfAdd = pjtProfAdd.getText().toString();
String mDescAdd = pjtDescAdd.getText().toString();

int nomeSize = arrayProj.length;

nomeFinal = mNomeAdd;
profFinal = mProfAdd;
DescProjFinal = mDescAdd;

if (arrayProf[0].matches("")){
arrayProj[0] = "";
arrayProj[0] = nomeFinal;
arrayProf[0] = profFinal;
arrayDescProj[0] = DescProjFinal;
nomeFinal = nomeFinal + "##";
profFinal = profFinal + "##";
DescProjFinal = DescProjFinal + "##";

}else{

for (int i = 0; i < nomeSize; i++) {
nomeFinal = nomeFinal + "##" + arrayProj[i];
profFinal = profFinal + "##" + arrayProf[i];
DescProjFinal = DescProjFinal + "##" + arrayDescProj[i];
}
nomeFinal = nomeFinal + "##";
profFinal = profFinal + "##";
DescProjFinal = DescProjFinal + "##";
}

}


public void declaracoes() {
pjtNomeAdd = (EditText) v.findViewById(R.id.pjtNomeAdd);
pjtProfAdd = (EditText) v.findViewById(R.id.pjtProfAdd);
pjtDescAdd = (EditText) v.findViewById(R.id.pjtDescAdd);
}

private boolean estaVazia(EditText etText) {
if (etText.getText().toString().trim().length() > 0)
return false;

return true;
}

@Override
public void onStart() {
super.onStart(); //super.onStart() is where dialog.show() is actually called on the underlying dialog, so we have to do it after this point
final AlertDialog d = (AlertDialog) getDialog();
if (d != null) {
Button positiveButton = (Button) d.getButton(Dialog.BUTTON_POSITIVE);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Boolean wantToCloseDialog;

if (estaVazia(pjtNomeAdd) || estaVazia(pjtProfAdd) || estaVazia(pjtDescAdd) ){
wantToCloseDialog = false;
Toast.makeText(getActivity(), "Há Lacunas Vazias! ", Toast.LENGTH_SHORT).show();
}else{
adicionadorProjeto();
salvaNoServer(nomeFinal,profFinal,DescProjFinal);
wantToCloseDialog = true;
}
//Do stuff, possibly set wantToCloseDialog to true then...
if (wantToCloseDialog)
d.dismiss();
//else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
}
});
}
}

public void salvaNoServer(String nome,String professor,String descricao){
List<Projeto> listaProjetos;
projeto = new Projeto();
listaProjetos = null;
try {
listaProjetos = projeto.getListaProjeto(idProjeto);
listaProjetos.get(0).setProjeto(nome);
listaProjetos.get(0).setProfessor(professor);
listaProjetos.get(0).setDescProj(descricao);
listaProjetos.get(0).saveInBackground();
atualizaListView();
} catch (ParseException e) {
e.printStackTrace();
}
}

public void atualizaListView(){
String[] atualizaNomes = nomeFinal.split("##");
String[] atualizaProf = profFinal.split("##");
String[] atualizaDescri = DescProjFinal.split("##");
int tamnhoLista = atualizaNomes.length;

for (int i = 0; i<tamnhoLista-1; i++){
arrayProj[i] = atualizaNomes[i];
arrayProf[i] = atualizaProf[i];
arrayDescProj[i] = atualizaDescri[i];

}
communicator.AtualizaPjt(arrayProj,arrayProf,arrayDescProj);
}

interface CommunicatorAtualizaPjt{
public void AtualizaPjt(String[] arg0,String[] arg1,String[] arg2);
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
communicator = (CommunicatorAtualizaPjt) activity;
}
} 




O metodo que a activity Receve da interface do Dialog:

@Override
public void AtualizaPjt(String[] argPjt, String[] argProf, String[] argDescPjt) {
Log.i("LOGX","Chegando aqui no zasco!");
arrayProj = argPjt;
arrayProf = argProf;
arrayDescProj = argDescPjt;

}

O Metodo que a Activity passa pro ListFragment e Pro Dialog:

public String[] getProjData() {
return arrayProj;
}

public String[] getProfData() {
return arrayProf;
}

public String[] getDescProjData() {
return arrayDescProj;
}
As valores que sao passados são de String[], nao postei o codiga antes por causa da formatacao dele, sempre me atrapalho com ela Mas ta atualizando a lista, o problema e no caso, o item e criado é colocado no primeiro item na lista, e os demais são passados para baixo, porém o ultimo item da lista some, é como se não criasse uma fileira a mais para a lista, o msm que volta a aparecer se eu saio e entro na acativity. Obrigado!

nglauber

unread,
Nov 9, 2016, 11:18:33 PM11/9/16
to Livro Dominando o Android
Oi Henrique,

A ideia principal aqui do grupo de discussão são temas relacionados ao livro: dúvidas em exemplos, reportar algum erro, fazer alguma sugestão, etc.
Mas para você não ficar sem resposta, vou tentar ajudar...
Para obter uma referência para um Fragment que está em um PagerAdapter, você pode usar isso aqui:
Para notificar a atualização, sugiro você utilizar o Otto (ou EventBus).

Se você quiser compartilhar seu projeto no github o pessoal pode tentar ajudar ;)
Vou estar fora por alguns dias, então posso demorar a responder.

Qualquer dúvida é só falar.

4br4ç05,
nglauber

Henrique

unread,
Nov 10, 2016, 1:42:24 AM11/10/16
to Livro Dominando o Android
Desculpe por fugir um pouco do tema do livro professor Glauber, porém só recorri ao recurso de lhe fazer esta perguntar, pois eu estava a um bom tempo procurando soluções para esse meu problema sem sucesso algum, que aliás com a sua ajuda e do Kleyton Santos, consegui resolve-lo, muito obrigado mesmo!
Abraço! 
Reply all
Reply to author
Forward
0 new messages