How to call initLoader within OnClickListener

2

Hi, Is it possible to call an initLoader inside an OnClickListener?

I need it to be started after the editText data entry, because the network request returns error 400, URL enters without the user query, because the variable was not passed in the OnClick method, the initLoader parameters show error in this , says that LoaderCallBacks is required instead of OnClickListener.

package com.example.android.listadelivros;

import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
        implements LoaderCallbacks<List<DadosLivro>> {

    private static String pesquisarDadosLivro;
    private DadosLivrosAdapter mAdapter;

    private static final String GOOGLE_LIVROS_URL =
            "https://www.googleapis.com/books/v1/volumes?q= " + pesquisarDadosLivro;
    ;

    private static final int DADOSLIVROS_ID_LOADER = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button pesquisarLivro = (Button) findViewById(R.id.pesquisar);
        pesquisarLivro.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                EditText dadosLivro = (EditText) findViewById(R.id.dados_livro);
                pesquisarDadosLivro = dadosLivro.getText().toString();

                final LoaderManager loaderManager = getLoaderManager();
                loaderManager.initLoader(DADOSLIVROS_ID_LOADER, null,
                        this);
            }
        });

        ListView listView = (ListView) findViewById(R.id.lista);

        mAdapter = new DadosLivrosAdapter(this, new ArrayList<DadosLivro>());

        listView.setAdapter(mAdapter);

    }

    @Override
    public android.content.Loader<List<DadosLivro>> onCreateLoader(int i, Bundle bundle) {

        return new DadosLivrosLoader(this, GOOGLE_LIVROS_URL);
    }

    @Override
    public void onLoadFinished(android.content.Loader<List<DadosLivro>> loader, List<DadosLivro>
            informacoesLivros) {

        if (informacoesLivros != null && !informacoesLivros.isEmpty()) {
            mAdapter.addAll(informacoesLivros);
        }
    }

    @Override
    public void onLoaderReset(android.content.Loader<List<DadosLivro>> loader) {
        mAdapter.clear();
    }
}
    
asked by anonymous 05.05.2017 / 19:16

1 answer

1

The problem occurs because within OnClickListener , the context is another!

Within the onclick method, its this is an OnClickListener and not a LoaderCallbacks !

Try this:

pesquisarLivro.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            EditText dadosLivro = (EditText) findViewById(R.id.dados_livro);
            pesquisarDadosLivro = dadosLivro.getText().toString();

            final LoaderManager loaderManager = getLoaderManager();
            loaderManager.initLoader(DADOSLIVROS_ID_LOADER, null,
              //Vamos usar o this de MainActivity!!!
                    MainActivity.this);
        }
    });

There is one more problem in your code:

private static final String GOOGLE_LIVROS_URL =
            "https://www.googleapis.com/books/v1/volumes?q= " + pesquisarDadosLivro;

This url will always add null because it is created before updating the variable pesquisarDadosLivro

Try the following form:

// Vamos transformar %s em o que o usuário digitou no campo!
    private static final String GOOGLE_LIVROS_URL =
                "https://www.googleapis.com/books/v1/volumes?q=%s" ;

When invoking your LoaderManager, let's pass the text that the user added!

// Vamos encodar a String para adicionar na url 


 final String encodeParam = URLEncoder.encode(pesquisarDadosLivro, "utf-8"));
// Alteramos o %s por encodeParam;
    final String _url = String.format(DADOSLIVROS_ID_LOADER, encodeParam);

loaderManager.initLoader(_url, null,
 //Vamos usar o this de MainActivity!!!
    MainActivity.this);
    
05.05.2017 / 19:23