Как работать с двумя ListActivity в одной activity?

Интерфейс, диалоги, темы, стили, меню
Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 14 мар 2016, 23:12

Всех приветствую. Подскажите пожалуйста,как реализовать 2 Listactivity в одной activity.listview я не хочу использовать,поскольку listactivity и listfragment более красивее,да и код на мой взгляд будет менее громосток,а значит более понятен для других. Предполагается,что при нажатии на определённые элементы первого listactivity будет появляться дополнительный Listactivity,который,при нажатии на любой его элемент будет исчезать и,соответственно,будет работать алгоритм,который я запрограммирую. Но к listactivity и к listfragment нельзя обратиться по id,поэтому я не знаю,как создать второй ListActivity или ListFragment и работать с двумя списками в одной activity. Кто что думает по этому поводу? Заранее благодарю всех за помощь.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 14 мар 2016, 23:25

Я считаю, это невозможно. Кстати id у ListActivity есть - но он стандартный и определяется в android.R , а не в R .

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Сообщение Александр Козловский » 15 мар 2016, 07:30

Тогда непонятно,почему когда я прописываю его в xml eclipse не ругается,а на экране появляется второй список. без элементов? Получаетсятак,что в xml можно создавать сколько хочешь ListActivity,а в коде можно работать только с одним?

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 15 мар 2016, 09:46

Во всяком случае, по id их не найти. Но поскольку у тебя будет не ListActivity, а производный класс от него, в нем можно организовать метод по его поиску.

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 15 мар 2016, 18:22

Но поскольку у тебя будет не ListActivity, а производный класс от него, в нем можно организовать метод по его поиску.[/quote]
А как должен выглядеть этот метод,т.е какой примерно код этого метода. Просто на просторах гугла и яндекса я не нашёл решение моей задачи,а всё-таки хочется сделать 2 списка в место одного,поскольку это,как я писал ранее,усложнит код по разным причинам. Одна из них это то,что у меня первый список работает через адаптер,который использует метод моего класса,получающий нужную мне строковую информацию об объекте,а для второго списка нужен свой адаптер,который просто берёт информацию из строкового ArrayList.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 15 мар 2016, 19:57

У тебя два разных класса MyListActivity1 и MyListActivity2 или два экземпляра одного класса MyListActivity?
В первом случае - каждый класс будет иметь статическое поле activity (паттерн синглетон), во втором - статическое поле типа List<MyListActivity> activities;
Можно придумать другие методы доступа.
PS: в обоих случаях нужно в методе onDestroy() чистить статические поля.

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 15 мар 2016, 20:49

У меня 1 класс,наследуемый от ListActivity. Но я всё равно не понял Вашу идею. Мы создаём список типа,к примеру,MainActivity,учитывая,что MainActivity наследуется от ListActivity или ListFragment,но что он нам даст? Извините за очень глупый вопрос,но что Вы имейте ввиду под очищением статических полей? Им нужно просто присваивать значение null,или кроме этого есть дополнительные методы,уничтожающие поля данного типа. Просто не всегда присваивание объектам null,позволяют полностью освободить ресурсы,занимаемые ранее данными объектами,поэтому у некоторых классов есть методы,освобождающие ресурсы их экземпляров.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 15 мар 2016, 23:46

Почитай про паттерн синглетон. Тебе нужно его модифицировать, чтобы можно было бы создавать два объекта, а не один.
Очищение - достаточно присвоить null статическому полю или удалить из списка и присвоить null указателю списка, когда он станет пустым (если будет использоваться список). Дальше сборщик мусора разберёмся.

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 16 мар 2016, 16:15

Огромное Вам спасибо за информацию. Я почитал про simpleton,однако я всё равно не понял как сделать 2 списка. Наверное Вы имейте ввиду то,что я должен создать класс к примеру singleton. Затем я должен реализовать в нём статический метод,возвращающий объект типа ListActivity. Затем в основном классе я должен написать так: singleton=singleton.getInstance();
Где getInstance - метод,возвращающий объект типа ListActivity. Покрайней мере я так понял материал,который прочитал про патерн singleton. Затем я должен создать второй такой же объект. Но если я правильно понял Вашу идею,то остаётс та же проблема: Как мы будем определять,что мы работаем с первым списком,который прописан в xml файле,или со вторым,который прописан в том же файле,ведь у ListActivity есть,как Вы ранее писали,единственный id.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 16 мар 2016, 18:19

Если создавать два класса, то примерно так:

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

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?

Сообщение Александр Козловский » 16 мар 2016, 19:01

Но дело в том,что у меня 1 класс,использующий listActivity. Не могли бы Вы пожалуйста написать код,как это будет выглядеть,если у меня 1 класс. Просто Вы писали,что код будет выглядеть немного по-другому. Или для н ListActivity нужно н классов. Просто я ставлю цель создать в одной activity 2 списка. Вообще пока что планируется,что моё приложение будет состояь из одной activity. Кстати огромное Вам спасибо за код для 2-х классов,наследуемых от ListActivity и за ранее благодарю Вас за код для одного класса,просто Вы ранее писали,что он будет выглядеть по-другому.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 16 мар 2016, 21:10

Самый простой способ - создать два дополнительных класса, производных от Вашего, примерно как показано в моём предыдущем сообщении.
Иначе как их отличить?

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 16 мар 2016, 21:31

Т.е если я вдруг захочу реализовать 3 списка,нужно будет писать 3 класса? Но я не понял,как класс будет определять,что я работаю со вторым списком,который в xml разметке идёт сразу же после первого. Честно скажу,что пока что я просмотрел код поверхностно,поэтому возможно всё будет работать правильно. Ну как я понял,если оптимизировать код и писать н списков в одном классе,то код будет почти такой же,только там мы будем работать со списком типа на пример MainActivity,наследуемого от ListActivity

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 16 мар 2016, 22:42

По какому признаку ты хочешь их отличать? Вместо одного статического поля instance можно иметь static List<MyListActivity> list; и находить по индексу в списке - что не очень надёжно или static Map<String,MyListActivity> map; и находить по имени - но тогда MyListActivity должна в конструкторе, или хотя бы в onCreate() знать своё имя.

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 16 мар 2016, 22:59

А почему по индексу искать не надёжно? Теперь я понял суть. Получается,что,например,энный объект списка типа ListActivity подхватывает энный ListView из xml разметки?

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 17 мар 2016, 09:06

А ты уверен в каком порядке будут создаваться объекты? При повороте экрана (а если ты защитился от этого - то найдутся другие причины) интерфейс будет уничтожаться и пересоздаваться по-новому. См. цикл жизни Аctivity, при необходимости нужны обработчики всех этапов.

Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Re: Как работать с двумя ListActivity в одной activity?

Сообщение Александр Козловский » 17 мар 2016, 11:21

Возможно Вы правы,но я всё же попробую вариант со списком типа ListActivity,а если я не смогу переделать код,или программа будет не корректно работать,то буду создавать отдельный класс. Только я хочу уточнить некоторые детали: 1. Посути в методе ondestroy нужно просто очистить список с помощью метода clear. 2. в методе,который присваивает instance this,это нужно делать для всех объектов списка? Извините пожалуйста меня за настырность,но я хочу иметь максимальное количество вариантов решения проблемы,чтобы в зависимости от моей программы я бы смог выбирать 1 из вариантов.

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Как работать с двумя ListActivity в одной activity?

Сообщение An-droid » 17 мар 2016, 13:34

Используйте WidgetStaticListView.

Чтобы создать несколько 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();
        }
    }
}
2. В файле разметки создаем, например, ТРИ элемента WidgetStaticListView внутри элемента ScroolView

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

<?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>
3. В активити пишем для списков

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

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);
Всё. Таким образом вы можете размещать любое количество списков (в том числе прокручиваемых внутри своего View, при необходимости) на одной странице.
Вот, например, реализация двух списков с расписаниями сеансов внутри одного элемента большого списка кинотеатров.
example_for_wslv.png
example_for_wslv.png (77.18 КБ) 11085 просмотров
Изображение

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Как работать с двумя ListActivity в одной activity?

Сообщение math64 » 17 мар 2016, 18:15

An-droid, ТС хочет использовать две ListActivity, а не ListView. С ListView никаких проблем нет.
Александр Козловский, если используете список или карту - instance не нужен.
В конструкторе включаете себя в список или карту, в onDestroy() - удаляете себя оттуда. Когда список/карта становятся пустыми, присваивание null указателю на список/карту. Для удобства работы добавляете статический метод для получения указателя на клосс по номеру/имени и методы добавления/удаления в список/карту

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Как работать с двумя ListActivity в одной activity?

Сообщение An-droid » 18 мар 2016, 09:07

Ммм.. а разве "ListActivity" это не Активность, в которой используется ListView?
Oo
http://developer.android.com/reference/ ... ivity.html
Изображение

Ответить