gpt4 book ai didi

android - getChildView 未被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:28 25 4
gpt4 key购买 nike

我正在制作一个包含自定义 ExpandableListView 适配器的菜单。尽管试图使我的代码尽可能接近 API 示例和我在网上看到的任何其他示例(包括多个密切相关的 SO 问题),但我仍然无法让它工作。

我知道正在使用适配器,因为正在显示组 View (由 xml 制作)。单击组项也会调用“getGroupView”,但代码永远不会运行“getChildView”、“getChild”或“getChildId”。

我什至查看了 Android-15 源代码以找出我可能做错了什么,但没有发现任何奇怪的地方。

= 基本 Activity

public class SettingsM extends FragmentActivity
{
static Context context;
ViewPager mViewPager;
CollectionPagerAdapter mDemoCollectionPagerAdapter;
//ColorPicker picker;

SharedPreferences preferences;

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

context = this;
// Set up action bar.
final ActionBar actionBar = getActionBar();

actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setTitle("Particle emitter settings");

// get the preferences for this screen
preferences = this.getSharedPreferences("base_world", 0);

// tab holder
setContentView(R.layout.tabmenu_holder);
mViewPager = (ViewPager) findViewById(R.id.pager);

mDemoCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mDemoCollectionPagerAdapter);
}

public class CollectionPagerAdapter extends FragmentStatePagerAdapter
{
public CollectionPagerAdapter(FragmentManager fm)
{
super(fm);
}

@Override
public Fragment getItem(int i)
{
Fragment fragment = new TabFragment();
Bundle args = new Bundle();
if(preferences != null)
{
if(i == 0)
{// world
args.putBoolean("world", true);
} else
{// emitter
args.putBoolean("world", false);
args.putInt("emitter", i-1);
}
}
fragment.setArguments(args);
return fragment;
}

@Override
public int getCount()
{
return 100;
}

@Override
public CharSequence getPageTitle(int position)
{
if(position == 0)
{
return "World";
} else
{
return "Emitter #" + position;
}
}
}

public static class TabFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
Bundle args = getArguments();
View rootView = new TextView(context);// use a textview as the default

if(args.getBoolean("world"))
{
rootView = inflater.inflate(R.layout.m_backdrop, container, false);

// add face drop-down
ExpandableListView face_list = (ExpandableListView) rootView.findViewById(R.id.FaceList);
if(face_list != null)
{
face_list.setAdapter(new ExpandableFaceList(context));
face_list.setOnGroupClickListener(new OnGroupClickListener()
{

@Override
public boolean onGroupClick(ExpandableListView parent,
View v, int groupPosition, long id)
{
Log.i("FaceList", "Clicked:" + groupPosition);
return false;
}
});
}

} else
{
return rootView;
}
return rootView;
}
}
}

= 可扩展 ListView 适配器

public class ExpandableFaceList extends BaseExpandableListAdapter implements ExpandableListAdapter
{
public Context context;
private LayoutInflater inflator;
private float mDensity = 1f;

private boolean bShowSw = true;
private ColorPickerMenuView cp;
private Switch sw;


public ExpandableFaceList(Context context)
{
this.context = context;
this.inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

mDensity = context.getResources().getDisplayMetrics().density;
}

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

@Override
public int getChildrenCount(int groupPosition)
{
return 6;// because there are 6 faces to a cube
}

// list views
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
{
View v = convertView;
TextView tv;

if(v == null)
{
v = inflator.inflate(R.layout.exlist_head, parent, false);

tv = (TextView) v.findViewById(R.id.exList_Title);
if(tv != null)
tv.setText("Face Colors");

tv = (TextView) v.findViewById(R.id.exList_Summary);
String s_text = "The color for each face, click to ";
s_text += ((isExpanded)? "collaspe": "expand");
if(tv != null)
tv.setText(s_text);
} else
{
tv = (TextView) v.findViewById(R.id.exList_Summary);
String s_text = "The color for each face, click to ";
s_text += ((isExpanded)? "collaspe": "expand");
if(tv != null)
tv.setText(s_text);
parent.invalidate();
}

return v;
}

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

if(v == null)
{
if(bShowSw)
{
v = (LinearLayout) inflator.inflate(R.layout.face_info_sw, parent, false);
} else
{
v = (LinearLayout) inflator.inflate(R.layout.face_info, parent, false);
}
}

switch(childPosition)
{
case 0:
v.setTag("Front");
break;
case 1:
v.setTag("Back");
break;
case 2:
v.setTag("Left");
break;
case 3:
v.setTag("Right");
break;
case 4:
v.setTag("Top");
break;
case 5:
v.setTag("Bottom");
break;
}

Log.i("ELV", "Pos:" + childPosition);

cp = (ColorPickerMenuView) v.findViewById(R.id.face_color);
cp.setTitle((String) v.getTag());

cp.setOnClickListener(new OnClickListener() {
public void onClick(View v) { UpdateData(v); }
});

if(bShowSw)
{
sw = (Switch) v.findViewById(R.id.face_sw);
sw.setOnClickListener(new OnClickListener() {
public void onClick(View v) { UpdateData(v); }
});
}

return v;
}

private void UpdateData(View v) { }

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

@Override
public Object getChild(int groupPosition, int childPosition)
{
return "Child:" + groupPosition + "." + childPosition;
}

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

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

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

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

= Activity 的 xml View

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:textColor="#fff"
android:paddingTop="4dp"
android:paddingBottom="4dp" />

</android.support.v4.view.ViewPager>

= m_backdrop.xml(背景设置菜单)

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:app="http://schemas.android.com/apk/res/com.zyphronics.aquafinger">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<TextView
android:id="@+id/Title_GeneralSettings_text"
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:text="General Settings" />

<ExpandableListView
android:id="@+id/FaceList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/Title_GeneralSettings_text" >
</ExpandableListView>

</RelativeLayout>

</ScrollView>

= face_info.sw.xml(face_info.xml是一样的,只是没有switch)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<Switch
android:id="@+id/face_sw"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:tag="face_sw"
android:text="Enabled?"
android:textOff="No"
android:textOn="Yes" />

<com.zyphronics.AF.Controls.colorpicker.ColorPickerMenuView
android:id="@+id/face_color"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:tag="face_color" />
</LinearLayout>

即使没有 face_info_sw.xml 中的“ColorPickerMenuView”部分, subview 仍未被调用。我也尝试过单独使用相对布局,而不是在 ScrollView 中,但这会阻止进一步添加的项目滚动到(并且还使自定义控件具有奇怪的大小)。

任何解决这个问题的帮助都会很棒。如果有人需要这个的打包源(兼容 eclipse),如评论中所示,我会回复一个链接。

最佳答案

问题是,您的 ExpandableListView 在 ScrollView 中。大多数情况下这是不良布局的结果,您应该尽量避免这种情况。

但有时它是唯一的解决方案(这实际上不是真的,但其他解决方案可能超出了一个范围)。您的解决方案也有效,但有点复杂。而是像这样编写一个自定义的 ExpandableListView:

public class ExpandExpandableListView extends ExpandableListView{
boolean expanded = true;

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

public ExpandExpandableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ExpandExpandableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public boolean isExpanded()
{
return expanded;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (isExpanded())
{
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);

ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}

在您的 m_backdrop.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
...

<RelativeLayout
...

<com.package.name.to.class.ExpandExpandableListView
android:id="@+id/FaceList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/Title_GeneralSettings_text" >
</ExpandableListView>

</RelativeLayout>

</ScrollView>

已经是这样了。它应该按预期工作。

关于android - getChildView 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15651288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com