Skip to content

Commit

Permalink
补充 sample,调整细节
Browse files Browse the repository at this point in the history
  • Loading branch information
twiceyuan committed Mar 5, 2019
1 parent 483c19c commit 7cbd361
Show file tree
Hide file tree
Showing 13 changed files with 329 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public Builder<T> content(DropdownContent<T> content) {
}

public DropdownMenu<T> build() {
return new DropdownMenu<T>(header, content);
return new DropdownMenu<>(header, content);
}
}

Expand All @@ -56,7 +56,10 @@ private DropdownMenu(DropdownHeader<T> header, DropdownContent<T> content) {
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setOnDismissListener(() -> header.onChange(false));

header.setupShowListener(v -> mPopupWindow.showAsDropDown(v));
header.setupShowListener(v -> {
header.onChange(true);
mPopupWindow.showAsDropDown(v);
});
}

public void setOnChooseListener(OnChooseListener<T> onChooseListener) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.twiceyuan.dropdownmenu.widget;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

public abstract class BaseDropListAdapter<T, VH> extends BaseAdapter {

private final List<T> mData;

private int selected = -1;

public BaseDropListAdapter(List<T> strings) {
mData = strings;
}

public void setSelected(int selected) {
this.selected = selected;
notifyDataSetChanged();
}

protected abstract VH createHolder(View rootView);

@Override
public int getCount() {
return mData.size();
}

@Override
public T getItem(int position) {
return mData.get(position);
}

@Override
public long getItemId(int position) {
return mData.get(position).hashCode();
}

protected abstract int itemLayoutId();

@Override
public View getView(int position, View convertView, ViewGroup parent) {
VH holder;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), itemLayoutId(), null);
holder = createHolder(convertView);
convertView.setTag(holder);
} else {
//noinspection unchecked
holder = (VH) convertView.getTag();
}

if (selected == position) {
onBindSelected(getItem(position), holder);
} else {
onBindNormal(getItem(position), holder);
}

return convertView;
}

protected abstract void onBindSelected(T t, VH holder);

protected abstract void onBindNormal(T t, VH holder);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,47 @@

import android.graphics.Typeface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.twiceyuan.dropdownmenu.R;

import java.util.List;

public class DropListAdapter extends BaseAdapter {
public class DropListAdapter extends BaseDropListAdapter<String, DropListAdapter.ViewHolder> {

private final List<String> mStrings;

private int selected = -1;

public DropListAdapter(List<String> strings) {
mStrings = strings;
DropListAdapter(List<String> strings) {
super(strings);
}

public void setSelected(int selected) {
this.selected = selected;
notifyDataSetChanged();
@Override
protected ViewHolder createHolder(View rootView) {
return new ViewHolder(rootView);
}

@Override
public int getCount() {
return mStrings.size();
protected int itemLayoutId() {
return R.layout.ddm_item_drop_list;
}

@Override
public String getItem(int position) {
return mStrings.get(position);
protected void onBindSelected(String text, ViewHolder holder) {
holder.mTextView.setTextColor(0xFF000000);
holder.mTextView.setText(text);
holder.mTextView.setTypeface(null, Typeface.BOLD);
}

@Override
public long getItemId(int position) {
return mStrings.get(position).hashCode();
protected void onBindNormal(String s, ViewHolder holder) {
holder.mTextView.setTextColor(0xFF444444);
holder.mTextView.setText(s);
holder.mTextView.setTypeface(null, Typeface.NORMAL);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.ddm_item_drop_list, null);
}
TextView text = convertView.findViewById(android.R.id.text1);
text.setText(getItem(position));
if (selected == position) {
text.setTextColor(0xFF000000);
text.setTypeface(null, Typeface.BOLD);
} else {
text.setTextColor(0xFF444444);
text.setTypeface(null, Typeface.NORMAL);
}
static class ViewHolder {
TextView mTextView;

return convertView;
ViewHolder(View rootView) {
mTextView = rootView.findViewById(android.R.id.text1);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import android.widget.FrameLayout;
import android.widget.ListView;

import com.twiceyuan.dropdownmenu.R;
import com.twiceyuan.dropdownmenu.Utils;
import com.twiceyuan.dropdownmenu.contract.DropdownContent;
import com.twiceyuan.dropdownmenu.listener.OnChooseListener;
Expand All @@ -26,8 +27,11 @@ public DropListContent(Context context, List<String> selections) {
@Override
public View onCreateDropdownView(OnChooseListener<String> controller) {
ListView listView = new ListView(mContext);
listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
DropListAdapter adapter = new DropListAdapter(mSelections);

listView.setDivider(mContext.getResources().getDrawable(R.drawable.ddm_list_divider));
listView.setDividerHeight(Utils.dp2px(1));
listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listView.setAdapter(adapter);
listView.setOnItemClickListener((parent, view, position, id) -> {
adapter.setSelected(position);
Expand Down
5 changes: 0 additions & 5 deletions library/src/main/res/color/selector_text_item_dropdown.xml

This file was deleted.

5 changes: 5 additions & 0 deletions library/src/main/res/drawable/ddm_list_divider.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#EEE" />
</shape>
2 changes: 1 addition & 1 deletion library/src/main/res/layout/ddm_item_drop_list.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
android:paddingTop="12dp"
android:paddingRight="24dp"
android:paddingBottom="12dp"
android:textColor="@color/selector_text_item_dropdown"
android:textColor="#333"
android:textSize="14sp"
tools:text="测试" />
27 changes: 14 additions & 13 deletions sample/src/main/java/com/twiceyuan/ddmsample/SampleActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import com.twiceyuan.dropdownmenu.widget.DropListContent;
import com.twiceyuan.ddmsample.custom.AnimatedHeader;
import com.twiceyuan.ddmsample.custom.CustomListContent;
import com.twiceyuan.dropdownmenu.DropdownMenu;
import com.twiceyuan.dropdownmenu.widget.DropListContent;
import com.twiceyuan.dropdownmenu.widget.TextViewHeader;

import java.util.Arrays;
Expand All @@ -32,22 +34,21 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);

TextView tvChooseHero = findViewById(R.id.tv_hero);
TextView tvChooseColor = findViewById(R.id.tv_color);

final TextView textContent = findViewById(R.id.textContent);

DropdownMenu<String> heroChooser = new DropdownMenu.Builder<String>()
// 默认样式 + 默认头部
new DropdownMenu.Builder<String>()
.header(new TextViewHeader(tvChooseHero))
.content(new DropListContent(this, Arrays.asList(HEROES)))
.build();

heroChooser.setOnChooseListener(textContent::setText);

DropdownMenu<String> colorChooser = new DropdownMenu.Builder<String>()
.header(new TextViewHeader(tvChooseColor))
.content(new DropListContent(this, Arrays.asList(COLORS)))
.build();

colorChooser.setOnChooseListener(textContent::setText);
.build()
.setOnChooseListener(textContent::setText);

// 自定义样式 + 带动画指示器的头部
new DropdownMenu.Builder<String>()
.header(new AnimatedHeader(findViewById(R.id.layout_color_header)))
.content(new CustomListContent(this, Arrays.asList(COLORS)))
.build()
.setOnChooseListener(textContent::setText);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.twiceyuan.ddmsample.custom;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.twiceyuan.ddmsample.R;
import com.twiceyuan.dropdownmenu.contract.DropdownHeader;
import com.twiceyuan.dropdownmenu.listener.OnShowListener;

/**
* 带动画指示器的头部
*/
public class AnimatedHeader implements DropdownHeader<String> {

private final ViewGroup layout;
private final TextView title;
private final ImageView indicator;

public AnimatedHeader(ViewGroup layout) {
this.layout = layout;
title = (TextView) layout.getChildAt(0);
indicator = (ImageView) layout.getChildAt(1);
}

@Override
public void setupShowListener(OnShowListener onShowListener) {
layout.setOnClickListener(v -> onShowListener.onShow(layout));
}

@Override
public void onChoose(String result) {
title.setText(result);
}

@Override
public void onChange(boolean isExpand) {
Resources resources = layout.getContext().getResources();

Drawable upIcon = resources.getDrawable(R.drawable.ddm_ic_arrow_up);
Drawable downIcon = resources.getDrawable(R.drawable.ddm_ic_arrow_down);

Drawable indicatorIcon = isExpand ? upIcon : downIcon;

ObjectAnimator animator = ObjectAnimator.ofFloat(
indicator, "rotation", 0f, 180f
);

animator.setDuration(300);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
indicator.setRotation(0f);
indicator.setImageDrawable(indicatorIcon);
}
});

animator.start();
}
}
Loading

0 comments on commit 7cbd361

Please sign in to comment.