Sự kiện setOnItemClickListener trong listview

mình có custom một list view nhưng khi list view đó hiển thị lên được rồi set sự kiện cho nó thì nó lại không chạy

package app.nhiendo.adapter;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;

import java.util.List;
import java.util.zip.Inflater;

import app.nhiendo.model.Music;
import app.nhiendo.nghenhac.R;

/**
 * Created by domin on 8/30/2017.
 */

public class MusicAdapter extends ArrayAdapter<Music>
{
    Activity context;
    @LayoutRes int resource;
    @NonNull List<Music> objects;
    public MusicAdapter(@NonNull Activity context, @LayoutRes int resource, @NonNull List<Music> objects) {
        super(context, resource, objects);
        this.context=context;
        this.resource=resource;
        this.objects=objects;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater=this.context.getLayoutInflater();
        View row=inflater.inflate(this.resource,null);
        TextView txtId= (TextView)row.findViewById(R.id.txtId);
        TextView txtName=(TextView)row.findViewById(R.id.txtName);
        TextView txtSong=(TextView)row.findViewById(R.id.txtSinger);
        ImageButton btnLike= (ImageButton) row.findViewById(R.id.btnLike);
        ImageButton btnDiskLike= (ImageButton) row.findViewById(R.id.btnDiskLike);
        Music m=this.objects.get(position);
        txtId.setText(m.getId());
        txtName.setText(m.getSong());
        txtSong.setText(m.getSinger());
        return row;

    }

    @Nullable
    @Override
    public Music getItem(int position) {
        return this.objects.get(position);
    }
}

đây là code lớp custom listview của mình
còn đây là lớp trong MainActivity như sau

ListView lvDanhSach,lvLove;
 private void addEvents() {
       lvDanhSach.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this,"xin chao",Toast.LENGTH_LONG).show();
           }
       });
    }

nhưng khi chạy lên ấn vào từng mục con trong list view thì nó lại không nhận sự kiện này .Cảm ơn mọi người

Bạn gọi addEvents khi nào vậy?

trong hàm onCreate bạn à

đây bạn ơi

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addControls();
        addEvents();
    }

Vậy là bạn set adapter trong add control và set listener trong add event?

vâng đúng là như thế bạn à

Lạ nhỉ. Cho mình xem code của addControl đc không? Cảm ơn bạn

  private void addControls()  {
        TabHost tabHost= (TabHost) findViewById(R.id.tabHost);
        tabHost.setup();
        TabHost.TabSpec tab1=tabHost.newTabSpec("T1");
        tab1.setIndicator("Danh Sách Bài Hát");
        tab1.setContent(R.id.tab1);
        tabHost.addTab(tab1);

        TabHost.TabSpec tab2=tabHost.newTabSpec("T2");
        tab2.setIndicator("Bài Hát Yêu Thích");
        tab2.setContent(R.id.tab2);
        tabHost.addTab(tab2);

        lvDanhSach= (ListView) findViewById(R.id.lvDanhSach);
        lvLove= (ListView) findViewById(R.id.lvLove);
        musics1=new ArrayList<>();
        try
        {
            AssetManager manager=getAssets();
            String [] arr=manager.list("music");
            for( int i=0;i<arr.length;i++)
            {
                Music m=new Music();
                m.setId("Bh000"+i);
                m.setSong(arr[i]);
                m.setSinger("chua xac dinh");
                m.setLike(false);
                musics1.add(m);
            }
        }catch (Exception ex)
        {
            Log.e("loi la:",ex.toString());
        }
        adapter1=new MusicAdapter(MainActivity.this,R.layout.item,musics1);
        lvDanhSach.setAdapter(adapter1);
    }

Có một trường hợp trên stackoverflow giống của bạn


Và có vẻ đây là một lỗi của framework

mình đã thử và fail bạn à

đây là cách fix lỗi này bạn à
set the root layout with: android:descendantFocusability=“blocksDescendants”
set any focusable or clickable view in this item with:
android:clickable=“false”
android:focusable=“false”
android:focusableInTouchMode=“false”
nhưng như ảnh này của mình thấy thì như vậy hai cái nút button thì sẽ ko set được events cho nó vì lúc này nó coi cả cái đấy là 1 cục bạn à

Nếu mình bỏ phần

Thì nó có hoạt động đc không?

chưa thử đợi tý thử rồi sẽ báo cáo

1 Like

thực tế thì cần chỉ thêm dòng này thôi bạn à

 android:descendantFocusability="blocksDescendants"

mình vừa bỏ đi thì nó vẫn chạy ngon lành cành đào bạn à

3 Likes

đây là mới test trên máy ảo nha méo biết máy thật có chạy được ko nữa

Chào Bạn! Nếu mình muốn bấm button like/dislike - mỗi lần bấm thì nó tự tăng bài hát lên số lượng like/dislike; khi mình dùng lệnh “setOnItemClickListener” để lắng nghe các sự kiện button like/dislike thì nó báo là không nhận được. (Mình cũng giống Bạn khai báo và ép kiểu các controler của item bên MusicAdapter; còn MainActivity chỉ khai báo tabhost-listview như vậy). Nhờ Các Bạn chỉ giúp. Xin cám ơn trước nhiều vậy.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?