2017-02-14 44 views
1

耐心,因爲我只是學習,我是一個新手。 我不知道如何爲以下代碼中的每個子設置不同的CompoundDrawableCustomAdapter for ExpandableListView使用CompoundDrawable

這裏是我的ActivityCustomAdapter

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; 
} 

無論如何,我認爲節約可繪製成地圖不是最好的選擇(因爲內存使用)。您可以保存drawable的id,然後在需要時加載drawable。所以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中添加「預加載的可繪製數組」可用...一些更多的幫助? –

相關問題