Commit 26550ad4 authored by Daniel Olshansky's avatar Daniel Olshansky Committed by Chet Haase
Browse files

First commit for ListViewExpandingCells.

Change-Id: I8d64562f8c7c0e207aef0b36df10ee3744dd446a
(cherry picked from commit 8cfd63c9)
parent c304d108
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.expandingcells"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="16"
android:targetSdkVersion="17"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name=".ExpandingCells"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
samples/devbytes/animation/ListViewExpandingCells/res/drawable-hdpi/rock.jpg

20.7 KB

<!-- 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.
-->
<com.example.android.expandingcells.ExpandingListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />
<!-- 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/border"
android:orientation="vertical">
<LinearLayout
android:id="@+id/item_linear_layout"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/image_view"
android:layout_height="match_parent"
android:layout_width="0dp"
android:gravity="center_vertical"
android:layout_weight="1"
android:scaleType="center"/>
<TextView
android:id="@+id/title_view"
android:layout_height="fill_parent"
android:layout_width="0dp"
android:gravity="center"
android:layout_weight="2"
android:textStyle="bold"
android:textSize="22sp"
android:textColor="#ffffff"/>
</LinearLayout>
<com.example.android.expandingcells.ExpandingLayout
android:id="@+id/expanding_layout"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:visibility="gone">
<TextView
android:id="@+id/text_view"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:textStyle="bold"
android:textSize="22sp"
android:textColor="#ffffff"
android:gravity="center_horizontal"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingBottom="20dp"/>
</com.example.android.expandingcells.ExpandingLayout>
</LinearLayout>
\ No newline at end of file
<!-- 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.
-->
<resources>
<string name="app_name">ExpandingCells</string>
<string name="short_lorem_ipsum">Lorem ipsum dolor sit amet, consectetur adipiscing elit</string>
<string name="medium_lorem_ipsum">"Pellentesque dictum sit amet sapien in faucibus. Curabitur fermentum, nulla quis placerat imperdiet, est nisi placerat arcu, non ornare erat justo at enim. Nam vitae porttitor sem. Quisque non quam nisi. Proin quis urna id elit ultrices cursus non tempus dolor"</string>
<string name="long_lorem_ipsum">"Mauris dapibus convallis massa, vitae ultrices est ultricies ut. Nam porttitor et metus ac bibendum. Nam at justo vitae felis lacinia ultrices laoreet ut arcu. Nam ac purus et turpis convallis mollis. Integer lorem eros, hendrerit imperdiet interdum vitae, sagittis eget ipsum. Donec dignissim tortor at felis fringilla, sed dignissim diam vulputate. Nam sit amet facilisis massa. Suspendisse posuere quam quis augue dapibus venenatis."</string>
</resources>
/*
* 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.example.android.expandingcells;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
/**
* This is a custom array adapter used to populate the listview whose items will
* expand to display extra content in addition to the default display.
*/
public class CustomArrayAdapter extends ArrayAdapter<ExpandableListItem> {
private List<ExpandableListItem> mData;
private int mLayoutViewResourceId;
public CustomArrayAdapter(Context context, int layoutViewResourceId,
List<ExpandableListItem> data) {
super(context, layoutViewResourceId, data);
mData = data;
mLayoutViewResourceId = layoutViewResourceId;
}
/**
* Populates the item in the listview cell with the appropriate data. This method
* sets the thumbnail image, the title and the extra text. This method also updates
* the layout parameters of the item's view so that the image and title are centered
* in the bounds of the collapsed view, and such that the extra text is not displayed
* in the collapsed state of the cell.
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ExpandableListItem object = mData.get(position);
if(convertView == null) {
LayoutInflater inflater = ((Activity) getContext()).getLayoutInflater();
convertView = inflater.inflate(mLayoutViewResourceId, parent, false);
}
LinearLayout linearLayout = (LinearLayout)(convertView.findViewById(
R.id.item_linear_layout));
LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams
(AbsListView.LayoutParams.MATCH_PARENT, object.getCollapsedHeight());
linearLayout.setLayoutParams(linearLayoutParams);
ImageView imgView = (ImageView)convertView.findViewById(R.id.image_view);
TextView titleView = (TextView)convertView.findViewById(R.id.title_view);
TextView textView = (TextView)convertView.findViewById(R.id.text_view);
titleView.setText(object.getTitle());
imgView.setImageBitmap(getCroppedBitmap(BitmapFactory.decodeResource(getContext()
.getResources(), object.getImgResource(), null)));
textView.setText(object.getText());
convertView.setLayoutParams(new ListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
AbsListView.LayoutParams.WRAP_CONTENT));
ExpandingLayout expandingLayout = (ExpandingLayout)convertView.findViewById(R.id
.expanding_layout);
expandingLayout.setExpandedHeight(object.getExpandedHeight());
expandingLayout.setSizeChangedListener(object);
if (!object.isExpanded()) {
expandingLayout.setVisibility(View.GONE);
} else {
expandingLayout.setVisibility(View.VISIBLE);
}
return convertView;
}
/**
* Crops a circle out of the thumbnail photo.
*/
public Bitmap getCroppedBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Config.ARGB_8888);
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
paint.setAntiAlias(true);
int halfWidth = bitmap.getWidth()/2;
int halfHeight = bitmap.getHeight()/2;
canvas.drawCircle(halfWidth, halfHeight, Math.max(halfWidth, halfHeight), paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
\ No newline at end of file
/*
* 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.example.android.expandingcells;
/**
* This custom object is used to populate the list adapter. It contains a reference
* to an image, title, and the extra text to be displayed. Furthermore, it keeps track
* of the current state (collapsed/expanded) of the corresponding item in the list,
* as well as store the height of the cell in its collapsed state.
*/
public class ExpandableListItem implements OnSizeChangedListener {
private String mTitle;
private String mText;
private boolean mIsExpanded;
private int mImgResource;
private int mCollapsedHeight;
private int mExpandedHeight;
public ExpandableListItem(String title, int imgResource, int collapsedHeight, String text) {
mTitle = title;
mImgResource = imgResource;
mCollapsedHeight = collapsedHeight;
mIsExpanded = false;
mText = text;
mExpandedHeight = -1;
}
public boolean isExpanded() {
return mIsExpanded;
}
public void setExpanded(boolean isExpanded) {
mIsExpanded = isExpanded;
}
public String getTitle() {
return mTitle;
}
public int getImgResource() {
return mImgResource;
}
public int getCollapsedHeight() {
return mCollapsedHeight;
}
public void setCollapsedHeight(int collapsedHeight) {
mCollapsedHeight = collapsedHeight;
}
public String getText() {
return mText;
}
public void setText(String text) {
mText = text;
}
public int getExpandedHeight() {
return mExpandedHeight;
}
public void setExpandedHeight(int expandedHeight) {
mExpandedHeight = expandedHeight;
}
@Override
public void onSizeChanged(int newHeight) {
setExpandedHeight(newHeight);
}
}
/*
* 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.example.android.expandingcells;
import android.app.Activity;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
/**
* This activity creates a listview whose items can be clicked to expand and show
* additional content.
*
* In this specific demo, each item in a listview displays an image and a corresponding
* title. These two items are centered in the default (collapsed) state of the listview's
* item. When the item is clicked, it expands to display text of some varying length.
* The item persists in this expanded state (even if the user scrolls away and then scrolls
* back to the same location) until it is clicked again, at which point the cell collapses
* back to its default state.
*/
public class ExpandingCells extends Activity {
private final int CELL_DEFAULT_HEIGHT = 200;
private final int NUM_OF_CELLS = 30;
private ExpandingListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ExpandableListItem[] values = new ExpandableListItem[] {
new ExpandableListItem("Chameleon", R.drawable.chameleon, CELL_DEFAULT_HEIGHT,
getResources().getString(R.string.short_lorem_ipsum)),
new ExpandableListItem("Rock", R.drawable.rock, CELL_DEFAULT_HEIGHT,
getResources().getString(R.string.medium_lorem_ipsum)),
new ExpandableListItem("Flower", R.drawable.flower, CELL_DEFAULT_HEIGHT,
getResources().getString(R.string.long_lorem_ipsum)),
};
List<ExpandableListItem> mData = new ArrayList<ExpandableListItem>();
for (int i = 0; i < NUM_OF_CELLS; i++) {
ExpandableListItem obj = values[i % values.length];
mData.add(new ExpandableListItem(obj.getTitle(), obj.getImgResource(),
obj.getCollapsedHeight(), obj.getText()));
}
CustomArrayAdapter adapter = new CustomArrayAdapter(this, R.layout.list_view_item, mData);
mListView = (ExpandingListView)findViewById(R.id.main_list_view);
mListView.setAdapter(adapter);
mListView.setDivider(null);
}
}
\ No newline at end of file
/*
* 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.example.android.expandingcells;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
/**
* This layout is used to contain the extra information that will be displayed
* when a certain cell is expanded. The custom relative layout is created in
* order to achieve a fading affect of this layout's contents as it is being
* expanded or collapsed as opposed to just fading the content in(out) after(before)
* the cell expands(collapses).
*
* During expansion, layout takes place so the full contents of this layout can
* be displayed. When the size changes to display the full contents of the layout,
* its height is stored. When the view is collapsing, this layout's height becomes 0
* since it is no longer in the visible part of the cell.By overriding onMeasure, and
* setting the height back to its max height, it is still visible during the collapse
* animation, and so, a fade out effect can be achieved.
*/
public class ExpandingLayout extends RelativeLayout {
private OnSizeChangedListener mSizeChangedListener;
private int mExpandedHeight = -1;
public ExpandingLayout(Context context) {
super(context);
}
public ExpandingLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandingLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
if (mExpandedHeight > 0) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(mExpandedHeight, MeasureSpec.AT_MOST);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
protected void onSizeChanged (int w, int h, int oldw, int oldh) {
mExpandedHeight = h;
//Notifies the list data object corresponding to this layout that its size has changed.
mSizeChangedListener.onSizeChanged(h);
}
public int getExpandedHeight() {
return mExpandedHeight;
}
public void setExpandedHeight(int expandedHeight) {
mExpandedHeight = expandedHeight;
}
public void setSizeChangedListener(OnSizeChangedListener listener) {
mSizeChangedListener = listener;
}
}
/*
* 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.example.android.expandingcells;
/**
* A listener used to update the list data object when the corresponding expanding
* layout experiences a size change.
*/
public interface OnSizeChangedListener {
public void onSizeChanged(int newHeight);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment