2016-12-27 4 views
0

Я изо всех сил стараюсь получить больше, чем просто одно значение из списка, созданного на заказ.
Я могу получить «основное» значение из этого благодаря getItem(int pos), но так как я храню несколько значений для одной строки (строка означает каждый CustomList в TableView), я хотел бы иметь возможность получить соответствующие значения на ярлык, который я могу вытащить.Получите пользовательские друзья ListView из класса, расширяющего ArrayAdapter

Я уверен, что это проще, чем я это делаю, поэтому я надеюсь, что кто-то это сделал раньше.

У меня CustomList класса,

public class CustomList extends ArrayAdapter<String>{ 

    private final Activity context; 
    private final String[] labels; 
    private final Integer[] imageId; 
    private final String[] identifier; 
    public CustomList(Activity context, 
         String[] labels, Integer[] imageId, String[] id) { 
     super(context, R.layout.list_single, labels); 
     this.context = context; 
     this.labels = labels; 
     this.imageId = imageId; 
     this.identifier = id; 

    } 
    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView= inflater.inflate(R.layout.list_single, null, true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) rowView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 

     txtTitle.setText(labels[position]); 
     idTitle.setText(identifier[position]); 
     imageView.setImageResource(imageId[position]); 

     return rowView; 
    } 

    public String getKey(int position, int category) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView= inflater.inflate(R.layout.list_single, null, true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) rowView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 

     if (category == 1) { 
      return idTitle.getText().toString(); 
     } else if (category == 2) { 
      return "url:();"; 
     } else { 
      return this.getItem(position); 
     } 
    } 
} 

Примечания: getKey измученная, последняя попытка получения значений из этого ListView/CustomList данных.
Я не могу, потому что любовь к ней вызывает эту функцию любым способом, формой или формой.

Вот как я использую этот CustomList,

CustomList adapter = new 
        CustomList(MainActivity.this, urls, images, identifiers); 
list=(ListView)findViewById(R.id.listView1); 
list.setAdapter(adapter); 

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

(Это где я сталкиваюсь в виду попойки)

list=(ListView)findViewById(R.id.listView1); 
ListView listView = (ListView)findViewById(R.id.listView1); 
ListAdapter table = listView.getAdapter(); 

for(int i = 0; i < table.getCount(); i++){ 
    Object row = table.getItem(i); 
    Log.i("Test", row.toString()); 
} 

Что я выберусь это значение CustomList.labels[i], что не все нечетные поскольку я предполагаю, что это вызывает getItem из ArrayAdapter.

Я пробовал делать @Override на getItem, но так как требуется только один аргумент, то есть position, я не был достаточно знаком с Java, чтобы заставить это работать для меня.

Любая идея, как я мог бы получить либо переменные imageId, либо identifier от каждого элемента строки listView1?

В случае если вам нужен list_single.xml, который является расположение listView1 (по крайней мере, это моя интерпретация того, что делает этот файл), здесь:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <TableRow> 
     <ImageView 
      android:id="@+id/img" 
      android:layout_width="50dp" 
      android:layout_height="50dp"/> 

     <TextView 
      android:id="@+id/identifier" 
      android:layout_width="wrap_content" 
      android:visibility="invisible" 
      android:layout_height="50dp" /> 

     <TextView 
      android:id="@+id/txt" 
      android:layout_width="wrap_content" 
      android:layout_height="50dp" /> 

    </TableRow> 
</TableLayout> 

ответ

1

В этом случае BaseAdapter является лучшим выбором, чем ArrayAdapter ,

Вы можете создать свою модель домена с тремя полями в вашем случае, определить массив этих моделей внутри адаптера и вернуть их из getItem.

Пример реализации: https://guides.codepath.com/android/Using-a-BaseAdapter-with-ListView

В вашем случае это будет что-то вроде этого

public class CustomListAdapter extends BaseAdapter { 

    public class DataObject { 
     private final String label; 
     private final Integer imageId; 
     private final String identifier; 

     public DataObject() {} 

     public DataObject(String label, Integer imageId, String identifier) { 
      this.label = label; 
      this.imageId = imageId; 
      this.identifier = identifier; 
     } 

     public String getLabel() { 
      return label; 
     } 

     public Integer getImageId() { 
      return imageId; 
     } 

     public String getIdentifier() { 
      return identifier; 
     } 
    } 


    private Context context; //context 
    private ArrayList<DataObject> items; //data source of the list adapter 

    //public constructor 
    public CustomListAdapter(Context context, ArrayList<DataObject> items) { 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); //returns total of items in the list 
    } 

    @Override 
    public DataObject getItem(int position) { 
     return items.get(position); //returns list item at the specified position 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // inflate the layout for each list row 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context). 
        inflate(R.layout.list_single, parent, false); 
     } 

     // get current item to be displayed 
     DataObject currentItem = getItem(position); 

     // get the TextView for item name and item description 
     TextView txtTitle = (TextView) convertView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) convertView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) convertView.findViewById(R.id.img); 

     //sets the text for item name and item description from the current item object 
     txtTitle.setText(currentItem.label); 
     idTitle.setText(currentItem.identifier); 
     imageView.setImageResource(currentItem.imageId); 

     // returns the view for the current row 
     return convertView; 
    } 
} 

UPDATE:

Если вы все еще хотите построить адаптер от 3-х массивов, которые можно использовать дополнительный конструктор, подобный этому. Но, может быть, лучше изменить что-то в модели данных.

public CustomList(Activity context, 
        String[] labels, Integer[] imageId, String[] id) { 
    this.context = context; 
    this.items = new ArrayList(labels.length); 

    for (int i = 0; i < labels.length; i++) { 
     this.items.add(new DataObject(labels[i], imageId[i], id[i])); 
    } 
} 
+0

Вы можете улучшить это решение, используя ViewHolder шаблон https://developer.android.com/training/improving-layouts/smooth-scrolling.html# ViewHolder или RecyclerView –

+0

Буквально через минуту после того, как я задал глупый вопрос, я понял это. Вероятно, это очень важно для настройки этого параметра, но вот как я это сделал: 'ArrayList itemsArrayList = new ArrayList (); CustomListAdapter moo = новый CustomListAdapter (MainActivity.this, itemsArrayList); moo.getItem (0) .getLabel(); '- В случае, если кто-то задается вопросом. – Torxed

+0

Ok нет, я до сих пор не знаю, как инициализировать это с помощью фактических значений ... Как/Где я, например, поместил свои первые 'String [] метки? – Torxed

0

Java - это объект, ориентированный. Сделайте объекты.

class DataObject { 
    private final String label; 
    private final Integer imageId; 
    private final String identifier; 

    public DataObject() {} 
} 

Использование public class CustomList extends ArrayAdapter<DataObject>{

Вы можете дополнительно хранить DataObject[] или лучше List<DataObject>, но теперь GetItem может возвращать весь объект, который затем вы получаете данные из этого.

Вы можете использовать adapter.add для добавления данных непосредственно к адаптеру/ListView

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

  • Нет связанных вопросов^_^