2015-09-05 5 views
0

Я изучаю Программирование для Android. У Activity есть ListView, в котором каждый элемент является только TextView. Этот ListView заполняется пользовательским адаптером, который выполняет итерацию через ArrayList cRecord и устанавливает соответствующий текст для каждого TextView. Этот класс cRecord имеет много «полей» (участников), например. имя человека, номер телефона ... но только имя человека отображается в ListView. Теперь, когда пользователь нажимает на ListView, чтобы выбрать человека, как мы можем добраться до исходного объекта типа cRecord, соответствующего этому человеку?Когда пользователь выбирает элемент ListView, как найти базовый объект?

+0

в вашем слушателем, вы позиция, это объясняется в док. адаптер поддерживается списком 'cRecord', поэтому у вас это есть. объединение не должно быть слишком сложным – njzk2

+0

njzk2 Но может быть, что не все объекты всего массива ArrayList имеют аналог в ListView. – AlwaysLearning

+0

Что вы подразумеваете под этим? Вы заполняете Listview, предоставляя ему Arraylist объектов.Когда пользователь нажимает на 5-й объект в списке, вы просматриваете 5-й объект в Arraylist. – poss

ответ

0

Я попытался решить это, построив прототип требования.

Я предполагал этот как ваш класс cRecord:

public class cRecord{ 
    String name; 
    String phoneNo; 

    //GETTERS AND SETTERS IF ANY 
    //METHOD IMPLEMENTATIONS IF ANY 

} 

Вы можете иметь метод GetObject в своей деятельности, которая будет возвращать объект из списка cRecord, который вы используете для заполнения ListAdapter:

public cRecord getObject(String name){ 
    forech(cRecord c : listcRecord){ 
     if(c.name == name){ 
      return c; 
     } 
    } 
    return null; 
} 

И, наконец, в OnListItemClicked слушателем вашего ListView, вы можете получить щелкнул объект вроде этого:

ListView lv = (ListView)findViewById(R.id.listView1); 
    lv.setAdapter(new ArrayAdapter<Country>(
      this,R.layout.list_black_text,R.id.list_content, values)); //values is the list holding objects of cRecord and R.id.list_content is the textview which you are using in your list to show the name. 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
      TextView textView = (TextView) view.findViewById(R.id.list_content); 
      String text = textView.getText().toString(); //Getting the text of view being clicked. 
      cRecord clickedObject = getObject(text); //Calling your getObject method here. 
    Toast.makeText(this,"phoneNo of " + clickedObject.phoneNo, Toast.LENGTH_SHORT).show(); 
    }}); 

Если это не поможет, вы можете указать свой собственный код, чтобы вопрос был немного более ясным.

+0

Вы понимаете, что если это работает, это случайно? ('listcRecord.get (position)' будет более безопасным) – njzk2

+0

Да. Получение требуемого объекта может осуществляться тысячами способов. Я просто показал простой, например, поиск и извлечение. –

+0

Я имею в виду, что 'if (c.name == name) {' скорее всего, не будет работать во многих случаях. это не то, как вы сравниваете строки. – njzk2

0

Сначала вам необходимо установить OnItemClickListener callback Object, используя метод ListView setOnItemClickListener(AdapterView.OnItemClickListener listener).

OnItemClickListener является Интерфейс пользователя одним способом: onItemClick(AdapterView the_list, View view_clicked, int position_of_view_clicked, long id);

Если вы используете пользовательский Adapter, предоставленный идентификатор будет возвращен методом Adapter#getItemId(int position).

Кроме того, вы можете настроить пользовательский адаптер getItem(int position), чтобы вернуть определенный объект. Этот объект будет доступен в объекте обратного вызова OnItemClickListener через AdapterView#getItemAtPosition(int position).

Примером может быть:

Определение функции обратного вызова

import android.widget.AdapterView; 
... 

public class ... { 
    class ListCallback implements AdapterView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> list, View list_element, int position, long id) { 
     // Operations to access the appropriate record and show it 
     // To get the Adapter#getItem(int) result, use 
     // ObjectClass a = (ObjectClass) list.getItemAtPosition(position) 
    } 
    } 
} 

Установка Обратный вызов

import android.widget.ListView; 

... 

public class ... { 
    private ListView the_list; 

    /* method where the list is managed() */ 
    the_list = (ListView) findViewById(R.id.list_id); 
    the_list.setOnItemClickListener(new ListCallBack()); 

} 

Обратите внимание, что обратный вызов объекта является стандартом объекта.

Вы можете также определить объект обратного вызова в одном кадре, как это:

import android.widget.AdapterView; 
import android.widget.ListView; 
... 

public class ... { 
    private ListView the_list; 

    /* method where the list is managed() */ 
    the_list = (ListView) findViewById(R.id.list_id); 
    the_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> list, View list_element, int position, long id) { 
     // Operations to access the appropriate record and show it 
     // To get the Adapter#getItem(int) result, use 
     // ObjectClass a = (ObjectClass) list.getItemAtPosition(position) 
    }); 

} 
Смежные вопросы