में LoaderManager में दो Cursors और CursorJoiner उपयोग करने के लिए मैं एक ContentProvider
है, यह दो तालिकाओं 1. OnlineContacts
2. AllContacts
होने है। तब मेरे पास एक तरीका है जिसमें मैं दोनों टेबलों से पूछताछ कर रहा हूं और उनके परिणामस्वरूप cursors
अलग-अलग प्राप्त कर रहा हूं। और फिर वहाँ मिलती CursorJoiner
का उपयोग करने और Contacts
की एक सूची बना रही है। इस सूची को मेरे CustomAdapter extending BaseAdapter
पर पास करना, मैं अपना listview
पॉप्युलेट कर रहा हूं। जैसा:कैसे एंड्रॉयड
public static List<Contact> getContacts(Context context){
List<Contact> contactList = new ArrayList<Contact>();
// Getting First Cursor
String URL = xyz;
Uri baseUri1 = Uri.parse(URL);
String[] select = xyz;
String where =xyz;
Cursor cursor = context.getContentResolver().query(baseUri1, select, where, null, "pid");
// Getting 2nd Cursor
Uri baseUri = xyz;
String[] projection =xyz;
String selection =xyz;
String[] selectionArgs = null;
String sortOrder = xyz;
Cursor mCursor= context.getContentResolver().query(baseUri, projection, selection, selectionArgs, sortOrder);
// Joinging Both Cursors
CursorJoiner joiner = new CursorJoiner(cursor, new String[] {MyContentProvider.PHONE_ID} , mCursor, new String[] {MyContentProvider.Phone._ID});
for (CursorJoiner.Result joinerResult : joiner) {
Contact cont = new Contact();
switch (joinerResult) {
case LEFT:
// handle case where a row in cursorA is unique
break;
case RIGHT:
// handle case where a row in cursorB is unique
case BOTH:
// handle case where a row with the same key is in both cursors
cont.setID(xyz);
cont.setName(xyz);
cont.setPhoneNumber(xyz);
cont.setStatus("0");
contactList.add(cont);
break;
}
}
mCursor.close();
cursor.close();
return contactList;
}
और यहाँ मेरी CustomAdapter है:
private class CustomAdapter extends BaseAdapter {
List<Contact> contactsList ;
public CustomAdapter(List<Contact> contactsList){
this.contactsList = contactsList;
}
public List<Contact> contacts() {
return this.contactsList;
}
@Override
public int getCount() {
return contactsList.size();
}
@Override
public Contact getItem(int arg0) {
return contactsList.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
SimpleViewHolder viewHolder;
if(view==null)
{
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, viewGroup,false);
viewHolder = new SimpleViewHolder(view);
view.setTag(viewHolder);
}
viewHolder = (SimpleViewHolder) view.getTag();
TextView contName = (TextView) viewHolder.get(R.id.nameText);
ImageView image = (ImageView) viewHolder.get(R.id.contact_image);
Contact contact = contactsList.get(position);
image.setBackgroundResource(R.drawable.person_empty_offline);
contName.setText(contact.getName());
return view;
}
}
अब, मैं LoaderManager
का उपयोग कर यह करने के लिए की जरूरत है। मुझे पता है, कुछ हद तक, इसका कार्यान्वयन। मैं जानता हूँ कि, onCreateLoader
कृत्यों की तरह:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = xyz;
String[] projection = xyz;
String selection = xyz;
String[] selectionArgs = null;
String sortOrder = xyz;
return new CursorLoader(getActivity(), baseUri, projection, selection, selectionArgs, sortOrder);
}
और OnCreate
में, अगर मैं MyCursorAdapter extending CursorAdapter
उपयोग करें, हम कुछ ऐसा कार्य करें:
mAdapter = new MyCursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
अब, मैं क्या करने की जरूरत है कि कैसे कर सकते हैं मैं LoaderManager
का उपयोग कर उपरोक्त कार्यान्वयन को प्राप्त करें। मुझे नहीं पता था कि यह कैसे पूछना है कि यह भी व्याख्यात्मक क्यों है।
आप या तो दो अलग-अलग प्रश्नों बनाने के लिए दो लोडर इस्तेमाल कर सकते हैं और फिर परिणामों में शामिल होने के (इस https://gist.github.com/luksprog/7ec8cd3fcdea97b5839c जाँच) या आप 'ContentProvider' में शामिल होने को लागू स्तर और शामिल होने के परिणामों से 'MatrixCursor' वापस करें। – Luksprog