Урок 109. Android 3. Fragments. ListFragment - список

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 07 окт 2012, 23:00

В этом уроке:
- работаем с ListFragment


Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:11, всего редактировалось 8 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ilyatoon
Сообщения: 8
Зарегистрирован: 17 окт 2012, 09:30

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение Ilyatoon » 17 окт 2012, 17:29

А можно сделать так, чтобы по нажатию на пункт списка был переход на другую Activity?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 19 окт 2012, 14:45

Ilyatoon писал(а):А можно сделать так, чтобы по нажатию на пункт списка был переход на другую Activity?
Вешайте стандартный вызов Activity в onListItemClick.
Как вызывать - можно глянуть в Уроке 21
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

ri_sergey
Сообщения: 2
Зарегистрирован: 25 окт 2012, 12:58

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение ri_sergey » 25 окт 2012, 16:59

Здравствуйте.
Подскажите пожалуйста, как можно вставлять дополнительные данные к элементу такого списка,
например изображения и описание элемента в список?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 29 окт 2012, 16:28

ri_sergey писал(а):Здравствуйте.
Подскажите пожалуйста, как можно вставлять дополнительные данные к элементу такого списка,
например изображения и описание элемента в список?
Это вам нужен Урок 48 и последующие.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

ri_sergey
Сообщения: 2
Зарегистрирован: 25 окт 2012, 12:58

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение ri_sergey » 02 ноя 2012, 09:14

Спасибо, damager82.
А есть ли способ регистрировать контекстное меню для элементов?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 02 ноя 2012, 14:32

ri_sergey писал(а):Спасибо, damager82.
А есть ли способ регистрировать контекстное меню для элементов?
Урок 51 )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Stas0n
Сообщения: 3
Зарегистрирован: 21 окт 2012, 03:10

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение Stas0n » 22 ноя 2012, 23:20

У почему то ругается на onListItemClick. Главное - никак не могу понять почему.

Код: Выделить всё

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setTitle("New List");

		listView = (ListView)findViewById(android.R.id.list);
		adapter = new ItemAdapter();
        adapter.addEnginesNames(names);
        adapter.addEnginesDescriptions(descriptions);
        adapter.addEnginesLogoUrl(logoUrl);
		listView.setAdapter(adapter);
		
        MyTask mt = new MyTask();
        mt.execute();
        
		listView.setOnScrollListener(new OnScrollListener() {
        	
	        @Override
	        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
	        	
                        ...
                        ...
                        ...
	        
			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {}
	        
	    });

	    public void onListItemClick(ListView l; View v; int position; long id) {
	        String item = (String) getListAdapter().getItem(position);
	        Toast.makeText(this, "olololo" + item, Toast.LENGTH_LONG).show();
	    }
	        
    } 
Подчеркивает onListItemClick и пишет: "void is an invalid type for the variable onListItemClick"
Кроме того, подчеркивает последнюю скобку и пишет:
"Syntax error on token ")", ; expected"
"Syntax error on token ")", ; expected"

Как с этим бороться?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 23 ноя 2012, 13:51

Stas0n писал(а):Подчеркивает onListItemClick и пишет: "void is an invalid type for the variable onListItemClick"
Кроме того, подчеркивает последнюю скобку и пишет:
"Syntax error on token ")", ; expected"
"Syntax error on token ")", ; expected"
При перечислении параметров метода используйте запятую, а не точку с запятой
И где-то со скобками напутано, проверьте все.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

blackdiamond
Сообщения: 12
Зарегистрирован: 06 дек 2012, 12:24

Урок 109 - нужны советы

Сообщение blackdiamond » 06 дек 2012, 13:02

Уважаемый автор и уважаемые профи, нуждаюсь в совете по данному уроку.
Уже долго бьюсь над уроком, но успешно запускается он только при 2 условиях.
Условие 1: отключена поддержка версий андроида ниже 3;
Условие 2: массив строк выполнен как и у автора в коде, а не в ".xml" файле.
Вот рабочий код фрагмента (ListFrag.java):

Код: Выделить всё

package ry.mylistfr.mylistfragment;


import android.os.Bundle;
import android.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class ListFrag extends ListFragment 
{
	String data[] = new String[] { "one", "two", "three", "four" };
	//String data []= getResources().getStringArray(R.strings.steps);
	
	  @Override
	  public void onActivityCreated(Bundle savedInstanceState) {
	    super.onActivityCreated(savedInstanceState);
	    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
	        android.R.layout.simple_list_item_1, data);
	    setListAdapter(adapter);
	  }
	  
	  @Override
	  public View onCreateView(LayoutInflater inflater, ViewGroup container,
	      Bundle savedInstanceState) {
	    return inflater.inflate(R.layout.fr, null);
	  }
}

Вот "strings.xml"

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">MyListFragment</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
<string name="number_list">Список чисел</string>
<string name="empty">Нет данных</string>
    
    <string-array name="steps">
        <item>Step_one</item>
        <item>Step_two</item>
        <item>Step_3</item>
        <item>Step_4</item>
        <item>Step_5</item>
        <item>Один</item>
        <item>Два</item>
        <item>Три</item>
    </string-array>

</resources>
Разметка главного активити (mainlayout.xml):

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <fragment 
        android:name="ry.mylistfr.mylistfragment.ListFrag"
        android:layout_width="match_parent"
        android:layout_height="match_parent">    
    </fragment>
</LinearLayout>
Манифест приложения:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ry.mylistfr.mylistfragment"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="ry.mylistfr.mylistfragment.MainlayoutActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
                <activity
            android:name="ry.mylistfr.mylistfragment.ListFrag">
            
        </activity>
    </application>

</manifest>
Все это работает, если убираем из манифеста поддержку Android ниже 3 (API 11) и если массив задан напрямую в коде.
Если раскомментить в коде фрагмента строку: String data []= getResources().getStringArray(R.strings.steps);
(естественно заккоментив строку String data[] = new String[] { "one", "two", "three", "four" };), то Eclipse выдает ошибку: "strings cannot be resolved or is not a field".
Вопрос - как бороться с проблемой, т.е. как сделать чтобы приложение приняло стринговый массив из ".xml" файла, и как сделать так, чтобы старые версии Android понимали данный код?
З.Ы. Пробовал в коде фрагмента вставлять вместо "import android.app.ListFragment;" "import android.support.v4.app.ListFragment;" - безрезультатно.
К сожалению, не нашел как можно вставлять в сообщение скриншоты (или вообще картинки, при нажатии на кнопку форума "Img" запрос на вставку картинки не отображается). Такая функция есть?
К 109 уроку можно добавить одно предложение с напоминанием занести в манифест активность класса MainList.java

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение KamiSempai » 06 дек 2012, 13:45

А вы когда в коде писали "import android.support.v4.app.ListFragment;", соответствующую библиотеку подключали?
По оводу XML. Я бы посоветовал перенести создание массива в onActivityCreated.
И еще. Почему "String data[]", а не "String[] data"? Или я чего то не понимаю?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

blackdiamond
Сообщения: 12
Зарегистрирован: 06 дек 2012, 12:24

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение blackdiamond » 06 дек 2012, 14:01

KamiSempai писал(а):А вы когда в коде писали "import android.support.v4.app.ListFragment;", соответствующую библиотеку подключали?
По оводу XML. Я бы посоветовал перенести создание массива в onActivityCreated.
И еще. Почему "String data[]", а не "String[] data"? Или я чего то не понимаю?
Да, библиотека подключена. Eclipse в новой версии ее автоматом цепляет.
String data[] - это как в уроке у автора, и судя по справочнику Java (Вильямс - полный справочник по java) массивы задают так.
Проверил этот факт 10 раз, потому как, к сожалению, в java разбираюсь плохо - от этого и страдаю :)
Попробовал перенести создание массива в onActivityCreated - ничего не изменилось, ошибка та же.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение rezak90 » 06 дек 2012, 14:05

Почему "String data[]", а не "String[] data"? Или я чего то не понимаю?
если не ошибаюсь яве всё равно как писать...
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение KamiSempai » 06 дек 2012, 14:46

blackdiamond писал(а):Попробовал перенести создание массива в onActivityCreated - ничего не изменилось, ошибка та же.
Даже так не работает?

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, getResources().getStringArray(R.strings.steps));
С фрагментами может еще быть проблема в обработке XML.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

blackdiamond
Сообщения: 12
Зарегистрирован: 06 дек 2012, 12:24

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение blackdiamond » 06 дек 2012, 15:29

KamiSempai писал(а):Даже так не работает?

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, getResources().getStringArray(R.strings.steps));
С фрагментами может еще быть проблема в обработке XML.
Решил проблему с отображением данных из ".xml"
Способ, предложенный выше

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, getResources().getStringArray(R.strings.steps));
, я попробовал с самого начала, ничего не вышло. и я вынес объявление массива за метод

Код: Выделить всё

public void onActivityCreated
.
Потом подставил вместо getResources().getStringArray(R.strings.steps) следующий код getResources().getStringArray(R.array.steps) - опять не вышло.
А вот когда совместил оба способа - тогда и вышло, т.е.:
1. Пишем

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
	        android.R.layout.simple_list_item_activated_1, getResources().getStringArray(R.array.steps));
	    setListAdapter(adapter);
2. Вносим его в метод

Код: Выделить всё

public void onActivityCreated
.
Итого рабочий код:

Код: Выделить всё

package ry.mylistfr.mylistfragment;


import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class ListFrag extends ListFragment 
{
	//String data[] = new String[] { "one", "two", "three", "four" };
	//String data []= getResources().getStringArray(R.array.steps);
	
	  @Override
	  public void onActivityCreated(Bundle savedInstanceState) {
	    super.onActivityCreated(savedInstanceState);
	    
	    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
	        android.R.layout.simple_list_item_activated_1, getResources().getStringArray(R.array.steps));
	    setListAdapter(adapter);
	  }
	  
	  @Override
	  public View onCreateView(LayoutInflater inflater, ViewGroup container,
	      Bundle savedInstanceState) {
	    return inflater.inflate(R.layout.fr, null);
	  }
	  
	  public void onListItemClick(ListView l, View v, int position, long id) {
		    super.onListItemClick(l, v, position, id);
		    Toast.makeText(getActivity(), "position = " + position, Toast.LENGTH_SHORT).show();
		  }
	  
	  
}
Осталось решить второй важный вопрос - как добиться того, чтобы код запускался под API 8
З.Ы. Люди добрые, подскажите дураку, почему код не работал, если массив объявляли до метода???

Код: Выделить всё

public void onActivityCreated
В тоже самое время, если объявить массив программно ДО метода, то прога работает.
Почему такая "нелюбовь" к массивам в ".xml"? :)

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение KamiSempai » 06 дек 2012, 16:07

blackdiamond писал(а):З.Ы. Люди добрые, подскажите дураку, почему код не работал, если массив объявляли до метода???

Код: Выделить всё

public void onActivityCreated
В тоже самое время, если объявить массив программно ДО метода, то прога работает.
Почему такая "нелюбовь" к массивам в ".xml"? :)
Дело в том, что все объекты, создаваемые вне методов, создаются еще до вызова конструктора самого объекта(но после вызова конструктора суперкласса). Скорее всего на тот момент объект был не окончательно подготовлен для работы с ним и getResources() работал не совсем так как надо.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

blackdiamond
Сообщения: 12
Зарегистрирован: 06 дек 2012, 12:24

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение blackdiamond » 06 дек 2012, 16:48

KamiSempai писал(а):Дело в том, что все объекты, создаваемые вне методов, создаются еще до вызова конструктора самого объекта(но после вызова конструктора суперкласса). Скорее всего на тот момент объект был не окончательно подготовлен для работы с ним и getResources() работал не совсем так как надо.
Благодарю за ответ!
Пытаюсь совместить два урока:
"Урок 107. Android 3. ActionBar. Размещение элементов" и данный, 109 урок "Урок 109. Android 3. Fragments. ListFragment - список".
Опять не все так радужно. Элементы ActionBar появились и всё прекрасно, а с ListFragment опять засада.
Делаю все как описал выше, но вместо списка выводится фраза: "нет данных".
Т.е. как-будто адаптер не грузит данные (как на первом скриншоте у автора в 109 уроке). Программа компилится без ошибок, все Ок, а данные в список не грузятся.
Но, пожалуй, не буду загромождать форум своими проблемами, итак много вопросов назадавал, буду разбираться сам.
З.Ы. Спасибо автору за полезные и бесплатные уроки!

test1
Сообщения: 7
Зарегистрирован: 17 дек 2012, 12:47

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение test1 » 17 дек 2012, 12:51

Ругается на:
getActivity()
Сообщение:
Method is undefined for the type (имя активити)
У меня FragmentActivity - может быть из-за этого?

Еще вопрос к админу:
У меня есть 2 вью, и к нему было 2 активити, я их переключал кнопками
мне надо было сделать что бы я мог эти 2 вью переключать свайпами, и я сделал по примеру гугловскому, где юзаются фрагменты -
активити стали фрагментами, но весь код из них пришлось перенести в главную активити управляющую ими, будет ли так работать? (п.с. сейчас попробывал не работает но вообще это возможно?)

Еще вопрос можно ли фрагмент внутри фрагмента ставить? (к примеру внутри вью вставить лист фрагмент с лист вью)

Еще вопрос предложение о: сделайте хорошие примеры где из 1го класса вызываются функции работающие с вью из другого класса.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение damager82 » 18 дек 2012, 10:21

test1 писал(а):Ругается на:
getActivity()
Сообщение:
Method is undefined for the type (имя активити)
У меня FragmentActivity - может быть из-за этого?
getActivity() - это метод фрагмента. Вы в фрагменте его вызываете?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

test1
Сообщения: 7
Зарегистрирован: 17 дек 2012, 12:47

Re: Урок 109. Android 3. Fragments. ListFragment - список

Сообщение test1 » 18 дек 2012, 10:25

damager82 писал(а):
test1 писал(а):Ругается на:
getActivity()
Сообщение:
Method is undefined for the type (имя активити)
У меня FragmentActivity - может быть из-за этого?
getActivity() - это метод фрагмента. Вы в фрагменте его вызываете?
В том то и дело, у меня есть фрагмент активити, есть 2 фрагмента, и код который должен быть в 1 файле(фрагмент активити) вот в нем он и не пашет с этой строкой.
Если я разбиваю код на 2 части(2фрагмента) то потом проблема с их одновременной активацией при запуске фрагмент активити, точнее у меня есть подключение которое необходимо в обеих фрагментах, а я хз как его и там и там использовать кроме как в 1 фрагмент активити вписать, или можно фрагменты как активити обычные использовать? задавая методы он креейт и импортируя друг в друга.

Спасибо за ответы.
Последний раз редактировалось test1 18 дек 2012, 10:55, всего редактировалось 1 раз.

Ответить