OnItemClickListener pada ListView di dalam Fragmen tidak berfungsi

EDIT: TERSELESAIKAN. Jika ada sesuatu yang dapat difokuskan dalam XML item, itu akan merusak sentuhan daftar, dengan kata lain, android:focusable=false ke semua kotak centang, sakelar, atau semacamnya di daftar Anda. Dan selesai =)

Oke jadi, inilah masalah saya.

Saya menulis aplikasi yang menggunakan tab dan fragmen, dan semuanya berjalan sesuai keinginan saya kecuali ketika saya mencoba menangkap onItemClick pada listView bahkan tidak menandai barisnya seperti disentuh/ditekan/dipilih.

Saya telah membaca sedikit tentangnya dan banyak orang mengalami masalah yang sama, namun saya tidak menemukan tanggapan apa pun yang membantu saya sama sekali.

Saya tidak ingin menerapkan ListFragment, bahkan saya tidak tahu bagaimana/mengapa saya harus melakukannya, dan karena semua kode saya sudah berfungsi, saya tidak tahu apakah menerapkannya akan memberi saya lebih banyak pekerjaan yang harus dilakukan, jadi begini:

Apakah mungkin untuk mengimplementasikan pendengar untuk klik pada listView, di dalam sebuah fragmen? dan jika ya, BAGAIMANA?

PD: minSDK=14, tatgetSDK=15


person Dunnow    schedule 15.02.2013    source sumber
comment
Biasanya, Anda menggunakan OnItemClickListener, bukan OnClickListener, dengan ListView, terlepas dari apakah itu dalam sebuah fragmen atau tidak.   -  person CommonsWare    schedule 15.02.2013
comment
... saya tahu bahwa... saya, jelas, mengacu pada metode onItemClickListener, dan itu tidak berfungsi di dalam sebuah fragmen.   -  person Dunnow    schedule 16.02.2013
comment
@Dunnow saya memiliki masalah serupa. Bisakah Anda membantu saya menyelesaikannya? Itu diposting di sini. stackoverflow.com/ pertanyaan/42542056/   -  person Sulav Timsina    schedule 02.03.2017


Jawaban (7)


Taruh saja

android:focusable="false"
android:clickable="false"

dalam tata letak. Untuk semua tampilan teks, tombol, dll.

person Ashwin S Ashok    schedule 09.12.2013

Ini mungkin bermanfaat. Jawaban oleh raghunanadan di tautan di bawah memecahkan masalah saya

listview OnItemClick listner tidak berfungsi dalam fragmen

Tambahkan ini ke tata letak

android:descendantFocusability="blocksDescendants"

person Vinay    schedule 09.10.2015
comment
Jawaban Anda masuk ke Low quality review queue sebagai link-only answer. Anda tidak dapat melihat antrean saat ini karena reputasi rendah di SO, tetapi SO lain dengan reputasi lebih tinggi dapat melihatnya. Ketika jawaban semacam ini sedang ditinjau oleh orang lain, seseorang dapat meninggalkan komentar untuk memberi tahu Anda bahwa pertanyaan tersebut mungkin perlu diperbaiki (seperti saya dalam kasus ini) atau tidak memberikan suara (seperti orang yang tidak memberikan suara). Jadi tolong, coba hindari jawaban hanya tautan. - person Onik; 09.10.2015

Dua solusi luar biasa adalah ini, jika Anda memperluas ListFragment dari sebuah fragmen, ketahuilah bahwa mListView.setOnItemClickListener tidak akan dipanggil sebelum aktivitas Anda dibuat, Seperti yang tersirat dalam @dheeraj-bhaskar. Solusi ini memastikannya disetel ketika aktivitas telah dibuat

@Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
                // Do the onItemClick action

                Log.d("ROWSELECT", "" + rowId);
            }
        });
    }

Saat melihat kode sumber untuk ListFragment, saya menemukan ini

    public class ListFragment extends Fragment {
        ...........................................
     ................................................

        final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() 
{
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
{
                onListItemClick((ListView)parent, v, position, id);
            }
        };
       .................................................................
    ........................................................................

    public void onListItemClick(ListView l, View v, int position, long id) 
{
        }
}

Sebuah objek onItemClickListener terpasang dan memanggil onListItemClick() Oleh karena itu, solusi serupa lainnya, yang bekerja dengan cara yang persis sama adalah dengan mengganti onListItemClick()

 @Override
        public void onListItemClick(ListView l, View v, int position, long rowId) {
            super.onListItemClick(l, v, position, id);
           // Do the onItemClick action

                    Log.d("ROWSELECT", "" + rowId);
        } 
person Otieno Rowland    schedule 10.06.2015

Berikut adalah ikhtisar alur kerja, buat ListView Anda dan Adapter yang sesuai (digunakan untuk memetakan data dasar Anda ke item di ListView), atur adaptor ke ListView, lalu tambahkan OnItemClickListener ke dalamnya.

Detail selengkapnya dan contoh kode dapat ditemukan di: http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

person Brent Hronik    schedule 15.02.2013
comment
Satu-satunya hal yang berbeda dalam fragmen adalah memanggil getActivity() di mana pun konteksnya diperlukan. - person Brent Hronik; 16.02.2013
comment
aktivitas akhir aktivitas = getActivity(); Toast.makeText(aktivitas, yang dipilih: + + fullObject.getTitle(), Toast.LENGTH_LONG).show(); - person Dunnow; 16.02.2013
comment
item dalam daftar bahkan tidak ditandai dengan warna biru ketika saya menyentuhnya, jadi, TIDAK ADA daftar yang berfungsi, saya mengisinya, saya mengatur adaptor saya, saya bahkan dapat mencentang hapus centang pada kotak yang saya tambahkan ke dalamnya, tetapi saya bisa jangan lakukan onItemClick - person Dunnow; 16.02.2013
comment
Maukah Anda memposting seluruh tampilan daftar, adaptor, dan inisialisasi itemClickListener, serta xml untuk fragmen Anda? - person Brent Hronik; 16.02.2013
comment
ideone.com/P715aq ‹-- fragmen ideone.com/xFMj39 ‹-- adaptor khusus ideone.com/we97d1 ‹-- hasil adaptor (hardcode, setelah saya berfungsi akan membersihkan kode dan kotoran) menurut saya ini semua terkait dengan daftar/fragmen (fragmen adalah bagian dari antarmuka tab) - person Dunnow; 16.02.2013
comment
Hmm aku benar-benar kehilangan kata-kata, sepertinya semuanya benar :/ - person Brent Hronik; 17.02.2013
comment
Ahh, seharusnya diminta untuk melihat tata letak item daftar. Tangkapan yang bagus! - person Brent Hronik; 19.02.2013
comment
Faktanya, Anda melakukannya, masalahnya adalah saya bahkan tidak mempostingnya karena saya pikir itu tidak masalah (tidak pernah memiliki item yang dapat difokuskan dalam daftar sebelumnya, jadi... saya hanya berasumsi itu juga benar) - person Dunnow; 19.02.2013

Jika Anda ingin meneruskan data dari fragmen ke aktivitas apa pun di tampilan daftar, klik maka Anda dapat memodifikasi kode Anda seperti...

class HistoryFragment extends Fragment {  ListView historyListView;
public HistoryFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v= inflater.inflate(R.layout.fragment_history, container, false);
    historyListView= (ListView) v.findViewById(R.id.historyDataListView);

    sendRequest();  //it is my meathod to load the listview and set the adapter
    return  v;
}

public void onStart() {
    super.onStart();
    historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Intent intent=new Intent(getActivity(), DisplayDetails.class);

            intent.putExtra("text", historyListView.getItemAtPosition((int) l).toString());
            startActivity(intent);
          //  Toast.makeText(getActivity(),"Hello.. "+historyListView.getItemAtPosition((int) l).toString(),Toast.LENGTH_LONG).show();
        }
    });
}}
person Javed    schedule 08.02.2017
comment
jika Anda meletakkan ini di onStart(), ini akan dipanggil setiap kali onStart dipanggil - person Mohit Rajput; 14.09.2020

tombol akan mempengaruhi pendengar, coba hindari penggunaan tombol dan kompilasi ulang, ini akan berfungsi

person user9402274    schedule 06.01.2019

person    schedule
comment
mencobanya... tidak berfungsi di dalam sebuah fragmen, seperti yang telah saya nyatakan - person Dunnow; 16.02.2013
comment
itu memberi saya kesalahan jika saya menjalankan kode ini di dalam metode onCreate, meluncurkan debug bahkan sebelum aktivitas saya dimulai :S Dan jika saya menyetel cuplikan ini di main itu sendiri, itu menandai deklarasi dan lv=(ListView) dapatkan.. .sebagai garis yang salah. - person Dunnow; 19.02.2013
comment
@Dunnow bisakah Anda menambahkannya sebagai jawaban atau menerima salah satu jawaban di sini - person Dheeraj Bhaskar; 21.02.2013
comment
Saya telah mengedit posting pertama untuk mencerminkan bagaimana saya menyelesaikannya, tetapi saya akan menandai jawaban Anda sebagai jawaban saya kira karena masih benar melakukannya dengan kode itu, masalahnya bukan di sana, tetapi di XML u_u - person Dunnow; 22.02.2013
comment
@Dunnow, jika Anda memasukkan kode ini ke dalam kode onViewCreated di dalam kelas fragmen Anda (kelas yang memperluas Fragmen), kode ini akan berfungsi dengan baik selama Anda menginisialisasi ListView (lv = (ListView)view.findViewById(R.id. ANDAlv);) - person whyoz; 14.05.2013
comment
@DheerajBhaskar Saya memiliki masalah serupa. Bisakah Anda membantu saya menyelesaikannya? Itu diposting di sini. stackoverflow.com/ pertanyaan/42542056/ - person Sulav Timsina; 02.03.2017
comment
@SulavTimsina izinkan saya melihatnya - person Dheeraj Bhaskar; 03.03.2017