Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.94
Опа!!
16 / 16 / 0
Регистрация: 30.09.2009
Сообщений: 89
#1

Собственный ArrayAdapter - Программирование Android

24.08.2011, 17:34. Просмотров 4840. Ответов 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 (Программирование Android):

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

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

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

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

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

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

3
petruchodd
121 / 118 / 13
Регистрация: 23.06.2009
Сообщений: 637
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 / 0
Регистрация: 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? - Программирование Android
Создаю своё первое приложение, потому вопрос новичка. Статья, которой я руководствовался - поверхностная, потому во многом пришлось...

Кастомный ArrayAdapter для Spinner - Программирование Android
Создал свой адаптер. Привязал его к списку Spinner. Получил идентификатор выбранной записи. Ну вроде бы как получается в каждом элементе...

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

Выкидывает NullPointerException при заполнении данных через ArrayAdapter - Программирование Android
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета activity_food_category.xml. При заполнении выкидывает ошибку...


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

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

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