Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

meu setOnItemClickListener() no modo landscape não funciona

Após assistir a aula, tentei aplicar a personalização do Adapter e a mudança de dados que aparem na tela quando ela está em modo Landscape. Mas por algum motivo, quando clico nos itens da lista, o setOnItemClickListener() não é acionado, e nada acontece.

listaCanticos = (ListView) findViewById(R.id.lista_canticos);

        listaCanticos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Cantico cantico = (Cantico) listaCanticos.getItemAtPosition(position);

                Intent intentGoToLyrics = new Intent(SummaryActivity.this, LyricsActivity.class);
                intentGoToLyrics.putExtra("cantico", cantico);
                startActivity(intentGoToLyrics);
            }
        });
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Cantico cantico = canticos.get(position);

        LayoutInflater inflater = LayoutInflater.from(context);

        View view = convertView;
        if(view == null){
            view = inflater.inflate(R.layout.list_item, parent, false);
        }

        TextView titleField = (TextView) view.findViewById(R.id.item_title);
        TextView firstLineField = (TextView) view.findViewById(R.id.item_first_line);
        ImageButton favoriteField = (ImageButton) view.findViewById(R.id.item_favorite);

        titleField.setText(cantico.getNumber() + " - " + cantico.getTitle());
        if(firstLineField != null){
            String[] lyric = cantico.getLyrics().split("\n");
            String firstLine = lyric[0];
            firstLineField.setText(firstLine);
        }
        if(favoriteField != null){
            if(cantico.isFavorite()){
                favoriteField.setImageResource(R.drawable.favorite_on);
            } else {
                favoriteField.setImageResource(R.drawable.favorite_off);
            }
        }

        return view;
    }

Não sei o que está errado ou faltando no meu código. Alguém poderia me ajudar?

9 respostas

Oi Lucas, tudo bem ?

Estou achando um pouco estranho este seu erro, posta seu código para gente entender um pouquinho melhor ?

Abraços

Tá ali em cima meu código. Quer que poste mais alguma coisa?

Quero o código onde você define o listener na lista, o código da activity completa.

Abraços

Listener:

listaCanticos = (ListView) findViewById(R.id.lista_canticos);

        listaCanticos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Cantico cantico = (Cantico) listaCanticos.getItemAtPosition(position);

                Intent intentGoToLyrics = new Intent(SummaryActivity.this, LyricsActivity.class);
                intentGoToLyrics.putExtra("cantico", cantico);
                startActivity(intentGoToLyrics);
            }
        });

Activity:

public class SummaryActivity extends AppCompatActivity {

    private ListView listaCanticos;
    private List<Cantico> selectAllList;
    private List<Cantico> favoriteList;
    private List<Cantico> selectByTitleList;
    private String title;
    private List<Cantico> selectByLyricsList;
    private String lyrics;
    private Cantico cantico;


    private SongbookHelper helper;

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

        Intent intent = getIntent();
        selectAllList = (ArrayList<Cantico>) intent.getSerializableExtra("selectAllList");
        favoriteList = (ArrayList<Cantico>) intent.getSerializableExtra("favoriteList");
        selectByTitleList = (ArrayList<Cantico>) intent.getSerializableExtra("selectByTitleList");
        title = intent.getStringExtra("title");
        selectByLyricsList = (ArrayList<Cantico>) intent.getSerializableExtra("selectByLyricsList");
        lyrics = intent.getStringExtra("lyrics");
        cantico = (Cantico) intent.getSerializableExtra("cantico");

        listaCanticos = (ListView) findViewById(R.id.lista_canticos);

        listaCanticos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Cantico cantico = (Cantico) listaCanticos.getItemAtPosition(position);

                Intent intentGoToLyrics = new Intent(SummaryActivity.this, LyricsActivity.class);
                intentGoToLyrics.putExtra("cantico", cantico);
                startActivity(intentGoToLyrics);
            }
        });

        registerForContextMenu(listaCanticos);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search_button, menu);
        inflater.inflate(R.menu.favorite_list_button, menu);

        return super.onCreateOptionsMenu(menu);
    }

    private void loadSummary(){
        CanticoDAO dao = new CanticoDAO(this);
        List<Cantico> canticos = null;

        if(favoriteList != null){
            canticos = dao.listFavorites();
        } else if(selectByTitleList != null){
            canticos = selectByTitleList;
        } else if (selectByLyricsList != null) {
            canticos = selectByLyricsList;
        } else if(selectAllList != null){
            canticos = selectAllList;
        } else {
            canticos = dao.selectAll();
        }

        dao.close();

        if(canticos.size() == 0){
            Toast.makeText(this, "Não há cânticos na lista de favoritos", Toast.LENGTH_SHORT).show();
        }

        SongsAdapter adapter = new SongsAdapter(canticos, this);
        listaCanticos.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        loadSummary();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) {
        MenuItem erase = menu.add("Deletar");
        erase.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                Cantico cantico = (Cantico) listaCanticos.getItemAtPosition(info.position);

                CanticoDAO dao = new CanticoDAO(SummaryActivity.this);
                dao.erase(cantico);
                dao.close();
                loadSummary();

                return false;
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()){
            case R.id.search_song:

                Intent intentGoToSearchPopUp = new Intent(SummaryActivity.this, SearchPopUpActivity.class);
                startActivity(intentGoToSearchPopUp);

                break;

            case R.id.favorite_list:

                CanticoDAO dao = new CanticoDAO(SummaryActivity.this);
                List<Cantico> listCanticos = new ArrayList<Cantico>();
                listCanticos = dao.listFavorites();
                Intent intentGoToFavoriteList = new Intent(SummaryActivity.this, SummaryActivity.class);
                intentGoToFavoriteList.putExtra("favoriteList", (ArrayList<Cantico>) listCanticos);
                if(listCanticos.size() == 0){
                    Toast.makeText(SummaryActivity.this, "Não há cânticos na lista de favoritos", Toast.LENGTH_SHORT).show();
                }
                startActivity(intentGoToFavoriteList);

                break;
        }

        return super.onOptionsItemSelected(item);
    }
}

Isso é suficiente? Ou precisa de mais código?

Lucas, tudo bem ?

Cara tentei reproduzir seu erro, mas não estou conseguindo.

Analisei seu código e não identifiquei nenhum erro, pois quando você deixa o celular em landscape, ele vai chamar o onCreate onde você adiciona o Listener, logo deveria estar funcionando.

O que posso pedir para você é passar o projeto, via GitHub, para eu tente reproduzir no emulador e em um celular físico.

Matheus, obrigado pela disposição em ajudar. O link do projeto é esse: https://github.com/lucasgq/CancioneiroIPPA

Qualquer dúvida, pode entrar em contato comigo.

solução!

Lucas, trago boas notícias, descobri o motivo do problema.

Cara por algum motivo, no seu layout do seu item, quando está na horizontal, a estrela que você está colocando é um elemento do tipo ImageButton, os botões tem prioridade de toque, o que fazia que toque do item fosse ignorado, substitui para ImageView e funcionou.

Faz o teste ai !

Era exatamente esse o problema! Depois que mudei para ImageButton, a tela em modo landscape voltou a selecionar o item clicado. Obrigado Matheus