/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.iosched.ui.widget;
import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import com.google.samples.apps.iosched.provider.ScheduleContract;
import com.google.samples.apps.iosched.ui.MyScheduleAdapter;
import static com.google.samples.apps.iosched.util.LogUtils.LOGD;
import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag;
/**
* My Schedule view. This view is a linear layout showing all schedule items from an adapter.
* This is different from the MyScheduleFragment, which is a ListFragment based on the adapter.
* The fundamental difference is that while the ListFragment has built-in scrolling, this
* view does NOT scroll, it resizes to fit all items. It is suitable for use as part of a
* larger view where you want the larger view to scroll as one, with this list inside it.
*/
public class MyScheduleView extends LinearLayout {
private static final String TAG = makeLogTag("MyScheduleView");
MyScheduleAdapter mAdapter = null;
DataSetObserver mObserver = null;
public MyScheduleView(Context context) {
this(context, null, 0);
}
public MyScheduleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyScheduleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOrientation(LinearLayout.VERTICAL);
}
public void setAdapter(MyScheduleAdapter adapter) {
if (mAdapter != null && mObserver != null) {
mAdapter.unregisterDataSetObserver(mObserver);
mObserver = null;
}
mAdapter = adapter;
rebuild();
if (mAdapter != null) {
mAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
rebuild();
}
@Override
public void onInvalidated() {
setAdapter(null);
}
});
}
}
private void setViewAt(int i, View view) {
if (i < getChildCount()) {
View viewToReplace = getChildAt(i);
if (viewToReplace != view) {
addView(view, i);
removeView(viewToReplace);
}
} else {
addView(view);
}
}
public void rebuild() {
LOGD(TAG, "Rebuilding MyScheduleView.");
int i;
int count = (mAdapter == null) ? 0 : mAdapter.getCount();
LOGD(TAG, "Adapter has " + count + " items.");
for (i = 0; i < count; i++) {
LOGD(TAG, "Setting up view#" + i);
View recycle = i < getChildCount() ? getChildAt(i) : null;
LOGD(TAG, "view#" + i + ", recycle=" + recycle);
View view = mAdapter.getView(i, recycle, this);
if (i < getChildCount()) {
LOGD(TAG, "setting view#" + i);
setViewAt(i, view);
} else {
LOGD(TAG, "adding view #" + i);
addView(view);
}
}
for (; i < getChildCount(); i++) {
LOGD(TAG, "removing view #" + i);
removeViewAt(i);
}
requestLayout();
}
}