This repository has been archived by the owner on Apr 23, 2019. It is now read-only.
/
ListAsGridBaseAdapter.java
176 lines (151 loc) · 5 KB
/
ListAsGridBaseAdapter.java
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package com.plattysoft.ui;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
/**
* Created by shalafi on 6/6/13.
*/
public abstract class ListAsGridBaseAdapter extends BaseAdapter {
private class ListItemClickListener implements OnClickListener {
private int mPosition;
public ListItemClickListener(int currentPos) {
mPosition = currentPos;
}
@Override
public void onClick(View v) {
onGridItemClicked (v, mPosition);
}
}
private int mNumColumns;
private Context mContext;
private GridItemClickListener mGridItemClickListener;
private int mBackgroundResource = -1;
public ListAsGridBaseAdapter(Context context) {
mContext = context;
mNumColumns = 1;
}
public void setBackgroundResource(int drawableResId) {
mBackgroundResource = drawableResId;
}
public final void setOnGridClickListener(GridItemClickListener listener) {
mGridItemClickListener = listener;
}
private final void onGridItemClicked(View v, int position) {
if (mGridItemClickListener != null) {
mGridItemClickListener.onGridItemClicked(v, position, getItemId(position));
}
}
public final int getNumColumns() {
return mNumColumns;
}
public final void setNumColumns(int numColumns) {
mNumColumns = numColumns;
notifyDataSetChanged();
}
@Override
public final int getCount() {
return (int) Math.ceil(getItemCount()*1f / getNumColumns());
}
public abstract int getItemCount();
protected abstract View getItemView(int position, View view, ViewGroup parent);
@Override
public final View getView(int position, View view, ViewGroup viewGroup) {
LinearLayout layout;
int columnWidth = 0;
if (viewGroup != null) {
columnWidth = viewGroup.getWidth()/mNumColumns;
}
else if (view != null) {
columnWidth = view.getWidth()/mNumColumns;;
}
// Make it be rows of the number of columns
if (view == null) {
// This is items view
layout = createItemRow(position, viewGroup, columnWidth);
}
else {
layout = (LinearLayout) view;
updateItemRow(position, viewGroup, layout, columnWidth);
}
return layout;
}
@Override
public int getViewTypeCount() {
// Not necessary for only 1 column
if (getNumColumns() == 1) return 1;
return 2;
}
@Override
public int getItemViewType(int position) {
// Not necessary for only 1 column
if (getNumColumns() == 1) return 0;
// If we have an odd item count and this is the last row, use the view type with filler views
if (getItemCount() % 2 != 0 && position == getCount() - 1) {
return 1;
}
return 0;
}
private LinearLayout createItemRow(int position, ViewGroup viewGroup, int columnWidth) {
LinearLayout layout;
layout = new LinearLayout(mContext);
if (mBackgroundResource > 0) {
layout.setBackgroundResource(mBackgroundResource);
}
int adjustedColumnWidth = columnWidth - (layout.getPaddingLeft() + layout.getPaddingRight())/mNumColumns;
layout.setOrientation(LinearLayout.HORIZONTAL);
// Now add the sub views to it
for (int i = 0; i < mNumColumns; i++) {
int currentPos = position * mNumColumns + i;
// Get the new View
View insideView;
if (currentPos < getItemCount()) {
insideView = getItemView(currentPos, null, viewGroup);
insideView.setVisibility(View.VISIBLE);
View theView = getItemView(currentPos, insideView, viewGroup);
theView.setOnClickListener(new ListItemClickListener (currentPos));
}
else {
insideView = new View(mContext);
insideView.setVisibility(View.INVISIBLE);
}
layout.addView(insideView);
// Set the width of this column
LayoutParams params = insideView.getLayoutParams();
params.width = adjustedColumnWidth;
insideView.setLayoutParams(params);
}
return layout;
}
private void updateItemRow(int position, ViewGroup viewGroup, LinearLayout layout, int columnWidth) {
int realColumnWidth = columnWidth - (layout.getPaddingLeft() + layout.getPaddingRight())/mNumColumns;
for (int i=0; i<mNumColumns; i++) {
int currentPos = position * mNumColumns + i;
View insideView = layout.getChildAt(i);
// If there are less views than objects. add a view here
if (insideView == null) {
insideView = new View(mContext);
layout.addView(insideView);
}
// Set the width of this column
LayoutParams params = insideView.getLayoutParams();
params.width = realColumnWidth;
insideView.setLayoutParams(params);
if (currentPos < getItemCount()) {
insideView.setVisibility(View.VISIBLE);
// Populate the view
View theView = getItemView(currentPos, insideView, viewGroup);
theView.setOnClickListener(new ListItemClickListener (currentPos));
if (!theView.equals(insideView)) {
// DO NOT CHANGE THE VIEWS
}
}
else {
insideView.setVisibility(View.INVISIBLE);
}
}
}
}