之前是使用android自带的Spinner来实现下拉列表,但是感觉不是很美观,为此找了一个插件来实现同样的列表功能。这里选择的NiceSpinner,github的地址为。https://github.com/arcadefire/nice-spinner。
可以看到官网实现这样的效果。
根据自己的需要,对源代码做改到。
-
下拉列表的分割线
NiceSpinner应该是由ListPopupWindow和TextView组成。其中ListPopupWindow里有一个ListView,自然对ListView设置分割线即可。
public void showDropDown() {
if (!isArrowHidden) {
animateArrow(true);
}
popupWindow.setAnchorView(this);
popupWindow.show();
final ListView listView = popupWindow.getListView();
if(listView != null) {
listView.setVerticalScrollBarEnabled(false);
listView.setHorizontalScrollBarEnabled(false);
listView.setVerticalFadingEdgeEnabled(false);
listView.setHorizontalFadingEdgeEnabled(false);
/*以下是设置分割线背景和高度*/
listView.setDivider(getResources().getDrawable(R.drawable.divider_for_listview));
listView.setDividerHeight(1);
}
}
下拉列表的数据都显示。
NiceSpinner会默认有一个值在TextView中,可以对NiceSpinnerAdapter进行修改。注释代码为修改部分。
public class NiceSpinnerAdapter<T> extends NiceSpinnerBaseAdapter {
private final List<T> items;
NiceSpinnerAdapter(
Context context,
List<T> items,
int textColor,
int backgroundSelector,
SpinnerTextFormatter spinnerTextFormatter,
PopUpTextAlignment horizontalAlignment
) {
super(context, textColor, backgroundSelector, spinnerTextFormatter, horizontalAlignment);
this.items = items;
}
@Override
public int getCount() {
//return items.size() - 1;
return items.size();
}
@Override
public T getItem(int position) {
/*
if (position >= selectedIndex) {
return items.get(position + 1);
} else {
return items.get(position);
}*/
return items.get(position);
}
@Override
public T getItemInDataset(int position) {
return items.get(position);
}
}
另外修改好上面的返回对象后,会报数组越界。在NiceSpinner中的init中注释掉下面的代码。
popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// The selected item is not displayed within the list, so when the selected position is equal to
// the one of the currently selected item it gets shifted to the next item.
//注释掉
/*
if (position >= selectedIndex && position < adapter.getCount()) {
position++;
}*/
selectedIndex = position;
if (onSpinnerItemSelectedListener != null) {
onSpinnerItemSelectedListener.onItemSelected(NiceSpinner.this, view, position, id);
}
if (onItemClickListener != null) {
onItemClickListener.onItemClick(parent, view, position, id);
}
if (onItemSelectedListener != null) {
onItemSelectedListener.onItemSelected(parent, view, position, id);
}
adapter.setSelectedIndex(position);
setTextInternal(adapter.getItemInDataset(position));
dismissDropDown();
}
});
好了,现在我们来简单写一个测试程序。
public class TestActivity extends AppCompatActivity {
private NiceSpinner niceSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
NiceSpinner niceSpinner = (NiceSpinner) findViewById(R.id.nice_spinner);
niceSpinner.setTextColor(Color.GREEN);
LinkedList<String> data=new LinkedList<>(Arrays.asList("华为", "京东", "腾讯", "小米"));
niceSpinner.attachDataSource(data);
niceSpinner.getSelectedItem();
niceSpinner.getText();
niceSpinner.setOnSpinnerItemSelectedListener(new OnSpinnerItemSelectedListener() {
@Override
public void onItemSelected(NiceSpinner parent, View view, int position, long id) {
Toast.makeText(TestActivity.this,niceSpinner.getText(),Toast.LENGTH_SHORT)
.show();
}
});
}
}
最后效果如下图所示。