Форум программистов, компьютерный форум CyberForum.ru

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

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

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

24.08.2011, 17:34. Просмотров 4550. Ответов 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> 
     {
             
     }
     */        
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 17:34     Собственный ArrayAdapter
Посмотрите здесь:

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

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

Отличия в работе 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. Он добавляется в listView, при достижении конца списка происходит получение информации и...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
25.08.2011, 03:30     Собственный ArrayAdapter #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, всё кодом пишу. Создай свои тексть вью как два отдельных хмл файла подобно этому (подкоректировал этот код выше)
Ну а дальше по стандарту, добавить эти тексвью к лайоуту.

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

Не по теме:

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

Опа!!
14 / 14 / 0
Регистрация: 30.09.2009
Сообщений: 89
25.08.2011, 13:06  [ТС]     Собственный ArrayAdapter #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 - не знаю.
petruchodd
25.08.2011, 13:14     Собственный ArrayAdapter
  #4

Не по теме:

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

Yandex
Объявления
25.08.2011, 13:14     Собственный ArrayAdapter
Ответ Создать тему
Опции темы

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