Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/27: Рейтинг темы: голосов - 27, средняя оценка - 4.89
Опа!!
16 / 16 / 1
Регистрация: 30.09.2009
Сообщений: 89
#1

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

24.08.2011, 17:34. Просмотров 4862. Ответов 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>
Всякий раз получаю ошибку
Код
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);
        } 
     }

Код
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 17:34
Ответы с готовыми решениями:

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

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

Отличия в работе ArrayAdapter
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в...

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

Обновление данных в ArrayAdapter
Добрый день. Есть созданный ArrayAdapter. Он добавляется в listView, при...

3
petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 694
Завершенные тесты: 1
25.08.2011, 03:30 #2
Жаль помочь толком не могу (( Обхожусь без него, не могу понять его преимущества(буду признателен если опишеш) но всё же. На англоязычных форумах советуют розбивать каждый текствью на отдельный 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
Опа!!
16 / 16 / 1
Регистрация: 30.09.2009
Сообщений: 89
25.08.2011, 13:06  [ТС] #3
если речь про адаптеры, то они нужны для автоматического заполнения всех полей 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
petruchodd
25.08.2011, 13:14     Собственный ArrayAdapter
  #4

Не по теме:

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

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 13:14
Привет! Вот еще темы с ответами:

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

ArrayAdapter вылет на clear и add
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru