Страница 1 из 5

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

Добавлено: 07 окт 2012, 23:00
damager82
В этом уроке:
- работаем с ListFragment


Click here to read this article!

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

Добавлено: 17 окт 2012, 17:29
Ilyatoon
А можно сделать так, чтобы по нажатию на пункт списка был переход на другую Activity?

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

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

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

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

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

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

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

Добавлено: 02 ноя 2012, 09:14
ri_sergey
Спасибо, damager82.
А есть ли способ регистрировать контекстное меню для элементов?

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

Добавлено: 02 ноя 2012, 14:32
damager82
ri_sergey писал(а):Спасибо, damager82.
А есть ли способ регистрировать контекстное меню для элементов?
Урок 51 )

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

Добавлено: 22 ноя 2012, 23:20
Stas0n
У почему то ругается на 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"

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

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

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

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

Добавлено: 06 дек 2012, 13:02
blackdiamond
Уважаемый автор и уважаемые профи, нуждаюсь в совете по данному уроку.
Уже долго бьюсь над уроком, но успешно запускается он только при 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

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

Добавлено: 06 дек 2012, 13:45
KamiSempai
А вы когда в коде писали "import android.support.v4.app.ListFragment;", соответствующую библиотеку подключали?
По оводу XML. Я бы посоветовал перенести создание массива в onActivityCreated.
И еще. Почему "String data[]", а не "String[] data"? Или я чего то не понимаю?

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

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

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

Добавлено: 06 дек 2012, 14:05
rezak90
Почему "String data[]", а не "String[] data"? Или я чего то не понимаю?
если не ошибаюсь яве всё равно как писать...

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

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

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

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

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

Добавлено: 06 дек 2012, 15:29
blackdiamond
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"? :)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо за ответы.