LoaderManager พร้อมรถตักหลายตัว: วิธีรับเคอร์เซอร์ที่ถูกต้อง


116

สำหรับฉันมันไม่ชัดเจนว่าจะรับเคอร์เซอร์ที่ถูกต้องได้อย่างไรหากคุณมีรถตักหลายตัว สมมติว่าคุณกำหนด Loader สองแบบด้วย:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

จากนั้นในonCreateLoader ()คุณจะทำสิ่งต่าง ๆ ขึ้นอยู่กับ id:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

จนถึงตอนนี้ดีมาก แต่จะทำอย่างไรให้เคอร์เซอร์ถูกต้องในonLoadFinished ()เพราะคุณไม่ได้รับ id ใด ๆ เพื่อระบุเคอร์เซอร์ที่ถูกต้องสำหรับ Cursoradapter ที่ถูกต้อง

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

หรือฉันคิดผิดและนี่เป็นวิธีที่ผิดในการรับผลลัพธ์ของเคอร์เซอร์สองตัวที่แตกต่างกันในส่วนเดียว


นี่เป็นคำถามที่ดีจริงๆ! เป็นเรื่องที่ถามได้ดีและให้ความสำคัญกับเรื่องที่ค่อนข้างเหมาะสม เฉพาะเจาะจงมาก
Kurtis Nusbaum

7
ควรระบุว่าคุณต้องใช้คลาสตัวจัดการแยกต่างหากเมื่อใดก็ตามที่ประเภทการส่งคืนของตัวโหลดไม่เหมือนกันในตัวโหลดทั้งหมดเนื่องจากการลบประเภททั่วไป Java ไม่อนุญาตให้คุณใช้อินเทอร์เฟซ ( LoaderCallbacksในกรณีนี้) กับมากกว่าหนึ่ง ชนิด มันใช้ได้ในกรณีของคุณทั้งสองครั้งผลลัพธ์คือ a Cursor.
Matthias

1
@Matthias Great คุณพูดถึงมัน! ฉันกำลังพิจารณาว่าจะมีรถตัก 2 คันที่มีประเภทผลตอบแทนต่างกันอย่างไร แล้วจะเกิดอะไรขึ้นถ้ารถตัก 2 คันที่มีผลตอบแทน 2 ประเภท? ทำงานหนึ่งกับตัวโหลด 1 ตัวและอีกตัวใช้เธรดแทนหรือไม่?
Robert

@ โรเบิร์ตไม่ต้องใช้ด้าย คุณอาจใช้สองLoaderวินาที โปรดอ่านstackoverflow.com/a/20839825/2818583
AnV

คำตอบ:


119

ชั้นพับมีวิธีการที่เรียกgetId () ฉันหวังว่านี่จะส่งคืน ID ที่คุณเชื่อมโยงกับตัวโหลด


ขอบคุณ Kurtis! เย็น! ฉันจะลอง แต่คาดว่ามันจะได้ผล ฉันมีความคิดเดียวกัน แต่ไม่ได้มองไปที่วัตถุตัวโหลด ได้ดูที่วัตถุเคอร์เซอร์แทน ...
Kay Gladen

ใช้งานได้กับ Loader.getID ()! ฉันตรวจสอบสิ่งนี้ซ้ำแล้วในขณะนี้ ที่ดี!
Kay Gladen

2
ฉันกำลังคิดที่จะทำสิ่งนี้โดยใช้คลาสภายใน / ไม่ระบุตัวตนเพื่อให้ตัวโหลดแต่ละตัวมีอ็อบเจ็กต์ของตัวเองในการเรียกกลับ
Jords

@KurtisNusbaum ทำไมถึงไม่ถูกต้อง? ชั้นในจะถูกทำลายไปพร้อมกับกิจกรรมภายนอกดังนั้นจึงไม่ควรส่งผลให้หน่วยความจำรั่วไหลหรืออะไรก็ตาม คลาสแบบคงที่ที่มีการอ้างอิงที่ชัดเจนถึงกิจกรรมนั้นมีความหมายเทียบเท่ากับคลาสภายใน (ซึ่งเก็บการอ้างอิงที่ชัดเจนโดยปริยายไปยังคลาสชั้นนอก)
Matthias

6
@ Jords มันถูกต้องในทางเทคนิค ฉันไม่ได้ถกเถียงเรื่องนี้ แต่ทำไม rigamarole ทั้งหมดนั้นเมื่อคุณสามารถโทรได้getId()?
Kurtis Nusbaum

32

ใช้เมธอด getId ()ของ Loader:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

หากรถตักของคุณไม่มีอะไรเหมือนกัน แต่เป็นประเภทคลาสของผลลัพธ์ (ที่นี่ :) Cursorคุณควรสร้างสองแบบแยกกันLoaderCallbacksอินสแตนซ์อินสแตนซ์ (เป็นคลาสภายในสองคลาสในกิจกรรม / แฟรกเมนต์ของคุณ) แต่ละคลาสจะทุ่มเทให้กับการรักษาตัวโหลดหนึ่งตัวแทนที่จะเป็น มากกว่าการพยายามผสมแอปเปิ้ลกับส้ม

ในกรณีของคุณดูเหมือนว่าทั้งแหล่งข้อมูลและการรักษาผลลัพธ์จะแตกต่างกันซึ่งคุณต้องเขียนโค้ดสำเร็จรูปเพิ่มเติมเพื่อระบุสถานการณ์ปัจจุบันและส่งไปยังบล็อกรหัสที่เหมาะสม


ฉันมีหนึ่งคำถาม. วัตถุประสงค์ของActivityการดำเนินการLoaderCallbacksและผ่านthisไปgetLoaderManager().initLoader()เพื่อให้แน่ใจว่าLoaderManagerการกระทำที่เป็นช่องทางในการสื่อสารระหว่างActivityและผ่านLoader LoaderCallbacksช่องทางการสื่อสารนั้นถูกสร้างขึ้นที่นี่อย่างไรเนื่องจากActivityไม่ได้ใช้งานLoaderCallbacksแต่เป็นการสร้างคลาสภายในที่ไม่ระบุชื่อ
AnV

3
ช่องทางการสื่อสารคือLoaderCallbacks. ไม่มีอะไรที่จะต้องใช้ตัวเองเป็นActivity LoaderCallbacksง่ายกว่าในการสร้างช่องทางการสื่อสารหลายช่องเมื่อคุณต้องการ
BladeCoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.