我正在开发android中的三级可扩展listview。但我的子节点按重复顺序填充。这是我的源代码:
public class CarPanel extends ExpandableListActivity {
static ArrayList<String> groupItem = new ArrayList<String>();
static ArrayList<String> childItem = new ArrayList<String>();
static ArrayList<Object> grandChildItem = new ArrayList<Object>();
static public ArrayList<String> childValue;
static public ArrayList<String> grandChildValue;
EditText modelType, price, dyp, insurance;
static int dummyFlag = 0;
public LayoutInflater minflater;
public Activity activity;
private MyDBManager dbManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Remove title bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
dbManager = new MyDBManager(this);
dbManager.open();
ExpandableListView expandbleLis = getExpandableListView();
expandbleLis.setDividerHeight(2);
expandbleLis.setGroupIndicator(null);
expandbleLis.setClickable(true);
// 1st level data
setGroupData();
// 2nd level data
setChildGroupData();
// 3rd level data
setGrandChildGroupData();
ParentLevel parentAdapter = new ParentLevel(groupItem);
parentAdapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);
getExpandableListView().setAdapter(parentAdapter);
expandbleLis.setOnChildClickListener(this);
}
public class ParentLevel extends BaseExpandableListAdapter {
public ParentLevel(ArrayList<String> groupList) {
groupItem = groupList;
}
public Object getChild(int arg0, int arg1) {
return arg1;
}
public void setInflater(LayoutInflater mInflater, Activity act) {
minflater = mInflater;
activity = act;
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
CustExpListview SecondLevelexplv = new CustExpListview(CarPanel.this);
SecondLevelexplv.setAdapter(new SecondLevelAdapter(childItem, grandChildItem ));
SecondLevelexplv.setGroupIndicator(null);
return SecondLevelexplv;
}
public int getChildrenCount(int groupPosition) {
Log.v("childItem.size()", "childItem.size() " +childItem.size());
return childItem.size();
}
public Object getGroup(int groupPosition) {
return groupPosition;
}
public int getGroupCount() {
Log.v("groupItem.size()", "groupItem.size() " +groupItem.size());
return groupItem.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = minflater.inflate(R.layout.grouprow, null);
}
((CheckedTextView) convertView).setText(groupItem.get(groupPosition));
((CheckedTextView) convertView).setChecked(isExpanded);
return convertView;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
class CustExpListview extends ExpandableListView {
int intGroupPosition, intChildPosition, intGroupid;
public CustExpListview(Context context) {
super(context);
}
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);
}
}
class SecondLevelAdapter extends BaseExpandableListAdapter {
public LayoutInflater minflater;
public Context activity;
public SecondLevelAdapter(ArrayList<String> childList, ArrayList<Object> grandChildList) {
childItem = childList;
grandChildItem = grandChildList;
}
public void setInflater(LayoutInflater mInflater, Context parentLevel) {
minflater = mInflater;
activity = parentLevel;
}
public Object getChild(int groupPosition, int childPosition) {
return childPosition;
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@SuppressWarnings("unchecked")
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
grandChildValue = (ArrayList<String>) grandChildItem.get(groupPosition);
EditText modelType, price, dyp, insurance;
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.grandchildrow, null);
}
modelType = (EditText) convertView.findViewById(R.id.et_ModelType);
price = (EditText) convertView.findViewById(R.id.et_Price);
dyp = (EditText) convertView.findViewById(R.id.et_DYP);
insurance = (EditText) convertView.findViewById(R.id.et_Insurance);
modelType.setText(grandChildValue.get(childPosition));
convertView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(getBaseContext(), grandChildValue.get(childPosition), Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
public int getChildrenCount(int groupPosition) {
return ((ArrayList<String>) grandChildItem.get(groupPosition)).size();
}
public Object getGroup(int groupPosition) {
return groupPosition;
}
public int getGroupCount() {
return childItem.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.childrow, null);
}
((CheckedTextView) convertView).setText(childItem.get(groupPosition));
((CheckedTextView) convertView).setChecked(isExpanded);
return convertView;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
public void setGroupData() {
groupItem.clear();
Cursor cursor = dbManager.execQuery("SELECT DISTINCT carName FROM model");
final List<ModelBean> modelList = new ArrayList<ModelBean>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ModelBean beanObj = cursorToModel(cursor);
modelList.add(beanObj);
cursor.moveToNext();
}
// Make sure to close the cursor
cursor.close();
ModelBean modelObj = null;
if (modelList.size() > 0 )
{
for (int i = 0; i < modelList.size(); i++)
{
modelObj = modelList.get(i);
String carName = modelObj.getCarName();
groupItem.add(carName);
}
}
}
public void setChildGroupData() {
childItem.clear();
childItem.add("Android");
childItem.add("iOS");
childItem.add("HTC");
}
public void setGrandChildGroupData() {
grandChildItem.clear();
ArrayList<String> child = new ArrayList<String>();
child.add("PASSAT 1");
child.add("PASSAT 2");
grandChildItem.add(child);
child = new ArrayList<String>();
child.add("POLO 1");
child.add("POLO 2");
grandChildItem.add(child);
child = new ArrayList<String>();
child.add("VITZ 1");
child.add("VITZ 2");
grandChildItem.add(child);
}
private ModelBean cursorToModel(Cursor cursor)
{
ModelBean modelBean = new ModelBean();
modelBean.setCarName(cursor.getString(0));
return modelBean;
}
}
现在我希望这个块代码只为每个父组重复一次,但重复三次。我搜索了更多类似的SO问题,但没有解决。
的Android
的iOS
HTC
答案 0 :(得分:8)
我在同样的问题上挣扎,无法在网上找到解决方案/ SO。
在做了一些日志记录后,我得出结论,父级BaseExpandbleAdapater将调用/创建一个与数据集/组中子项数相对应的childView。不幸的是,在三级嵌套列表方案中不需要这样做。
因此,在生成三级列表时,只需在父适配器中创建函数getChildrenCount,如下所示:
@Override
public int getChildrenCount(int groupPosition){
return 1;
}
现在它只会构建子列表项的“1”迭代,即使1个嵌套列表可以包含任意数量的子项,从子适配器的角度来看它们也会成为组。
令人困惑,因为您的子/嵌套适配器处理显示实际的“子”,而在单个嵌套列表中,您的子项在同一父适配器类中处理。在这种情况下,子/嵌套适配器将处理将子项显示为其自己的groupView,从而使父适配器中的子项数不相关。至少这是我的结果和环境向我展示的......
希望我能得到帮助,这让我感到困难了半天。