Урок 45. Список-дерево ExpandableListView

Обсуждение уроков
denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 04 янв 2013, 17:15

Какая то проблема...вот идет выборка по атрибуту, который передается...

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

if (convertView == null) {
			Log.d("asd", mChildData.get(groupPosition).get(childPosition).keySet().toString());			
			if (mChildData.get(groupPosition).get(childPosition).get(mChildFrom[0]).toString() == "B".toString()) {
				convertView = mInflater.inflate(R.layout.item_b, null);
			}
			else {				
				convertView = mInflater.inflate(R.layout.item_l, null);
			}
		}
все работает, при первом открытии дочернего списка, как только я открываю другой дочерний список, то начинается странная перерисовка до этого открытых элементов списка...( и я не знаю в чем дело...могу приложить скрины...

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 04 янв 2013, 18:31

лучше вылажите весь адаптер или проект, сегодня ночью или завтра уже смогу посмотреть
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 04 янв 2013, 22:11

Все отправил в ПМ. А вот адаптер:

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

package ru.example.listview;

import java.util.ArrayList;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseExpandableListAdapter {	

	private Context mContext;
	private ArrayList<Map<String, Object>> mGroupData;
	private String[] mGroupFrom;
	private ArrayList<ArrayList<Map<String, Object>>> mChildData;
	private String[] mChildFrom;
	private LayoutInflater mInflater;
	public MyAdapter (Context context, ArrayList<Map<String, Object>> groupData, String[] groupFrom, ArrayList<ArrayList<Map<String, Object>>> childData, String[] childFrom) {
	   mContext = context;
	   mGroupData = groupData;
	   mGroupFrom = groupFrom;
	   mChildData = childData;
	   mChildFrom = childFrom;
	   mInflater =  (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	@Override
	public Object getChild (int groupPosition, int childPosition) {
		return mChildData.get(groupPosition).get(childPosition);		
	}
	
	@Override
	public long getChildId (int groupPosition, int childPosition) {
		return childPosition;
	}
	
	@Override
	public View getChildView (int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
		if (convertView == null) {
			Log.d("asd", mChildData.get(groupPosition).get(childPosition).keySet().toString());			
			if (mChildData.get(groupPosition).get(childPosition).get(mChildFrom[0]).toString() == "B".toString()) {
				convertView = mInflater.inflate(R.layout.item_b, null);
			}
			else {				
				convertView = mInflater.inflate(R.layout.item_l, null);
			}
		}
		return convertView;
	}	

	@Override
	public int getChildrenCount (int groupPosition) {
		return mChildData.get(groupPosition).size();	
	}
	
	@Override
	public Object getGroup (int groupPosition) {
		return mGroupData.get(groupPosition);
	}
	
	@Override
	public int getGroupCount () {
		return mGroupData.size();
	}
	
	@Override
	public long getGroupId (int groupPosition) {
		return groupPosition;
	}
	
	@Override
	public View getGroupView (int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
		if (convertView == null) {
			LayoutInflater inflater =  (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			convertView = inflater.inflate(R.layout.item, null);
		}
		
		TextView tvText = (TextView) convertView.findViewById(R.id.tvText);
		tvText.setText(mGroupData.get(groupPosition).get(mGroupFrom[0]).toString());
		
		TextView tvClock = (TextView) convertView.findViewById(R.id.tvClock);
		tvClock.setText(mGroupData.get(groupPosition).get(mGroupFrom[1]).toString());
		
		return convertView;	
	}
	
	@Override
	public boolean hasStableIds () {
		return true;
	}
	
	@Override
	public boolean isChildSelectable (int groupPosition, int childPosition) {
		return true;
	}
	
}

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 04 янв 2013, 23:23

проект посмотрю, пробежавшись быстро по адаптеру не смог понять зачем вам два листа данных? если можно обойтись одним, и соответственно как понять к какому родителю привязан конкретный ребёнок ведь два листа которые между собой не взаимосвязаны. к тому же лист детей уж странный, лист в листе это что то...
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 04 янв 2013, 23:32

Занесение данных брался из урока на этом сайте...что было с тем и работаю...ничего от себятины нету...

судя по тому что есть, связь идет по очереди детей, т.е. 1 для 1 родителя, 2 для 2 родителя и тд...вот и все...

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 05 янв 2013, 00:11

судя по тому что есть, связь идет по очереди детей, т.е. 1 для 1 родителя, 2 для 2 родителя и тд...вот и все...
очень плохой подход, удалив данные с первого списка во втором уже будет не работать
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 00:21

rezak90 писал(а):очень плохой подход, удалив данные с первого списка во втором уже будет не работать
Ну так логично...второй список сдержит элементы дочернего списка, а первый список содержит дочерние списки...вот и все...т.е. выходит древовидная структура...
А есть пример как можно реализовать по иному?

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 05 янв 2013, 01:00

меня смутила не эта запись:

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

private ArrayList<ArrayList<Map<String, Object>>> mChildData;
а вот эта:

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

private ArrayList<Map<String, Object>> mGroupData;
соответственно достаточно только первого списка
но использование карт мне как то не нравится, я бы сделал так:

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

public class Parent {
private String name;
private ArrayList<Child> childList;
public Parent(ArrayList<Child> _childList, String _name) {
childList = _childList;
name = _name;
}
public Parent() {}
public void addChild(Child child) {
childList.add(child);
}
public Child getChild(int position) {
return childList.get(position);
}
public void setName(String _name) {
name = _name
}
public String getName() {
return name;
}
}

public class Child {
private double price;
public Child(double _price) {
price = _price;
}
public Child() {}
public void setPrice(double _price) {
price = _price;
}
public double getPrice() {
return price;
}

//и в итоге выйдет один список
ArrayList<Parent> listParent;
//добавляем родителя
listParent.add(new Parent().setName("adidas"));
//добавляем ему детей
listParent.get(0).addChild(new Child(200));
listParent.get(0).addChild(new Child(259));
//и т.д.
}
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 01:08

rezak90 писал(а):меня смутила не эта запись:
это конечно хорошо...но как работа с атрибутами реализуется?

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 05 янв 2013, 01:11

denisneposeda писал(а):
rezak90 писал(а):меня смутила не эта запись:
это конечно хорошо...но как работа с атрибутами реализуется?
какие ещё атрибуты?
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 01:15

rezak90 писал(а):какие ещё атрибуты?
ну вот в Родителя добавляете adidas...т.е. лежит это значение и потом вывести...но если у родителя должно лежать не 1, а 2,3 значения? И они выводятся в различные View элементы?...

и вы получается дублируете работу HashMap...есть же метод put()..в который загоняется Key и значение...зачем изобретать велосипед...
Последний раз редактировалось denisneposeda 05 янв 2013, 01:18, всего редактировалось 1 раз.

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 05 янв 2013, 01:16

так в чём проблема добавить пару полей в класс Parent? я же для компактного примера привел одно поле, добавляй хоть тысячу и выводи хоть в тысячу вьюх
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 01:19

rezak90 писал(а):так в чём проблема добавить пару полей в класс Parent? я же для компактного примера привел одно поле, добавляй хоть тысячу и выводи хоть в тысячу вьюх
Приведите с пару полями...что бы я допетал...)

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

Re: Урок 45. Список-дерево ExpandableListView

Сообщение rezak90 » 05 янв 2013, 01:24

denisneposeda писал(а):
rezak90 писал(а):так в чём проблема добавить пару полей в класс Parent? я же для компактного примера привел одно поле, добавляй хоть тысячу и выводи хоть в тысячу вьюх
Приведите с пару полями...что бы я допетал...)
ООП учить нужно...

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

public class Parent {
private String name;
private String category;
private int id;
private ArrayList<Child> childList;
public Parent(ArrayList<Child> _childList, String _name) {
childList = _childList;
name = _name;
}
public Parent() {}
public void addChild(Child child) {
childList.add(child);
}
public Child getChild(int position) {
return childList.get(position);
}
public void setName(String _name) {
name = _name;
}
public String getName() {
return name;
}
public void setCategory(String _category) {
category = _category;
}
public String getCategory() {
return category;
}
public void setId(int _id) {
id = _id;
}
public int getId() {
return id;
}
}
R.id.team
Политика на форуме запрещена

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 01:28

Ну да...вот эти строки я не понял где идет с нижним префиксом...они оказываются поля) все понял...ну что ж...создание своего класса..полей...по мне легче то что есть...да мне кажется это что есть заточен под SimpleExpandableListAdapter...
каждому своё...жду что там по проекту моему...

Ну вот мои слова подтвердились...просто конструктор SimpleExpandableListAdapter требует входные данные...так что ничего в этом страшного нет:

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

List<? extends Map<String, ?>> groupData,
List<? extends List<? extends Map<String, ?>>> childData,
Да и потом...HashMap поддерживает потоки...дальше буду с потока выгружать сразу данные...

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение denisneposeda » 05 янв 2013, 09:36

Хм....в методе getVIewChild()...есть такое условие

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

if (convertView == null ) {}

Смысл его то?
просто убрав все...решилась моя проблема по перерисовке элементов...и при нем...выходило в Лог, первое открытие все элементы выводило, потом как то непонятно...

Yozch
Сообщения: 7
Зарегистрирован: 11 мар 2013, 19:17

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Yozch » 11 мар 2013, 19:39

Тут такая проблема.
Грамотное решение пригодится всем )

Реализую многоуровневый ExpandableListView, за основу взял этот http://www.allappsdevelopers.com/TopicD ... 91a4247a84 и перепилил его под иcпользование с cursor. Но есть одна засада, если уровней больше 3-х, то при раскрытии списков не расширяются (по высоте) родительские ExpandableListView.
Исходное состояние
Изображение
вот два уровня открылось, все ка надо растянулось
Изображение
вот она, засада.
Изображение

Как при раскрытии Third level и отображении Child просигналить верхним уровням и раздвинуть их?
Надеюсь, что я сам верно понял проблему )

Код прилагаю.

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

package com.example.expandablelistviewmultilevel;

import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	 ExpandableListView explvlist;
	 CustExpListview SecondLevelexplv;
	 SecondLevelAdapter1 secadapter;
     @Override
     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            explvlist = (ExpandableListView) findViewById(R.id.ParentLevel);
            explvlist.setAdapter(new ParentLevel());

	}
     public class ParentLevel extends BaseExpandableListAdapter {
    	  
         @Override
         public Object getChild(int arg0, int arg1) {
                return arg1;
         }

         @Override
         public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
         }

         @Override
         public View getChildView(int groupPosition, int childPosition,
                      boolean isLastChild, View convertView, ViewGroup parent) {
        	    SecondLevelexplv = new CustExpListview(MainActivity.this);
                SecondLevelexplv.setAdapter(new SecondLevelAdapter());
                SecondLevelexplv.setGroupIndicator(null);
                return SecondLevelexplv;
         }

         @Override
         public int getChildrenCount(int groupPosition) {
                return 3;
         }

         @Override
         public Object getGroup(int groupPosition) {
                return groupPosition;
         }

         @Override
         public int getGroupCount() {
                return 3;
         }

         @Override
         public long getGroupId(int groupPosition) {
                return groupPosition;
         }

         @Override
         public View getGroupView(int groupPosition, boolean isExpanded,
                      View convertView, ViewGroup parent) {
                TextView tv = new TextView(MainActivity.this);
                tv.setText("->FirstLevel");
                tv.setTextColor(Color.BLACK);
                tv.setTextSize(20);
                tv.setBackgroundColor(Color.BLUE);
                tv.setPadding(10, 7, 7, 7);

                return tv;
         }

         @Override
         public boolean hasStableIds() {
                return true;
         }

         @Override
         public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
         }
  }
     
     public class CustExpListview extends ExpandableListView {
    	 
         int intGroupPosition, intChildPosition, intGroupid;

         public CustExpListview(Context context) {
                super(context);
         }



         @Override
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                widthMeasureSpec = MeasureSpec.makeMeasureSpec(960,
                             MeasureSpec.AT_MOST);
                heightMeasureSpec = MeasureSpec.makeMeasureSpec(600,
                             MeasureSpec.AT_MOST);
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         }
       
  }

  public class SecondLevelAdapter extends BaseExpandableListAdapter {

         @Override
         public Object getChild(int groupPosition, int childPosition) {
                return childPosition;
         }

         @Override
         public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
         }

         @Override
         public View getChildView(int groupPosition, int childPosition,
                      boolean isLastChild, View convertView, ViewGroup parent) {
               
             CustExpListview SecondLevelexplv = new CustExpListview(MainActivity.this);
             secadapter=new SecondLevelAdapter1();
             SecondLevelexplv.setAdapter(secadapter);
             SecondLevelexplv.setGroupIndicator(null);
             SecondLevelexplv.setLayoutParams(new ListView.LayoutParams(
                            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
            
             return SecondLevelexplv;
             
        	 /*
        	 TextView tv = new TextView(MainActivity.this);
                tv.setText("child");
                tv.setTextColor(Color.BLACK);
                tv.setTextSize(20);
                tv.setPadding(15, 5, 5, 5);
                tv.setBackgroundColor(Color.YELLOW);
              //  tv.setLayoutParams(new ListView.LayoutParams(
              //               LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                return tv;
                
                */
         }

         @Override
         public int getChildrenCount(int groupPosition) {
                return 5;
         }

         @Override
         public Object getGroup(int groupPosition) {
                return groupPosition;
         }

         @Override
         public int getGroupCount() {
                return 1;
         }

         @Override
         public long getGroupId(int groupPosition) {
                return groupPosition;
         }

         @Override
         public View getGroupView(int groupPosition, boolean isExpanded,
                      View convertView, ViewGroup parent) {
                TextView tv = new TextView(MainActivity.this);
                tv.setText("-->Second Level");
                tv.setTextColor(Color.BLACK);
                tv.setTextSize(20);
                tv.setPadding(12, 7, 7, 7);
                tv.setBackgroundColor(Color.RED);

                tv.setLayoutParams(new ListView.LayoutParams(
                        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                
                
                SecondLevelexplv.setLayoutParams(new ListView.LayoutParams(
                        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                SecondLevelexplv.invalidateViews();
                return tv;
         }

         @Override
         public boolean hasStableIds() {
                // TODO Auto-generated method stub
                return true;
         }

         @Override
         public boolean isChildSelectable(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return true;
         }

  }

  public class SecondLevelAdapter1 extends BaseExpandableListAdapter {

	  
	  public  void onGroupExpanded()
	  {
	  Log.d("LOG","Развернули");
      }
	  
      @Override
      public Object getChild(int groupPosition, int childPosition) {
             return childPosition;
      }

      @Override
      public long getChildId(int groupPosition, int childPosition) {
             return childPosition;
      }

      @Override
      public View getChildView(int groupPosition, int childPosition,
                   boolean isLastChild, View convertView, ViewGroup parent) {
             TextView tv = new TextView(MainActivity.this);
             tv.setText("child");
             tv.setTextColor(Color.BLACK);
             tv.setTextSize(20);
             tv.setPadding(15, 5, 5, 5);
             tv.setBackgroundColor(Color.YELLOW);
             tv.setLayoutParams(new ListView.LayoutParams(
                         LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

             
             SecondLevelexplv.setLayoutParams(new ListView.LayoutParams(
                     LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
             SecondLevelexplv.invalidateViews();
             
             return tv;
      }

      @Override
      public int getChildrenCount(int groupPosition) {
             return 3;
      }

      @Override
      public Object getGroup(int groupPosition) {
             return groupPosition;
      }

      @Override
      public int getGroupCount() {
             return 1;
      }

      @Override
      public long getGroupId(int groupPosition) {
             return groupPosition;
      }

      @Override
      public View getGroupView(int groupPosition, boolean isExpanded,
                   View convertView, ViewGroup parent) {
             TextView tv = new TextView(MainActivity.this);
             tv.setText("-->Third Level");
             tv.setTextColor(Color.BLACK);
             tv.setTextSize(20);
             tv.setPadding(12, 7, 7, 7);
             tv.setBackgroundColor(Color.GREEN);

             parent.setLayoutParams(new ListView.LayoutParams(
                     LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
            // parent.invalidateViews();
           // secadapter.notifyDataSetInvalidated();
             
             return tv;
      }

      @Override
      public boolean hasStableIds() {
             // TODO Auto-generated method stub
             return true;
      }

      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
             // TODO Auto-generated method stub
             return true;
      }

}    

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 11 мар 2013, 23:30

Я вот этот за основу брала, работает без глюков
http://code.google.com/p/tree-view-list ... %2Fpolidea
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yozch
Сообщения: 7
Зарегистрирован: 11 мар 2013, 19:17

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Yozch » 12 мар 2013, 11:20

какой-то она мне замороченной показалась, думал попробовать ее, если эту не заведу. С любом случае - спасибо, знать то, что это реально рабочий вариант - уже хорошо )

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 12 мар 2013, 12:49

ТАм два способа занести данные есть, в зависимости от того какие данные имеются. Ну и интерфейс поделать можно разный.
Я долго мучилась с занесением данных, все металась к умным или красивым))
Но все предлагаемые другие мне вообще не понравились - выглядят ужасно, работают с каким-то глюками..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить