2014-08-29 2 views
1

Я разрабатываю приложение для Android, которое содержит один вид расширяемого списка для загрузки данных из веб-службы, но я не хочу загружать целые данные при запуске, но сначала загрузите родительский список, а затем, когда раскрывается конкретный элемент списка в представлении списка, загрузите дочерний элемент определенного элемента, так что сначала это возможно или нет?Загрузите дочерний элемент при нажатии на элемент родительского списка в расширенном представлении списка в android

Мой Пример кода:

package adapter; 

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

import com.rk.socialsync.R; 

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.List; 

import utils.Global; 
import utils.OnlineProperty; 

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<Date> _listDataHeader; 
    private HashMap<Date, List<OnlineProperty>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<Date> listDataHeader, 
           HashMap<Date, List<OnlineProperty>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public OnlineProperty getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

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

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     OnlineProperty onlineProperty = getChild(groupPosition, childPosition); 

     String child1Text = onlineProperty.getOnlineTime(); 
     String child2Text = onlineProperty.getOfflineTime(); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.listelementchild, null); 
     } 

     TextView textOnline = (TextView) convertView.findViewById(R.id.textTimeOnline); 
     TextView textOffline = (TextView) convertView.findViewById(R.id.textTimeOffline); 
     TextView textView = (TextView) convertView.findViewById(R.id.textTo); 

     textView.setTypeface(Global.AppsFont); 
     textOnline.setText(child1Text); 
     textOffline.setText(child2Text); 

     textOffline.setTypeface(Global.AppsFont); 
     textOnline.setTypeface(Global.AppsFont); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

    @Override 
    public String getGroup(int groupPosition) { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     return dateFormat.format(this._listDataHeader.get(groupPosition)); 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.listelementexpandable, null); 
     } 

     TextView textHeader = (TextView) convertView.findViewById(R.id.textExpandable); 
     textHeader.setTypeface(Global.AppsFont); 
     textHeader.setText(headerTitle); 

     return convertView; 
    } 

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

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

} 

Другой вопрос, который я хочу пользовательские изменения в макете, как кнопки, я имею точку в изображении как + расшириться и -

enter image description here

+0

Один вопрос за один период пожалуйста. – Simas

ответ

1

Да, это возможно и это должно быть сделано через ExpandableListView's OnGroupClickListener. Сначала сделайте массив детей в вашем адаптере общественности и инициализируется по умолчанию:

public HashMap<Date, List<OnlineProperty>> _listDataChild = 
      new HashMap<Date, List<OnlineProperty>>(); 

Следующая Переопределение groupClickListener:

mExpList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
    @Override 
    public boolean onGroupClick(ExpandableListView p, View v, int grpPos, long id) { 
     // Check if children not yet fetched 
     if (mExpAdapter._listDataChild.get(date) == null) { 
      // Fetch list of children for group "grpPos" 

      // Add the children to your adapters HashMap 
      mExpAdapter._listDataChild.put(date, children); 
     }      
     return false; 
    } 
}); 

Примечания:

  • Чтобы избежать загрузки слишком много, вы может переопределить onGroupCollapsed в вашем адаптере, чтобы он не загружал детей, которые не используются.
  • Код, указанный мной, может быть неправильным, так как я не знаю вашу структуру данных. Вам придется адаптироваться.
+0

Можно ли загружать дочерние данные с сервера. Прекрасно работает для локальных данных – Ameer

Смежные вопросы