1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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.android.messaging.ui;
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.CursorAdapter;
import android.widget.ListView;
import com.android.messaging.util.ImeUtil;
/**
* Produces and holds a list view and its tab header to be displayed in a ViewPager.
*/
public abstract class CustomHeaderPagerListViewHolder extends BasePagerViewHolder
implements CustomHeaderPagerViewHolder {
private final Context mContext;
private final CursorAdapter mListAdapter;
private boolean mListCursorInitialized;
private ListView mListView;
public CustomHeaderPagerListViewHolder(final Context context,
final CursorAdapter adapter) {
mContext = context;
mListAdapter = adapter;
}
@Override
protected View createView(ViewGroup container) {
final LayoutInflater inflater = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.inflate(
getLayoutResId(),
null /* root */,
false /* attachToRoot */);
final ListView listView = (ListView) view.findViewById(getListViewResId());
listView.setAdapter(mListAdapter);
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
if (scrollState != SCROLL_STATE_IDLE) {
ImeUtil.get().hideImeKeyboard(mContext, view);
}
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount) {
}
});
mListView = listView;
maybeSetEmptyView();
return view;
}
public void onContactsCursorUpdated(final Cursor data) {
mListAdapter.swapCursor(data);
if (!mListCursorInitialized) {
// We set the emptyView here instead of in create so that the initial load won't show
// the empty UI - the system handles this and doesn't do what we would like.
mListCursorInitialized = true;
maybeSetEmptyView();
}
}
/**
* We don't want to show the empty view hint until BOTH conditions are met:
* 1. The view has been created.
* 2. Cursor data has been loaded once.
* Due to timing when data is loaded, the view may not be ready (and vice versa). So we
* are calling this method from both onContactsCursorUpdated & createView.
*/
private void maybeSetEmptyView() {
if (mView != null && mListCursorInitialized) {
final ListEmptyView emptyView = (ListEmptyView) mView.findViewById(getEmptyViewResId());
if (emptyView != null) {
emptyView.setTextHint(getEmptyViewTitleResId());
emptyView.setImageHint(getEmptyViewImageResId());
final ListView listView = (ListView) mView.findViewById(getListViewResId());
listView.setEmptyView(emptyView);
}
}
}
public void invalidateList() {
mListAdapter.notifyDataSetChanged();
}
/**
* In order for scene transition to work, we toggle the visibility for each individual list
* view items so that they can be properly tracked by the scene transition manager.
* @param show whether the pending transition is to show or hide the list.
*/
public void toggleVisibilityForPendingTransition(final boolean show, final View epicenterView) {
if (mListView == null) {
return;
}
final int childCount = mListView.getChildCount();
for (int i = 0; i < childCount; i++) {
final View childView = mListView.getChildAt(i);
if (childView != epicenterView) {
childView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
}
}
}
@Override
public CharSequence getPageTitle(Context context) {
return context.getString(getPageTitleResId());
}
protected abstract int getLayoutResId();
protected abstract int getPageTitleResId();
protected abstract int getEmptyViewResId();
protected abstract int getEmptyViewTitleResId();
protected abstract int getEmptyViewImageResId();
protected abstract int getListViewResId();
}
|