2017-02-05 5 views
0

В моей работе реализуется интерфейс MyInterface, который имеет метод getList. Этот метод захватывает массивList объектов и возвращает его в конце. Я пытаюсь получить доступ к переменной в другом фрагменте и изо всех сил стараюсь это сделать. Я изучил связывание, намерения, parcelables и использовал текущий интерфейс. Как получить доступ к переменной в моем фрагменте?Передача переменной из Activity в Fragment

Ниже мой метод GetList, который возвращает объект ArrayLists под названием arrayListAndroidContacts

public ArrayList<Android_Contact> getList() { 
     ArrayList<Android_Contact> arrayListAndroidContacts = new ArrayList<Android_Contact>(); 

     //--< get all Contacts >-- 
     Cursor cursor_Android_Contacts = null; 
     ContentResolver contentResolver = getContentResolver(); 
     try { 
      cursor_Android_Contacts = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
     } catch (
       Exception ex 
       ) 
     { 
      Log.e("Error on contact", ex.getMessage()); 
     } 
     if (cursor_Android_Contacts.getCount() > 0) 

     { 
//----< has Contacts >---- 
//----< @Loop: all Contacts >---- 
      while (cursor_Android_Contacts.moveToNext()) { 
//<init> 
       Android_Contact android_contact = new Android_Contact(); 
       String contact_id = cursor_Android_Contacts.getString(cursor_Android_Contacts.getColumnIndex(ContactsContract.Contacts._ID)); 
       String contact_display_name = cursor_Android_Contacts.getString(cursor_Android_Contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
//</ init > 

//----<set>---- 
       android_contact.android_contact_Name = contact_display_name; 


//----< get phone number >---- 
       int hasPhoneNumber = Integer.parseInt(cursor_Android_Contacts.getString(cursor_Android_Contacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); 
       if (hasPhoneNumber > 0) { 

        Cursor phoneCursor = contentResolver.query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI 
          , null 
          , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" 
          , new String[]{contact_id} 
          , null); 

        while (phoneCursor.moveToNext()) { 
         String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
//<set> 
         android_contact.android_contact_TelefonNr = phoneNumber; 
//</ set > 
        } 
        phoneCursor.close(); 
       } 

       arrayListAndroidContacts.add(android_contact); 

      } 


      Collections.reverse(arrayListAndroidContacts); 

      Adapter_for_Android_Contacts adapter = new Adapter_for_Android_Contacts(this, arrayListAndroidContacts); 

      ListView listView_Android_Contacts = (ListView) findViewById(R.id.listview_Android_Contacts); 

      listView_Android_Contacts.setAdapter(adapter); 

     } 
     return arrayListAndroidContacts; 
    } 

Это мой фрагмент, который в настоящее время содержит мой экземпляр интерфейса, мой адаптер для ListView и призыв к значение arrayListAndroidContacts

public class Tab1Recents extends Fragment { 
    MyInterface myInterface; 

    public static final String MESSAGE_KEY = "message_key"; 

    public void onAttach(MainActivity activity) { 
     super.onAttach(activity); 
     try { 
      myInterface = (MyInterface) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement onViewSelected"); 
     } 
    } 




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


     Adapter_for_Android_Contacts adapter = new Adapter_for_Android_Contacts(this, arrayListAndroidContacts); 

     View rootView = inflater.inflate(R.layout.tab1_recent, container, false); 

     ListView recentContacts = (ListView) rootView.findViewById(R.id.recent_Android_Contacts); 

     recentContacts.setAdapter(adapter); 

     return rootView; 
    } 

    public class Adapter_for_Android_Contacts extends BaseAdapter { 

     Context mContext; 
     List<MainActivity.Android_Contact> mList_Android_Contacts; 

     //< constructor with ListArray > 
     public Adapter_for_Android_Contacts(Context mContext, List<MainActivity.Android_Contact> mContact) { 
      this.mContext = mContext; 
      this.mList_Android_Contacts = mContact; 
     } 

     public int getCount() { 
      return mList_Android_Contacts.size(); 
     } 

     public Object getItem(int position) { 
      return mList_Android_Contacts.get(position); 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = View.inflate(mContext, R.layout.contactlist_android_items, null); 
      TextView textview_contact_Name = (TextView) view.findViewById(R.id.textview_android_contact_name); 
      textview_contact_Name.setText(mList_Android_Contacts.get(position).android_contact_Name); 
      view.setTag(mList_Android_Contacts.get(position).android_contact_Name); 
      return view; 
     } 
    } 

} 
+0

Один из способов - сохранить список в базе данных SQLite. –

+0

@ Code-Apprentice в конечном счете, я подозреваю, что это лучший маршрут. Любые руководства или руководства о том, как использовать это в рамках Android/Java? – NVA

+0

Почему бы вам не поставить список в аргумент при создании фрагмента? Вы используете этот список в методе onCreateView, вы не должны вызывать getList() в методе, потому что запрос данных должен быть в рабочем потоке. – AssIstne

ответ

0

Во-первых, вы используете ContentResolver для запроса, так getList() следует вызывать в потоке, отличном от UI (так что создание адаптера и обновление для ListView не должно быть в этом методе.

Затем вы можете запустить асинхронный поток/задачу/службу, чтобы вызывать getList() из активности или фрагмента.

Раз arrayListAndroidContacts приходит, вы можете использовать View.post(Runnable) размещать операцию пользовательского интерфейса (создать адаптер и обновления ListView), или использовать BroadcastReceiver или использовать EventBus. Выберите тот, который вы предпочитаете.

+0

Я попытался добавить весь метод getList к моему фрагменту, однако ContentResolver не знаком, хотя у меня есть необходимое использование staements. Знаю, почему? – NVA