1.简介
BaseAdapter是一个抽象类,实现了ListAdapter和SpinnerAdapter。通过使用BaseAdapter,我们可以在Spinner的列表项中展示更多内容。如果还不懂得使用Spinner,可以参考这里。
public abstract class BaseAdapter extends Object implements ListAdapter, SpinnerAdapter
使用步骤:
- 编写列表项的布局文件。
- 编写自己的适配器继承自BaseAdapter。主要实现三个方法。
- 构造函数。指定适配器需要处理的数据集合
- getCount:获取数据项的个数。
- getView:获取每项的视图。
- 代码中构造适配器,应用于Spinner对象。
2.使用例子
新建BaseAdapterActivity,代码如下。最后效果如图。
- item_dropdown.xml。即第一步的列表项布局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/ll_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:scaleType="fitCenter"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="left|center"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_description"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="left|center"
android:textSize="13sp"
android:textColor="#000000" />
</LinearLayout>
</LinearLayout>
- MyBaseAdapter.java。即第二步的继承自BaseAdapter的适配器。
package xyz.strasae.androidlearn.senior.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import xyz.strasae.androidlearn.senior.R;
import xyz.strasae.androidlearn.senior.bean.DemoItem;
public class MyBaseAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context context;
private int layoutId;
private int background;
private ArrayList<DemoItem> demoItemArrayList;
/**
*
* @param context 设备上下文
* @param layoutId 列表项的视图id
* @param demoItemArrayList 数据
* @param background 列表项的背景颜色
*/
public MyBaseAdapter(Context context, int layoutId, ArrayList<DemoItem> demoItemArrayList, int background) {
this.context = context;
layoutInflater = LayoutInflater.from(this.context);
this.demoItemArrayList = demoItemArrayList;
this.background = background;
this.layoutId = layoutId;
}
@Override
public int getCount() {
return demoItemArrayList.size();
}
@Override
public Object getItem(int i) {
return demoItemArrayList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null) {
viewHolder = new ViewHolder();
convertView = layoutInflater.inflate(layoutId, null);
viewHolder.ll_item = convertView.findViewById(R.id.ll_item);
viewHolder.iv_icon = convertView.findViewById(R.id.iv_icon);
viewHolder.tv_name = convertView.findViewById(R.id.tv_name);
viewHolder.tv_description = convertView.findViewById(R.id.tv_description);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
DemoItem demoItem = demoItemArrayList.get(position);
viewHolder.ll_item.setBackgroundColor(background);
viewHolder.iv_icon.setImageResource(demoItem.image);
viewHolder.tv_name.setText(demoItem.name);
viewHolder.tv_description.setText(demoItem.description);
return convertView;
}
public final class ViewHolder {
private LinearLayout ll_item;
private ImageView iv_icon;
private TextView tv_name;
private TextView tv_description;
}
}
- activity_base_adapter_demo.xml。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BaseAdapterDemoActivity"
android:orientation="vertical"
android:padding="10dp">
<Spinner
android:id="@+id/sp_demo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spinnerMode="dropdown"
>
</Spinner>
</LinearLayout>
- BaseAdapterActivity.java。
package xyz.strasae.androidlearn.senior;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import xyz.strasae.androidlearn.senior.adapter.MyBaseAdapter;
import xyz.strasae.androidlearn.senior.bean.DemoItem;
public class BaseAdapterDemoActivity extends AppCompatActivity {
private Spinner sp_demo;
private ArrayList<DemoItem> demoItemArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_adapter_demo);
sp_demo = findViewById(R.id.sp_demo);
demoItemArrayList = DemoItem.getDefaultList();
MyBaseAdapter myBaseAdapter = new MyBaseAdapter(BaseAdapterDemoActivity.this, R.layout.item_dropdown, demoItemArrayList, Color.WHITE);
sp_demo.setPrompt("Demo");
sp_demo.setAdapter(myBaseAdapter);
sp_demo.setSelection(0);
sp_demo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(BaseAdapterDemoActivity.this, "你选择的是" + demoItemArrayList.get(i).name, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
}