01/10/2018, 11:16

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

Phạm Vinh viết 13:21 ngày 01/10/2018

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

Đỗ Nhiên viết 13:31 ngày 01/10/2018

trong hàm onCreate bạn à

Đỗ Nhiên viết 13:22 ngày 01/10/2018

đây bạn ơi

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addControls();
        addEvents();
    }
Phạm Vinh viết 13:30 ngày 01/10/2018

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

Đỗ Nhiên viết 13:29 ngày 01/10/2018

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

Phạm Vinh viết 13:27 ngày 01/10/2018

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

Đỗ Nhiên viết 13:21 ngày 01/10/2018
  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);
    }
Phạm Vinh viết 13:21 ngày 01/10/2018

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

stackoverflow.com
hiei

OnItemCLickListener not working in listview

android, listview
asked by hiei on 11:25AM - 05 Apr 11

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

Đỗ Nhiên viết 13:21 ngày 01/10/2018

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

Đỗ Nhiên viết 13:22 ngày 01/10/2018

đâ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 à

Phạm Vinh viết 13:25 ngày 01/10/2018

Nếu mình bỏ phần

android:clickable=“false”
android:focusable=“false”
android:focusableInTouchMode=“false”

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

Đỗ Nhiên viết 13:23 ngày 01/10/2018

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

Đỗ Nhiên viết 13:30 ngày 01/10/2018

android:descendantFocusability=“blocksDescendants”

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 à

Đỗ Nhiên viết 13:32 ngày 01/10/2018

đâ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

Bài liên quan
0