Как работать с двумя ListActivity в одной activity?
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Как работать с двумя ListActivity в одной activity?
Всех приветствую. Подскажите пожалуйста,как реализовать 2 Listactivity в одной activity.listview я не хочу использовать,поскольку listactivity и listfragment более красивее,да и код на мой взгляд будет менее громосток,а значит более понятен для других. Предполагается,что при нажатии на определённые элементы первого listactivity будет появляться дополнительный Listactivity,который,при нажатии на любой его элемент будет исчезать и,соответственно,будет работать алгоритм,который я запрограммирую. Но к listactivity и к listfragment нельзя обратиться по id,поэтому я не знаю,как создать второй ListActivity или ListFragment и работать с двумя списками в одной activity. Кто что думает по этому поводу? Заранее благодарю всех за помощь.
Re: Как работать с двумя ListActivity в одной activity?
Я считаю, это невозможно. Кстати id у ListActivity есть - но он стандартный и определяется в android.R , а не в R .
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Во всяком случае, по id их не найти. Но поскольку у тебя будет не ListActivity, а производный класс от него, в нем можно организовать метод по его поиску.
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Но поскольку у тебя будет не ListActivity, а производный класс от него, в нем можно организовать метод по его поиску.[/quote]
А как должен выглядеть этот метод,т.е какой примерно код этого метода. Просто на просторах гугла и яндекса я не нашёл решение моей задачи,а всё-таки хочется сделать 2 списка в место одного,поскольку это,как я писал ранее,усложнит код по разным причинам. Одна из них это то,что у меня первый список работает через адаптер,который использует метод моего класса,получающий нужную мне строковую информацию об объекте,а для второго списка нужен свой адаптер,который просто берёт информацию из строкового ArrayList.
А как должен выглядеть этот метод,т.е какой примерно код этого метода. Просто на просторах гугла и яндекса я не нашёл решение моей задачи,а всё-таки хочется сделать 2 списка в место одного,поскольку это,как я писал ранее,усложнит код по разным причинам. Одна из них это то,что у меня первый список работает через адаптер,который использует метод моего класса,получающий нужную мне строковую информацию об объекте,а для второго списка нужен свой адаптер,который просто берёт информацию из строкового ArrayList.
Re: Как работать с двумя ListActivity в одной activity?
У тебя два разных класса MyListActivity1 и MyListActivity2 или два экземпляра одного класса MyListActivity?
В первом случае - каждый класс будет иметь статическое поле activity (паттерн синглетон), во втором - статическое поле типа List<MyListActivity> activities;
Можно придумать другие методы доступа.
PS: в обоих случаях нужно в методе onDestroy() чистить статические поля.
В первом случае - каждый класс будет иметь статическое поле activity (паттерн синглетон), во втором - статическое поле типа List<MyListActivity> activities;
Можно придумать другие методы доступа.
PS: в обоих случаях нужно в методе onDestroy() чистить статические поля.
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
У меня 1 класс,наследуемый от ListActivity. Но я всё равно не понял Вашу идею. Мы создаём список типа,к примеру,MainActivity,учитывая,что MainActivity наследуется от ListActivity или ListFragment,но что он нам даст? Извините за очень глупый вопрос,но что Вы имейте ввиду под очищением статических полей? Им нужно просто присваивать значение null,или кроме этого есть дополнительные методы,уничтожающие поля данного типа. Просто не всегда присваивание объектам null,позволяют полностью освободить ресурсы,занимаемые ранее данными объектами,поэтому у некоторых классов есть методы,освобождающие ресурсы их экземпляров.
Re: Как работать с двумя ListActivity в одной activity?
Почитай про паттерн синглетон. Тебе нужно его модифицировать, чтобы можно было бы создавать два объекта, а не один.
Очищение - достаточно присвоить null статическому полю или удалить из списка и присвоить null указателю списка, когда он станет пустым (если будет использоваться список). Дальше сборщик мусора разберёмся.
Очищение - достаточно присвоить null статическому полю или удалить из списка и присвоить null указателю списка, когда он станет пустым (если будет использоваться список). Дальше сборщик мусора разберёмся.
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Огромное Вам спасибо за информацию. Я почитал про simpleton,однако я всё равно не понял как сделать 2 списка. Наверное Вы имейте ввиду то,что я должен создать класс к примеру singleton. Затем я должен реализовать в нём статический метод,возвращающий объект типа ListActivity. Затем в основном классе я должен написать так: singleton=singleton.getInstance();
Где getInstance - метод,возвращающий объект типа ListActivity. Покрайней мере я так понял материал,который прочитал про патерн singleton. Затем я должен создать второй такой же объект. Но если я правильно понял Вашу идею,то остаётс та же проблема: Как мы будем определять,что мы работаем с первым списком,который прописан в xml файле,или со вторым,который прописан в том же файле,ведь у ListActivity есть,как Вы ранее писали,единственный id.
Где getInstance - метод,возвращающий объект типа ListActivity. Покрайней мере я так понял материал,который прочитал про патерн singleton. Затем я должен создать второй такой же объект. Но если я правильно понял Вашу идею,то остаётс та же проблема: Как мы будем определять,что мы работаем с первым списком,который прописан в xml файле,или со вторым,который прописан в том же файле,ведь у ListActivity есть,как Вы ранее писали,единственный id.
Re: Как работать с двумя ListActivity в одной activity?
Если создавать два класса, то примерно так:
+ аналогичный код для второго класса.
Код: Выделить всё
public class MyListActivity1 extends MyListActivity {
public static MyListActivity1 instance;
public MyListActivity1() { super(); intance = this; }
void onDestroy() { if (instance == this) instace = null; }
}
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Но дело в том,что у меня 1 класс,использующий listActivity. Не могли бы Вы пожалуйста написать код,как это будет выглядеть,если у меня 1 класс. Просто Вы писали,что код будет выглядеть немного по-другому. Или для н ListActivity нужно н классов. Просто я ставлю цель создать в одной activity 2 списка. Вообще пока что планируется,что моё приложение будет состояь из одной activity. Кстати огромное Вам спасибо за код для 2-х классов,наследуемых от ListActivity и за ранее благодарю Вас за код для одного класса,просто Вы ранее писали,что он будет выглядеть по-другому.
Re: Как работать с двумя ListActivity в одной activity?
Самый простой способ - создать два дополнительных класса, производных от Вашего, примерно как показано в моём предыдущем сообщении.
Иначе как их отличить?
Иначе как их отличить?
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Т.е если я вдруг захочу реализовать 3 списка,нужно будет писать 3 класса? Но я не понял,как класс будет определять,что я работаю со вторым списком,который в xml разметке идёт сразу же после первого. Честно скажу,что пока что я просмотрел код поверхностно,поэтому возможно всё будет работать правильно. Ну как я понял,если оптимизировать код и писать н списков в одном классе,то код будет почти такой же,только там мы будем работать со списком типа на пример MainActivity,наследуемого от ListActivity
Re: Как работать с двумя ListActivity в одной activity?
По какому признаку ты хочешь их отличать? Вместо одного статического поля instance можно иметь static List<MyListActivity> list; и находить по индексу в списке - что не очень надёжно или static Map<String,MyListActivity> map; и находить по имени - но тогда MyListActivity должна в конструкторе, или хотя бы в onCreate() знать своё имя.
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
А почему по индексу искать не надёжно? Теперь я понял суть. Получается,что,например,энный объект списка типа ListActivity подхватывает энный ListView из xml разметки?
Re: Как работать с двумя ListActivity в одной activity?
А ты уверен в каком порядке будут создаваться объекты? При повороте экрана (а если ты защитился от этого - то найдутся другие причины) интерфейс будет уничтожаться и пересоздаваться по-новому. См. цикл жизни Аctivity, при необходимости нужны обработчики всех этапов.
-
- Сообщения: 20
- Зарегистрирован: 06 ноя 2015, 20:55
Re: Как работать с двумя ListActivity в одной activity?
Возможно Вы правы,но я всё же попробую вариант со списком типа ListActivity,а если я не смогу переделать код,или программа будет не корректно работать,то буду создавать отдельный класс. Только я хочу уточнить некоторые детали: 1. Посути в методе ondestroy нужно просто очистить список с помощью метода clear. 2. в методе,который присваивает instance this,это нужно делать для всех объектов списка? Извините пожалуйста меня за настырность,но я хочу иметь максимальное количество вариантов решения проблемы,чтобы в зависимости от моей программы я бы смог выбирать 1 из вариантов.
Re: Как работать с двумя ListActivity в одной activity?
Используйте WidgetStaticListView.
Чтобы создать несколько ListView на одной странице, создайте в файле разметки любое количество виджетов WidgetStaticListView. И затем просто инициализируйте в коде каждый из них, добавив к ним адаптер.
Например:
1. Создаем класс WidgetStaticListView и размещаем в него код ->
2. В файле разметки создаем, например, ТРИ элемента WidgetStaticListView внутри элемента ScroolView
3. В активити пишем для списков
Всё. Таким образом вы можете размещать любое количество списков (в том числе прокручиваемых внутри своего View, при необходимости) на одной странице.
Вот, например, реализация двух списков с расписаниями сеансов внутри одного элемента большого списка кинотеатров.
Чтобы создать несколько ListView на одной странице, создайте в файле разметки любое количество виджетов WidgetStaticListView. И затем просто инициализируйте в коде каждый из них, добавив к ним адаптер.
Например:
1. Создаем класс WidgetStaticListView и размещаем в него код ->
Код: Выделить всё
//some listview on one view
//add in xml-layout
//
//<...your_path.. .WidgetStaticListView
// android:id="@+id/wsListView"
// android:layout_width="match_parent"
// android:layout_height="wrap_content"
// android:orientation="vertical">
// </...your_path.. .WidgetStaticListView>
import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Adapter;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class WidgetStaticListView extends LinearLayout {
protected Adapter adapter;
protected Observer observer = new Observer(this);
public WidgetStaticListView(Context context) {
super(context);
}
public WidgetStaticListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setAdapter(Adapter adapter) {
if (this.adapter != null)
this.adapter.unregisterDataSetObserver(observer);
this.adapter = adapter;
adapter.registerDataSetObserver(observer);
observer.onChanged();
}
private class Observer extends DataSetObserver {
WidgetStaticListView context;
public Observer(WidgetStaticListView context) {
this.context = context;
}
@Override
public void onChanged() {
List<View> oldViews = new ArrayList<View>(context.getChildCount());
for (int i = 0; i < context.getChildCount(); i++)
oldViews.add(context.getChildAt(i));
Iterator<View> iter = oldViews.iterator();
context.removeAllViews();
for (int i = 0; i < context.adapter.getCount(); i++) {
View convertView = iter.hasNext() ? iter.next() : null;
context.addView(context.adapter.getView(i, convertView, context));
}
super.onChanged();
}
@Override
public void onInvalidated() {
context.removeAllViews();
super.onInvalidated();
}
}
}
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ваш_пакет.WidgetStaticListView
android:id="@+id/wsListView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</ваш_пакет.WidgetStaticListView>
<ваш_пакет.WidgetStaticListView
android:id="@+id/wsListView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</ваш_пакет.WidgetStaticListView>
<ваш_пакет.WidgetStaticListView
android:id="@+id/wsListView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</ваш_пакет.WidgetStaticListView>
</ScrollView>
Код: Выделить всё
WidgetStaticListView wslv1 = (WidgetStaticListView) findViewById(R.id.wsListView1);
WidgetStaticListView wslv2 = (WidgetStaticListView) findViewById(R.id.wsListView2);
WidgetStaticListView wslv3 = (WidgetStaticListView) findViewById(R.id.wsListView3);
//отдельно создаем адаптеры и присваиваем их к этим спискам
wslv1.setAdapter(adapter1);
wslv2.setAdapter(adapter2);
wslv3.setAdapter(adapter3);
Вот, например, реализация двух списков с расписаниями сеансов внутри одного элемента большого списка кинотеатров.
Re: Как работать с двумя ListActivity в одной activity?
An-droid, ТС хочет использовать две ListActivity, а не ListView. С ListView никаких проблем нет.
Александр Козловский, если используете список или карту - instance не нужен.
В конструкторе включаете себя в список или карту, в onDestroy() - удаляете себя оттуда. Когда список/карта становятся пустыми, присваивание null указателю на список/карту. Для удобства работы добавляете статический метод для получения указателя на клосс по номеру/имени и методы добавления/удаления в список/карту
Александр Козловский, если используете список или карту - instance не нужен.
В конструкторе включаете себя в список или карту, в onDestroy() - удаляете себя оттуда. Когда список/карта становятся пустыми, присваивание null указателю на список/карту. Для удобства работы добавляете статический метод для получения указателя на клосс по номеру/имени и методы добавления/удаления в список/карту
Re: Как работать с двумя ListActivity в одной activity?
Ммм.. а разве "ListActivity" это не Активность, в которой используется ListView?
Oo
http://developer.android.com/reference/ ... ivity.html
Oo
http://developer.android.com/reference/ ... ivity.html