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

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

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

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
Посмотрите здесь:

Android Обновление данных в ArrayAdapter
Android ArrayAdapter вылет на clear и add
Android Как правильно настроить ArrayAdapter?
Android Свой собственный прогресс бар
Привязка класса к ArrayAdapter Android
Android Кастомный ArrayAdapter для Spinner
Собственный ListView и его дети Android
Отличия в работе ArrayAdapter Android
Android Собственный статус-бар
ArrayAdapter и много заморочек Android
Собственный адаптер на основе ArrayAdapter Android
Android ACTION_SEND в ArrayAdapter

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
petruchodd
 Аватар для petruchodd
89 / 89 / 8
Регистрация: 23.06.2009
Сообщений: 505
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
Ответ Создать тему
Опции темы

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