2017-02-14 2 views
1

быть терпеливым, потому что я просто учился, и я новичок. Я не могу понять, как установить разные CompoundDrawable для каждого ребенка в следующем коде.CustomAdapter для ExpandableListView с использованием CompoundDrawable

Вот мои Activity и CustomAdapter

import android.graphics.drawable.Drawable; 
import android.os.DropBoxManager; 
import android.support.annotation.DrawableRes; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ExpandableListView; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class MainActivity extends AppCompatActivity { 

private ExpandableListAdapter listAdapter; 
private ExpandableListView expListView; 
private List<String> listDataHeader; 
private HashMap<String, List<String>> listDataChild; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    // get the listview 
    expListView = (ExpandableListView) findViewById(R.id.lvExp); 


    // preparing list data 
    prepareListData(); 

    listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

    // setting list adapter 
    expListView.setAdapter(listAdapter); 
} 



/* 
     * Preparing the list data 
     */ 
private void prepareListData() { 
    listDataHeader = new ArrayList<String>(); 
    listDataChild = new HashMap<String, List<String>>(); 


    // Adding child data 
    listDataHeader.add("NATIONS"); 



    // Adding child data 
    List<String> NATIONS = new ArrayList<String>(); 
    NATIONS.add("AUSTRALIA"); 
    NATIONS.add("AUSTRIA"); 
    NATIONS.add("BELGIO"); 
    NATIONS.add("BRASILE"); 
    NATIONS.add("BULGARIA"); 
    NATIONS.add("CANADA"); 
    NATIONS.add("CILE"); 
    NATIONS.add("CINA"); 
    NATIONS.add("COLOMBIA"); 
    NATIONS.add("CUBA"); 
    NATIONS.add("ITALIA"); 


    listDataChild.put(listDataHeader.get(0), NATIONS);// Header, Child data 


    } 

} 

Теперь я должен инициализировать Array of CompoundDrawable? Я сделал это, но я не могу получить, как добавить его в созданную HashMap

и адаптер

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import android.content.Context; 
import android.graphics.Typeface; 
import android.graphics.drawable.Drawable; 
import android.graphics.drawable.InsetDrawable; 
import android.media.Image; 
import android.support.annotation.DrawableRes; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.TextView; 

import org.w3c.dom.NodeList; 

public class ExpandableListAdapter extends BaseExpandableListAdapter { 


private Context _context; 
private List<String> _listDataHeader; // header titles 


// child data in format of header title, child title 
private HashMap<String, List<String>> _listDataChild; 

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

} 

@Override 
public Object 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) { 

    final String childText = (String) getChild(groupPosition, childPosition); 

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


    TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem); 
    txtListChild.setText(childText); 

// From this point i would like to set the Compound Drawable DIFFERENT for each childText. 

    return convertView; 
} 



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

} 

@Override 
public Object getGroup(int groupPosition) { 
    return 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.list_group, null); 
    } 

    TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader); 
    lblListHeader.setTypeface(null, Typeface.BOLD); 
    lblListHeader.setText(headerTitle); 
    return convertView; 
} 

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

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

ответ

0

Вместо добавления списка строки в карте вы можете добавить список ListDataChild где ListDataChild является класс, который необходимо создать и который выглядит следующим образом:

public class ListDataChild { 
    public String text; 
    public Drawable drawable; 

    public ListDataChild() {} 

    public ListDataChild(String text, Drawable drawable) { 
     this.text = text; 
     this.drawable = drawable; 
    } 
} 

затем в вашем ') prepareListData (' метод

private void prepareListData() { 
    listDataHeader = new ArrayList<String>(); 
    listDataChild = new HashMap<String, List<ListDataChild>>(); 

    // Adding child data 
    listDataHeader.add("NATIONS"); 

    // Adding child data 
    Drawable[] drawables = ... //An array of preloaded Drawables 
    List<ListDataChild> NATIONS = new ArrayList<ListDataChild>(); 
    NATIONS.add(new ListDataChild("AUSTRALIA", drawables[0])); 
    NATIONS.add(new ListDataChild("AUSTRIA", drawables[1])); 
    NATIONS.add(new ListDataChild("BELGIO", drawables[2])); 
    NATIONS.add(new ListDataChild("BRASILE", drawables[3])); 
    NATIONS.add(new ListDataChild("BULGARIA", drawables[4])); 
    NATIONS.add(new ListDataChild("CANADA", drawables[5])); 
    NATIONS.add(new ListDataChild("CILE", drawables[6])); 
    NATIONS.add(new ListDataChild("CINA", drawables[7])); 
    NATIONS.add(new ListDataChild("COLOMBIA", drawables[8])); 
    NATIONS.add(new ListDataChild("CUBA", drawables[9])); 
    NATIONS.add(new ListDataChild("ITALIA", drawables[10])); 


    listDataChild.put(listDataHeader.get(0), NATIONS);// Header, Child data 

} 

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

// child data in format of header title, child title 
private HashMap<String, List<ListDataChild>> _listDataChild; 

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

} 

, наконец, вы можете сделать что-то вроде этого, когда вы настроите ваш ребенок Посмотреть

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

    final ListDataChild child = (ListDataChild) getChild(groupPosition, childPosition); 

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


    TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem); 

    //Set The TextView text 
    txtListChild.setText(child.text); 

    //Set left drawable 
    txtListChild.setCompoundDrawables(child.drawable, null, null, null); 

    return convertView; 
} 

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

public class ListDataChild { 
    public String text; 
    public int drawableId; 

    public ListDataChild() {} 

    public ListDataChild(String text, int drawableId) { 
     this.text = text; 
     this.drawableId = drawableId; 
    } 
} 

И когда вам нужна вытяжка вы можете загрузить его:

ListDataChild child = ... //Your data child object 
Drawable drawable = ContextCompat.getDrawable(context, child.drawableId); 
+0

Prathamehd я выполнил все Ваши предложения, но я теперь в мертвой точке ... К сожалению, как я сказал, что я действительно новичок ... –

+0

Дело в том, что я не понимаю, как и где добавить в prepareList «предварительно загруженный массив доступных объектов» ... можно получить дополнительную помощь? –