android-PageAdapter';s addView方法引发异常;指定的子项已具有父项。”;
我有一个自定义页面适配器,它是动态的,允许您添加和删除视图。我从中找到了代码 MainPagerAdapterandroid-PageAdapter';s addView方法引发异常;指定的子项已具有父项。”;,android,android-viewpager,android-view,android-adapter,android-dialog,Android,Android Viewpager,Android View,Android Adapter,Android Dialog,我有一个自定义页面适配器,它是动态的,允许您添加和删除视图。我从中找到了代码 MainPagerAdapter public class MainPagerAdapter extends PagerAdapter { private ArrayList<View> views = new ArrayList<View>(); @Override public int getItemPosition(Object object) {
public class MainPagerAdapter extends PagerAdapter {
private ArrayList<View> views = new ArrayList<View>();
@Override
public int getItemPosition(Object object) {
int index = views.indexOf(object);
if (index == -1)
return POSITION_NONE;
else
return index;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = views.get(position);
container.addView(v);
return v;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
public int addView(View v) {
return addView(v, views.size());
}
public int addView(View v, int position) {
views.add(position, v);
return position;
}
public int removeView(ViewPager pager, View v) {
for (int i = 0; i < views.size(); i++) {
if (views.get(i).getTag().equals(v.getTag()))
return removeView(pager, i);
}
return -1;
}
public int removeView(ViewPager pager, int position) {
pager.setAdapter(null);
views.remove(position);
pager.setAdapter(this);
return position;
}
public View getView(int position) {
return views.get(position);
}
}
此外,这里还有PopupHandler(类填充查看页面
并添加视图):
公共类PopupHandler{
私人语境;
私有布尔isPopUpShowing;
私有列表类型列表;
私有ViewPager pager=null;
private MainPagerAdapter pagerAdapter=null;
私有视图垂直操作员;
私有文本视图警报号码;
私人AlertDialog AlertDialog;
公共PopupHandler(上下文){
this.context=上下文;
...
}
公共无效手册(IAlarmInfo alarmInfo){
//检查一些圆锥曲线
如果(新警报){
alarmTypeList.add(alarmInfo.getAlarmType());
如果(…){
//第一次创建对话框和添加视图
showDiaog(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
isPopUpShowing=true;
}否则{
//添加视图
视图v=设置视图(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
addView(v);
}
}否则{
if(alarmTypeList.contains(alarmInfo.getAlarmType())){
//删除视图
alarmTypeList.remove(alarmInfo.getAlarmType());
视图v=设置视图(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
移除视图(v);
if(alarmTypeList.size()==0&&alertDialog.isShowing()){
//如果列表为空,则关闭对话框
alertDialog.disclose();
isPopUpShowing=假;
}
}
}
}
私有void showDiaog(最终字符串标题、最终字符串摘要、最终int图标、AlarmType AlarmType){
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(新建ContextThemeWrapper(context,R.style.myDialog));
dialogBuilder.setCancelable(false);
LayoutFlater充气机=LayoutFlater.from(上下文);
视图对话框视图=充气机。充气(R.layout.popups\u容器,空);
ButterKnife.bind(这个,dialogView);
pager=(ViewPager)dialogView.findViewById(R.id.popup\u view\u pager);
寻呼机设置适配器(pagerAdapter);
pager.setOffscreenPageLimit(5);
pager.addOnPageChangeListener(新的ViewPager.OnPageChangeListener(){
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
}
@凌驾
已选择页面上的公共无效(内部位置){
Log.i(“测试”、“页面选择”+位置);
alertNumber.setText(“+pagerAdapter.getCount()”的(位置+1)+”号);
}
@凌驾
公共无效onPageScrollStateChanged(int状态){
}
});
alertNumber=(TextView)dialogView.findViewById(R.id.popup\u alert\u number);
alertNumber.setText((alarmTypeList.indexOf(alarmType)+1)+“+alarmTypeList.size()中的“);
VerticallineOperator=dialogView.findViewById(R.id.popup\u vertical\u Separator);
setBackgroundColor(alertNumber.GetTextColor().getDefaultColor());
视图v=设置视图(标题、摘要、图标、报警类型);
pagerAdapter.addView(v,0);
pagerAdapter.notifyDataSetChanged();
dialogBuilder.setView(dialogView);
alertDialog=dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE\系统\警报);
alertDialog.show();
}
私有视图设置视图(字符串标题、字符串摘要、int图标、AlarmType AlarmType){
视图v1=LayoutFlater.from(上下文)。充气(R.layout.popup,null);
TextView titleText=(TextView)v1.findViewById(R.id.popup_title);
TextView摘要text=(TextView)v1.findViewById(R.id.popup\u摘要);
ImageView图标上下文=(ImageView)v1.findViewById(R.id.popup\u alert\u图标);
titleText.setText(标题);
summaryText.setText(摘要);
setImageResource(图标);
v1.设置标签(报警类型);
返回v1;
}
公共void addView(查看新页面){
int pageIndex=pagerAdapter.addView(newPage);
pagerAdapter.notifyDataSetChanged();
setCurrentItem(pageIndex,true);
}
public void removeView(视图失效页){
int pageIndex=pagerAdapter.removeView(寻呼机,失效页);
//如果当前页面是“defunctPage”,您可能需要选择要显示的页面。
如果(页面索引==-1)
返回;
如果(pageIndex==pagerAdapter.getCount())
页面索引--;
pager.setCurrentItem(页面索引);
alertNumber.setText((pageIndex+1)+“of”+alarmTypeList.size());
}
公共视图getCurrentPage(){
返回pagerDatapter.getView(pager.getCurrentItem());
}
公共无效设置当前页面(查看页面显示){
pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow),true);
}
public void hidePopup(){
如果(alertDialog!=null)
如果(alertDialog.isShowing()){
alertDialog.disclose();
alarmTypeList.clear();
}
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = views.get(position);
container.addView(v); // here is the crash
return v;
}
public class PopupHandler {
private Context context;
private boolean isPopUpShowing;
private List<AlarmType> alarmTypeList;
private ViewPager pager = null;
private MainPagerAdapter pagerAdapter = null;
private View verticalLineSeperator;
private TextView alertNumber;
private AlertDialog alertDialog;
public PopupHandler(Context context) {
this.context = context;
...
}
public void handleAlert(IAlarmInfo alarmInfo) {
// checking some conidtions
if (newAlarm) {
alarmTypeList.add(alarmInfo.getAlarmType());
if (...) {
// first time creating dialog and adding view
showDiaog(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
isPopUpShowing = true;
} else {
// adding view
View v = setUpView(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
addView(v);
}
} else {
if (alarmTypeList.contains(alarmInfo.getAlarmType())) {
//remove view
alarmTypeList.remove(alarmInfo.getAlarmType());
View v = setUpView(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
removeView(v);
if (alarmTypeList.size() == 0 && alertDialog.isShowing()) {
// if list empty dismiss dialog
alertDialog.dismiss();
isPopUpShowing = false;
}
}
}
}
private void showDiaog(final String title, final String summary, final int icon, AlarmType alarmType) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
dialogBuilder.setCancelable(false);
LayoutInflater inflater = LayoutInflater.from(context);
View dialogView = inflater.inflate(R.layout.popups_container, null);
ButterKnife.bind(this, dialogView);
pager = (ViewPager) dialogView.findViewById(R.id.popup_view_pager);
pager.setAdapter(pagerAdapter);
pager.setOffscreenPageLimit(5);
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.i("testing", "onPageSelected " + position);
alertNumber.setText((position + 1) + " of " + pagerAdapter.getCount());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
alertNumber = (TextView) dialogView.findViewById(R.id.popup_alert_number);
alertNumber.setText((alarmTypeList.indexOf(alarmType) + 1) + " of " + alarmTypeList.size());
verticalLineSeperator = dialogView.findViewById(R.id.popup_vertical_seperator);
verticalLineSeperator.setBackgroundColor(alertNumber.getTextColors().getDefaultColor());
View v = setUpView(title, summary, icon, alarmType);
pagerAdapter.addView(v, 0);
pagerAdapter.notifyDataSetChanged();
dialogBuilder.setView(dialogView);
alertDialog = dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
private View setUpView(String title, String summary, int icon, AlarmType alarmType) {
View v1 = LayoutInflater.from(context).inflate(R.layout.popup, null);
TextView titleText = (TextView) v1.findViewById(R.id.popup_title);
TextView summaryText = (TextView) v1.findViewById(R.id.popup_summary);
ImageView iconText = (ImageView) v1.findViewById(R.id.popup_alert_icon);
titleText.setText(title);
summaryText.setText(summary);
iconText.setImageResource(icon);
v1.setTag(alarmType);
return v1;
}
public void addView(View newPage) {
int pageIndex = pagerAdapter.addView(newPage);
pagerAdapter.notifyDataSetChanged();
pager.setCurrentItem(pageIndex, true);
}
public void removeView(View defunctPage) {
int pageIndex = pagerAdapter.removeView(pager, defunctPage);
// You might want to choose what page to display, if the current page was "defunctPage".
if (pageIndex == -1)
return;
if (pageIndex == pagerAdapter.getCount())
pageIndex--;
pager.setCurrentItem(pageIndex);
alertNumber.setText((pageIndex + 1) + " of " + alarmTypeList.size());
}
public View getCurrentPage() {
return pagerAdapter.getView(pager.getCurrentItem());
}
public void setCurrentPage(View pageToShow) {
pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow), true);
}
public void hidePopup() {
if (alertDialog != null)
if (alertDialog.isShowing()) {
alertDialog.dismiss();
alarmTypeList.clear();
}
}
}