OnItemClickListener บน ListView ภายใน Fragment ไม่ทำงาน

แก้ไข: แก้ไขแล้ว หากมีสิ่งใดที่สามารถโฟกัสได้ใน XML ของรายการ มันจะทำลายการสัมผัสของรายการ กล่าวอีกนัยหนึ่งคือ android:focusable=false กับช่องทำเครื่องหมาย สวิตช์ หรืออะไรก็ตามที่คล้ายกันในรายการของคุณทั้งหมด และเสร็จแล้ว =)

ตกลง นี่คือปัญหาของฉัน

ฉันเขียนแอปที่ใช้ แท็บและแฟรกเมนต์ และทุกอย่างเป็นไปตามที่ฉันต้องการ ยกเว้นสิ่งที่เมื่อฉันพยายามจับภาพ onItemClick บน listView มันไม่ได้ทำเครื่องหมายแถวด้วยซ้ำ ตามที่สัมผัส/กด/เลือก

ฉันได้อ่านมาบ้างแล้วและหลายๆ คนก็ประสบปัญหาเดียวกัน แต่ฉันไม่พบคำตอบใดๆ ที่ช่วยฉันได้เลย

ฉันไม่ต้องการใช้ ListFragment จริงๆ แล้ว ฉันไม่รู้ด้วยซ้ำว่าควรทำอย่างไร/ทำไม และเนื่องจากโค้ดทั้งหมดของฉันใช้งานได้แล้ว ฉันจึงไม่รู้ว่าการนำไปใช้จะทำให้ฉันมีงานทำมากขึ้นหรือไม่ ดังนั้นนี่คือ:

เป็นไปได้ไหมที่จะใช้ Listener สำหรับการคลิกบน listView ภายในแฟรกเมนต์? และถ้าเป็นเช่นนั้น ทำอย่างไร?

PD: minSDK=14, หน่วย SDK=15


person Dunnow    schedule 15.02.2013    source แหล่งที่มา
comment
โดยปกติแล้ว คุณจะใช้ OnItemClickListener ไม่ใช่ OnClickListener กับ ListView โดยไม่คำนึงว่าจะอยู่ในแฟรกเมนต์หรือไม่ก็ตาม   -  person CommonsWare    schedule 15.02.2013
comment
... ฉันรู้ว่า... เห็นได้ชัดว่าฉันอ้างถึงเมธอด onItemClickListener และมันไม่ทำงานภายในแฟรกเมนต์   -  person Dunnow    schedule 16.02.2013
comment
@Dunnow ฉันมีปัญหาที่คล้ายกัน คุณช่วยฉันแก้ปัญหาได้ไหม? มันโพสต์ไว้ที่นี่ stackoverflow.com/ คำถาม/42542056/   -  person Sulav Timsina    schedule 02.03.2017


คำตอบ (7)


เพียงแค่ใส่

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

ในรูปแบบ สำหรับมุมมองข้อความ ปุ่ม ฯลฯ ทั้งหมด

person Ashwin S Ashok    schedule 09.12.2013

นี่อาจเป็นประโยชน์ คำตอบโดย raghunanadan ในลิงค์ด้านล่างช่วยแก้ปัญหาของฉันได้

listview OnItemClick listner ไม่ทำงานในส่วนย่อย

เพิ่มสิ่งนี้ลงในเค้าโครง

android:descendantFocusability="blocksDescendants"

person Vinay    schedule 09.10.2015
comment
คำตอบของคุณอยู่ใน Low quality review queue เป็น link-only answer คุณไม่สามารถดูคิวได้ในขณะนี้เนื่องจากชื่อเสียงต่ำใน SO แต่คนอื่น ๆ ที่มีชื่อเสียงสูงกว่าสามารถทำได้ เมื่อคำตอบประเภทนี้ได้รับการตรวจสอบโดยผู้อื่น บางคนสามารถแสดงความคิดเห็นเพื่อแจ้งให้คุณทราบว่าคำถามอาจต้องมีการปรับปรุง (เช่นฉันในกรณีนี้) หรือลงคะแนนเสียง (เช่นคนที่ลงคะแนนไม่) ดังนั้นโปรดลองหลีกเลี่ยงคำตอบแบบลิงก์เท่านั้น - person Onik; 09.10.2015

วิธีแก้ปัญหาที่ยอดเยี่ยมสองประการคือ หากคุณขยาย ListFragment จากแฟรกเมนต์ โปรดทราบว่า mListView.setOnItemClickListener จะไม่ถูกเรียกก่อนที่จะสร้างกิจกรรมของคุณ ตามที่ @dheeraj-bhaskar บอกเป็นนัย โซลูชันนี้ช่วยให้มั่นใจได้ว่าจะถูกตั้งค่าเมื่อมีการสร้างกิจกรรม

@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);
            }
        });
    }

ในขณะที่ดูซอร์สโค้ดของ ListFragment ฉันเจอสิ่งนี้

    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) 
{
        }
}

มีการแนบวัตถุ onItemClickListener และเรียก onListItemClick() ดังนั้นโซลูชันอื่นที่คล้ายกันซึ่งทำงานในลักษณะเดียวกันคือการแทนที่ 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

นี่คือภาพรวมของเวิร์กโฟลว์ สร้าง ListView ของคุณและสอดคล้องกับ Adapter (ใช้เพื่อแมปข้อมูลพื้นฐานของคุณกับรายการใน ListView) ตั้งค่าอะแดปเตอร์เป็น ListView จากนั้นเพิ่ม OnItemClickListener ลงไป

รายละเอียดเพิ่มเติมและโค้ดตัวอย่างสามารถพบได้ที่: http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

person Brent Hronik    schedule 15.02.2013
comment
สิ่งเดียวที่จะแตกต่างในส่วนย่อยจะต้องเรียก getActivity() ทุกที่ที่ต้องการบริบท - person Brent Hronik; 16.02.2013
comment
กิจกรรมกิจกรรมสุดท้าย = getActivity(); Toast.makeText(กิจกรรม, เลือก Faena: + + fullObject.getTitle(), Toast.LENGTH_LONG).show(); - person Dunnow; 16.02.2013
comment
รายการในรายการไม่ได้ทำเครื่องหมายเป็นสีน้ำเงินด้วยซ้ำเมื่อฉันแตะรายการเหล่านั้น ดังนั้นจึงไม่มีอะไรในรายการที่ใช้งานได้ ฉันเติมมัน ตั้งอะแดปเตอร์ ฉันยังสามารถทำเครื่องหมายและยกเลิกการเลือกช่องทำเครื่องหมายที่ฉันเพิ่มเข้าไปได้ แต่ฉันทำได้ อย่าทำ onItemClick - person Dunnow; 16.02.2013
comment
คุณช่วยโพสต์มุมมองรายการทั้งหมด อะแดปเตอร์ และการเริ่มต้น itemClickListener รวมถึง xml สำหรับแฟรกเมนต์ของคุณหรือไม่ - person Brent Hronik; 16.02.2013
comment
ideone.com/P715aq ‹-- ส่วน ideone.com/xFMj39 ‹-- อะแดปเตอร์แบบกำหนดเอง ideone.com/we97d1 ‹-- ผลลัพธ์ของอะแดปเตอร์ (ฮาร์ดโค้ด เมื่อฉันใช้งานได้จะล้างโค้ดและอึ) ฉันคิดว่านี่คือรายการ/แฟรกเมนต์ทั้งหมดที่เกี่ยวข้อง (แฟรกเมนต์เป็นส่วนหนึ่งของอินเทอร์เฟซแบบแท็บ) - person Dunnow; 16.02.2013
comment
อืม ฉันหมดคำพูดจริงๆ ดูเหมือนว่าทั้งหมดจะถูกต้อง :/ - person Brent Hronik; 17.02.2013
comment
อ่า น่าจะขอดูเค้าโครงของรายการด้วย จับได้ดี! - person Brent Hronik; 19.02.2013
comment
ที่จริงแล้ว คุณทำไปแล้ว ประเด็นก็คือฉันไม่ได้โพสต์มันด้วยซ้ำเพราะคิดว่ามันไม่สำคัญด้วยซ้ำ (ไม่เคยมีรายการที่สามารถโฟกัสได้มาก่อน ดังนั้น... ฉันแค่คิดว่ามันถูกต้องเช่นกัน) - person Dunnow; 19.02.2013

หากคุณต้องการส่งข้อมูลจากแฟรกเมนต์ไปยังกิจกรรมใดๆ บน Listview ให้คลิก คุณสามารถแก้ไขโค้ดของคุณได้ เช่น...

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
หากคุณใส่สิ่งนี้บน onStart() มันจะถูกเรียกทุกครั้งที่เรียกใช้ onStart - person Mohit Rajput; 14.09.2020

ปุ่มจะส่งผลต่อผู้ฟัง พยายามหลีกเลี่ยงการใช้ปุ่มและคอมไพล์ใหม่ น่าจะใช้งานได้

person user9402274    schedule 06.01.2019

person    schedule
comment
พยายามอย่างนั้น... ไม่ทำงานในส่วนย่อยอย่างที่ฉันพูดไปแล้ว - person Dunnow; 16.02.2013
comment
มันทำให้ฉันมีข้อผิดพลาดหากฉันรันโค้ดนี้ภายในเมธอด onCreate เปิดตัวการดีบักก่อนที่กิจกรรมของฉันจะเริ่มต้นด้วยซ้ำ :S และถ้าฉันตั้งค่าตัวอย่างนี้บนตัวหลักเอง มันจะทำเครื่องหมายการประกาศและ lv=(ListView) ได้รับ .. . เป็นเส้นผิด. - person Dunnow; 19.02.2013
comment
@Dunnow คุณสามารถเพิ่มเป็นคำตอบหรือยอมรับหนึ่งในคำตอบได้ที่นี่ - person Dheeraj Bhaskar; 21.02.2013
comment
ฉันได้แก้ไขโพสต์แรกเพื่อสะท้อนถึงวิธีการแก้ไข แต่ฉันจะทำเครื่องหมายของคุณเป็นคำตอบ ฉันเดาว่าเนื่องจากมันยังคงถูกต้องที่จะทำกับโค้ดนั้น ปัญหาไม่ได้อยู่ที่นั่น แต่ใน XML u_u - person Dunnow; 22.02.2013
comment
@Dunnow หากคุณใส่โค้ดนี้ลงในโค้ด onViewCreated ภายในคลาสแฟรกเมนต์ของคุณ (คลาสที่ขยาย Fragment) มันจะทำงานได้ดีตราบใดที่คุณเริ่มต้น ListView (lv = (ListView)view.findViewById(R.id. ของคุณเลเวล);) - person whyoz; 14.05.2013
comment
@DheerajBhaskar ฉันมีปัญหาที่คล้ายกัน คุณช่วยฉันแก้ปัญหาได้ไหม? มันโพสต์ไว้ที่นี่ stackoverflow.com/ คำถาม/42542056/ - person Sulav Timsina; 02.03.2017
comment
@SulavTimsina ให้ฉันดู - person Dheeraj Bhaskar; 03.03.2017