| /* |
| * Copyright (C) 2013 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.documentsui; |
| |
| import android.database.DataSetObserver; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.BaseAdapter; |
| import android.widget.LinearLayout; |
| import android.widget.ListAdapter; |
| import android.widget.ListView; |
| |
| import com.android.internal.util.Preconditions; |
| |
| /** |
| * Adapter that wraps an existing adapter, presenting its contents in multiple |
| * equally-sized horizontal columns. |
| */ |
| public class ColumnAdapter extends BaseAdapter { |
| private final ListAdapter mWrapped; |
| private final OnItemClickListener mListener; |
| |
| private int mColumns = 1; |
| |
| public interface OnItemClickListener { |
| public void onItemClick(ListAdapter adapter, int position); |
| } |
| |
| public ColumnAdapter(ListAdapter wrapped, OnItemClickListener listener) { |
| mWrapped = Preconditions.checkNotNull(wrapped); |
| mListener = Preconditions.checkNotNull(listener); |
| |
| if (!wrapped.areAllItemsEnabled()) { |
| throw new IllegalStateException("All items must be enabled"); |
| } |
| if (wrapped.getViewTypeCount() > 1) { |
| throw new IllegalStateException("All items must be identical"); |
| } |
| } |
| |
| public static void prepare(ListView list) { |
| list.setItemsCanFocus(true); |
| } |
| |
| public void setColumns(int columns) { |
| mColumns = columns; |
| notifyDataSetChanged(); |
| } |
| |
| private View.OnClickListener mItemListener = new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| final int position = (Integer) v.getTag(); |
| mListener.onItemClick(mWrapped, position); |
| } |
| }; |
| |
| @Override |
| public int getCount() { |
| return (mWrapped.getCount() + mColumns - 1) / mColumns; |
| } |
| |
| @Override |
| public Object getItem(int position) { |
| return position; |
| } |
| |
| @Override |
| public long getItemId(int position) { |
| return position; |
| } |
| |
| @Override |
| public View getView(int position, View convertView, ViewGroup parent) { |
| if (convertView == null) { |
| convertView = new LinearLayout(parent.getContext()); |
| } |
| |
| final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( |
| 0, LinearLayout.LayoutParams.WRAP_CONTENT); |
| params.weight = 1f / mColumns; |
| |
| final LinearLayout row = (LinearLayout) convertView; |
| final int first = position * mColumns; |
| final int last = mWrapped.getCount() - 1; |
| |
| for (int i = 0; i < mColumns; i++) { |
| View convertItem = null; |
| if (i < row.getChildCount()) { |
| convertItem = row.getChildAt(i); |
| } |
| |
| final int pos = first + i; |
| final int validPos = Math.min(pos, last); |
| final View item = mWrapped.getView(validPos, convertItem, row); |
| item.setTag(validPos); |
| item.setOnClickListener(mItemListener); |
| item.setFocusable(true); |
| |
| if (pos == validPos) { |
| item.setVisibility(View.VISIBLE); |
| } else { |
| item.setVisibility(View.INVISIBLE); |
| } |
| |
| if (convertItem == null) { |
| row.addView(item, params); |
| } |
| } |
| |
| return convertView; |
| } |
| |
| @Override |
| public void registerDataSetObserver(DataSetObserver observer) { |
| super.registerDataSetObserver(observer); |
| mWrapped.registerDataSetObserver(observer); |
| } |
| |
| @Override |
| public void unregisterDataSetObserver(DataSetObserver observer) { |
| super.unregisterDataSetObserver(observer); |
| mWrapped.unregisterDataSetObserver(observer); |
| } |
| } |