Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/37: Рейтинг темы: голосов - 37, средняя оценка - 4.84
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89

Собственный ArrayAdapter

24.08.2011, 17:34. Показов 7013. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового типа:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
     
titles = new ArrayList<String>(messages.size());
...
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, R.layout.row_extended, titles);
this.setListAdapter(myAdapter);
...
public class myAdapter extends BaseAdapter 
     {
        private LayoutInflater mLayoutInflater;  
 
        public myAdapter (Context ctx) 
        {  
            mLayoutInflater = LayoutInflater.from(ctx);  
        }  
                  
        public int getCount ()
        {  
            return titles.size();  
        }  
                  
        public Object getItem (int position) 
        {  
            return position;  
        }  
                  
        public long getItemId (int position) 
        {  
            return position;  
        }
        
        public String getString (int position) 
        {  
            String sOne = titles.get(position);
            return sOne;
        }  
                  
        public View getView(int position, View convertView, ViewGroup parent) 
        {   
            String sTwo = titles.get(position);
            
            if (convertView == null)  
                convertView = mLayoutInflater.inflate(R.layout.row_extended, null);  
                       
            TextView sign = (TextView)convertView.findViewById(R.id.row_title);  
            
            sign.setText(sTwo);  
          
            TextView date = (TextView)convertView.findViewById(R.id.row_date);  
            date.setText(sTwo.substring(5));  
            
            return convertView;  
         }       
     }
R.layout.row_extended:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView 
        android:text="TextView" 
        android:id="@+id/row_title"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textStyle="bold">
    </TextView>
    
    <TextView 
        android:text="TextView" 
        android:id="@+id/row_date"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </TextView>
    
</LinearLayout>
Всякий раз получаю ошибку
Code
1
08-24 10:13:07.800: ERROR/AndroidRuntime(398): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
Видимо, проблема в том, что на моем R.layout.row_extended содержится не только стандартный для базового адаптера TextView, но и еще один тексвью, при том оба помещены на вертикальный LinnearLayout. Как "научить" мой адаптер работать с двумя текствью, есть идеи?

Добавлено через 18 минут
Цитата Сообщение от Опа!! Посмотреть сообщение
public class myAdapter extends BaseAdapter
а расширять то надо ArrayAdapter<String> Только вот как?

Добавлено через 48 минут
Вроде написал тестовый вариант, но ошибка осталась прежней..

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public class myAdapter extends ArrayAdapter<String>
     {
 
        public myAdapter(Context context, int resource, int textViewResourceId, List<String> objects) 
        {
            super(context, resource, textViewResourceId, objects);
        }
        
        public View getView(int position, View convertView, ViewGroup parent)
        {
            View row = super.getView(position, convertView, parent);
            TextView tv1 = (TextView)row.findViewById(R.id.row_title);
            TextView tv2 = (TextView)row.findViewById(R.id.row_date);
            
            tv1.setText("123");
            tv2.setText("321");
            
            return(row);
        } 
     }

Code
1
08-24 10:13:07.800: ERROR/AndroidRuntime(398): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
Добавлено через 1 час 21 минуту
Вобщем за весь день так и не разобрался, приведу полный код простого способа вывода в 1 единственный TextView в моем приложении. Может, на его основе кто-то сможет подсказать как переделать листинг под вывод в 2 textView находящихся в LinnearLayout. Хотя бы направление поиска нашел - писать собственный ArrayAdapter<String>, расширящий базовый класс, привязываться к нескольким виджетам а не к одному единственному textView без слоя надо с помощью LayoutInflater.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package tgn.inostudio.fraggjkee.RSS_inostudio;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
 
 
public class MessageList extends ListActivity 
{
    List<Message> messages ;    // структура для хранения объектов Message
    List<String> titles;          //  названия и даты новостей для вывода в ListView
    
    public static Message selectedMsg = null; // выбранное из ListView сообщение
    
    // метод вызывается при первом создании активити
    @Override
    public void onCreate(Bundle icicle) 
    {
        super.onCreate(icicle);
        setContentView(R.layout.feed); 
        
        // загружаем ленту из сформированного
        // в стартовом активити адреса
        loadFeed(StartPage.getFeedUrl());
    }
    
    // функция отвечает за загрузку ленты
    // из указанного URL
    public void loadFeed(String url)
    {
        try
        {
            String sDate; // переменная хранит дату в удобном для вывода формате
            FeedParser parser = new AndroidSaxFeedParser(url);
            messages = parser.parse();
            
            // структура содержит названия и даты новостей для вывода в ListView
            titles = new ArrayList<String>(messages.size());
            
            // для всех сформированных новостей
            for (Message msg : messages)
            {
                StringBuilder builder = new StringBuilder();
                builder.append(msg.getTitle()); 
                builder.append("\n["); // для красоты
                
                // удаляем постфикс часового пояса
                sDate = msg.getDate().substring(5, msg.getDate().length() - 6);
                        
                builder.append(sDate);
                builder.append("]"); // для красоты
 
                titles.add(builder.toString());
            }
            
            // объявляем адептер, связывающий структуру данных с интерфейсом
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row, titles);
            // cвязываем список с адаптером
            this.setListAdapter(adapter);
        } 
        
        // в случае некорректного URL ленты
        catch (Throwable t)
        {
            // выводим информационное сообщение
            Toast.makeText(this, "Incorrect RSS-feed URL, try again.", Toast.LENGTH_LONG).show();
            
            // и возвращаемся к предыдущему активити
            Intent back = new Intent(this, StartPage.class);
            startActivity(back);
        }
    }
    
    // обработчик нажатий элементов списка
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) 
    {
        super.onListItemClick(l, v, position, id);
        
        // запоминаем кликнутую новость
        selectedMsg = messages.get(position);
        
        // переходим к новому активити с превью новости
        Intent intent = new Intent(this, NewsPreview.class); 
        startActivity(intent);
    }
    
    /*
     public class myAdapter extends ArrayApdapter<String> 
     {
             
     }
     */        
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2011, 17:34
Ответы с готовыми решениями:

Собственный адаптер на основе ArrayAdapter
Хочу реализовать, чтобы при keydown элемент списка менял цвет фона, а при keyup возвращался в исходное положение, и в то же время выполнял...

ACTION_SEND в ArrayAdapter
Ребят,вопрос такой, есть GridView с картинками, к нему отдельным классом подключен Adapter. Необходимо по клику картинки делать ACTON_SEND....

Привязка класса к ArrayAdapter
Добрый день. Есть класс, содержащий опросы private static class Polls { private final int _Id; private final...

3
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
25.08.2011, 03:30
Жаль помочь толком не могу (( Обхожусь без него, не могу понять его преимущества(буду признателен если опишеш) но всё же. На англоязычных форумах советуют розбивать каждый текствью на отдельный xml file .
Попробуй, может быть даже поможет(хотя думаю врядли)

XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
 xmlns:android="http://schemas.android.com/apk/res/android"
   <TextView 
                android:text="TextView" 
                android:id="@+id/row_title"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:textStyle="bold">
        </TextView>
Тут не верно я написал , я не работаю с xml-layout, всё кодом пишу. Создай свои тексть вью как два отдельных хмл файла подобно этому (подкоректировал этот код выше)
Ну а дальше по стандарту, добавить эти тексвью к лайоуту.

Если правильно думаю... то адаптер воспринимает этот файл хмл твой как линеарЛайоут.

Не по теме:

ресурс ид, это не виев ид . я кстати в ручную создаю списки )))

1
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89
25.08.2011, 13:06  [ТС]
если речь про адаптеры, то они нужны для автоматического заполнения всех полей ListView

Java
1
2
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row, titles);
this.setListAdapter(adapter);
- этот нехитрый код позволяет заполнить все строки ListView элементами из titles, R.layout.row - шаблон вида каждого элемента списка. В этом примере это простой textView (сейчас у меня в рабочей программе там еще и LinnearLayout и ImageView)

Цитата Сообщение от petruchodd Посмотреть сообщение
Обхожусь без него, не могу понять его преимущества(буду признателен если опишеш) но всё же.
нет, кажется, это немного не то, в этом xml по идее содержися как я выше сказал шаблон каждого пункта ListView, в самом простом варианте там и есть один только TextView. А как (и зачем) адаптер приучить работать с несколькими xml - не знаю.
1
25.08.2011, 13:14

Не по теме:

я пожже тебе ещо скину кой какую инфу.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2011, 13:14
Помогаю со студенческими работами здесь

Отличия в работе ArrayAdapter
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в списке, меняя значение одного, меняются все. На Android &gt;= 4.0...

Обновление данных в ArrayAdapter
Добрый день. Есть созданный ArrayAdapter. Он добавляется в listView, при достижении конца списка происходит получение информации и...

ArrayAdapter и много заморочек
Сам ArrayAdapter String data = new String{&quot;Текст 1&quot;,&quot;Текст 2&quot;}; ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(this, ...

ArrayAdapter вылет на clear и add
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В чем может быть проблема? import java.io.File; ...

Как правильно настроить ArrayAdapter?
Создаю своё первое приложение, потому вопрос новичка. Статья, которой я руководствовался - поверхностная, потому во многом пришлось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru