Множество массивов Android ListView с пользовательским адаптером

Я вытащил пару json-массивов из БД, это массивы (Name = список имен, адрес = список целых чисел) и размещены в DialerFragment:

String[] contactNameArray= LoginHandler.getMyName(); String[] contactAddressArray= LoginHandler.getMyContactsAddress(); ListAdapter contactadapter = new ContactsAdapter(getActivity(), contactNameArray); ListView contactsListView = (ListView) view.findViewById(R.id.contact_list); contactsListView.setAdapter(contactadapter); 

Вот мой ContactsAdapter:

 public class ContactsAdapter extends ArrayAdapter<String>{ private static final String TAG = "ContactsListAdapter"; public ContactsAdapter(Context context, String[] values){ super(context, R.layout.contact_row_layout, values); } @Override public View getView(int position, View convertView, ViewGroup parent){ Log.d(TAG, "getView"); // The LayoutInflator puts a layout into the right View LayoutInflater inflater = LayoutInflater.from(getContext()); // inflate takes the resource to load, the parent that the resource may be // loaded into and true or false if we are loading into a parent view. View view = inflater.inflate(R.layout.contact_row_layout, parent, false); // We retrieve the text from the array String contact = getItem(position); // Get the TextView we want to edit TextView mContactName = (TextView)view.findViewById(R.id.contact_name); view.findViewById(R.id.contacts_avatar); // Put the next TV Show into the TextView mContactName.setText(contact); return view; }} 

Кроме того, в моем DialerFragment у меня есть этот код:

 private final View.OnClickListener mOnMakeCallClick = new OnClickListener(){ public void onClick(final View view){ String numberToCall = "2"; if (!TextUtils.isEmpty(numberToCall)){ mCallWithVideo = view.getId() == R.id.contact_videocall; Log.d(TAG, "make call clicked: " + numberToCall + ", video=" + (mCallWithVideo ? "true" : "false")); mCallInitiated = ((Main)getActivity()).makeCall(numberToCall, mCallWithVideo); mTelNumberView.setText(""); } } }; 

У меня есть ListView (fragment_dialer.xml) и шаблон строки (contact_row_layout.xml).

Код в настоящее время работает без ошибок, заполняя ListView контактами, которые у меня есть в моей БД.

Проблема: мне нужно динамически вызывать контакты в зависимости от того, на какой клик был выбран ImageButton. Т.е. Как мне сопоставить 1 массив имен с 1 массивом адресов, а затем передать этот адрес в OnCallClick для инициирования вызова? Было бы неплохо, если бы я мог присвоить ImageButton значение (как вы бы сделали что-то подобное в PHP), а затем назовите это «значение» в файле contactsadapter.

Я действительно очень зациклен на этом, любая помощь будет очень признательна. Также я совершенно новый для Android.

Решение: DialerFragment:

 ListView contactsListView = (ListView) view.findViewById(R.id.contact_list); contactsListView.setAdapter(new ContactsBaseAdapter(getActivity())); 

Затем мой класс «одна строка»:

 class SingleRow{ String name; String address; SingleRow(String name, String address){ this.name=name; this.address=address; }} 

Затем мой «базовый адаптер контактов»:

 public class ContactsBaseAdapter extends BaseAdapter{ private static final String TAG = "CONTACTS_BASE_ADAPTER"; ArrayList<SingleRow> list; Context context; ContactsBaseAdapter(Context c){ list = new ArrayList<SingleRow>(); context = c; String[] contactNameArray= LoginHandler.getMyName(); String[] contactAddressArray= LoginHandler.getMyContactsAddress(); for(int i= 0; i< contactNameArray.length; i++){ list.add(new SingleRow(contactNameArray[i], contactAddressArray[i])); } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View row = inflater.inflate(R.layout.contact_row_layout,parent, false); ImageView mContactPresence = (ImageView)row.findViewById(R.id.contacts_avatar); TextView mContactName = (TextView)row.findViewById(R.id.contact_name); TextView mContactAddress = (TextView)row.findViewById(R.id.contact_number); SingleRow contactrow = list.get(i); mContactName.setText(contactrow.name); mContactAddress.setText(contactrow.address); Drawable drawable = null; mContactPresence.setImageDrawable(drawable); return row; }} 

Примечания: Вы были правы, спасибо. Моя проблема заключалась в том, что я был совершенно новым для такого рода программирования. Раньше я делал OOP, но только на PHP и не знал, как манипулировать данными, подобными данным в android. Большие пальцы всех, кто указал мне в правильном направлении, я многому научился! Кроме того, вы нашли этот плейлист с YouTube, который помог мне понять множество основ списков и адаптеров и т. Д.

Далее: я буду искать ViewHolders и RecyclerViews для оптимизации кода :). И передавать данные в обработчик вызова вместе с присутствием !!

Таким образом, создайте объект с именем Contact, добавьте его атрибуты, после этого в макете адаптера добавьте нужные текстовые элементы и просто вызовите их при установке номера, имени и т. Д. Посмотрите ниже.

Public class ContactsAdapter extends ArrayAdapter {private static final String TAG = "ContactsListAdapter";

 public ContactsAdapter(Context context, String[] values){ super(context, R.layout.contact_row_layout, values); } @Override public View getView(int position, View convertView, ViewGroup parent){ Log.d(TAG, "getView"); // The LayoutInflator puts a layout into the right View LayoutInflater inflater = LayoutInflater.from(getContext()); // inflate takes the resource to load, the parent that the resource may be // loaded into and true or false if we are loading into a parent view. View view = inflater.inflate(R.layout.contact_row_layout, parent, false); // We retrieve the text from the array // Get the TextView we want to edit //Create more textviews for showing desired atributes TextView mContactName = (TextView)view.findViewById(R.id.contact_name); TextView mContactNumber = (TextView) view.findViewById(R.id.contact_number); view.findViewById(R.id.contacts_avatar); //Create object contact that will have name, number, etc atributes... Contact contact = getItem(position); // Put the next TV Show into the TextView mContactName.setText(contact.getName()); mContactNumber.setText(contact.getNumber()); return view; 

Я бы рекомендовал создать новый массив нового объекта (Contact), который вы будете заполнять из существующих массивов contactNameArray & contactAddressArray.

  Contact { public String name; public String address; } 

Вы должны передать этот массив в ContactAdapter.

В вашей реализации AdapterView.onItemClick вы просто вызываете

  contactadapter.getItem(position); 

Чтобы получить контактный объект, связанный с нажатой строкой.

В качестве дополнительной заметки я настоятельно рекомендую использовать статический шаблон ViewHolder в вашем getView ( https://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html ).