最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下
ListView 在Android 里面用来实现列表的,
在xml 中创建ListView 代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
实现list 换需要适配器(Adapter) ,ListView常用的适配器(Adapter)有以下几种。
1 ArrayAdapter 绑定数组
2 SimpleAdapter 绑定xml 中对应的数据
3 SimpleCursorAdapter 绑定游标
4 BaseAdapter 通用的是适配器,(一般都是自定义)
1 ArrayAdapter 绑定数组
下面写一个demo
xml 使用上面的
java 代码如下
public class ArrayAdapterActivity extends AppCompatActivity {
private String[] data = {"Android", "Java", "C++", "PHP", "Python", "JS", "HTML", "CSS"};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.array_adapter_activity_layout);
final ListView listView = findViewById(R.id.listView);
final ArrayAdapter<String>
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
data);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(ArrayAdapterActivity.this, adapter.getItem(position),
Toast.LENGTH_SHORT).show();
}
});
}
}
实现效果
没有分割线,设置一下
// 设置分割线
listView.setDivider(new ColorDrawable(Color.RED));
// 设置分割线的宽度
listView.setDividerHeight(5);
设置之后的效果'
'
2 SimpleAdapter
java 代码如下
public class SimpleAdapterActivity extends AppCompatActivity {
private String[] project = {"Android", "Java", "C++", "PHP", "Python", "JS", "HTML", "CSS"};
private String[] dev = {"张三", "李四", "王二", "小赵", "小钱", "小孙", "小李", "小明"};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_adapter_activity_layout);
ArrayList<Map<String, Object>> mData = new ArrayList<>();
int lengh = project.length;
for (int i = 0; i < lengh; i++) {
Map<String, Object> item = new HashMap<>();
item.put("project", project[i]);
item.put("dev", dev[i]);
mData.add(item);
}
ListView listView = findViewById(R.id.list);
SimpleAdapter adapter = new SimpleAdapter(this, mData, android.R.layout.simple_list_item_2,
new String[] {"project", "dev"},
new int[] {android.R.id.text1, android.R.id.text2});
// 设置分割线
listView.setDivider(new ColorDrawable(Color.RED));
// 设置分割线的宽度
listView.setDividerHeight(5);
listView.setAdapter(adapter);
}
}
实现的效果如下
从上面的代码可以看到adapter 加载item layout 使用的是同,其实我们可以自己写layout ,下面写一个横线的layout
layout 代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="horizontal">
<TextView
android:id="@+id/simple_id"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:textColor="@android:color/holo_blue_light"
android:gravity="center" />
<TextView
android:id="@+id/simple_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginLeft="50dp"
android:textColor="@android:color/holo_blue_light"
android:gravity="center" />
<TextView
android:id="@+id/simple_sex"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:textSize="20sp"
android:textColor="@android:color/holo_red_dark"
android:layout_marginLeft="100dp"
android:gravity="center" />
<TextView
android:id="@+id/simple_class"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:textSize="28sp"
android:textColor="@android:color/holo_purple"
android:layout_marginLeft="100dp"
android:gravity="center" />
</LinearLayout>
java 代码如下
public class SingleSimpleAdapterActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_adapter_activity_layout);
List<Map<String, Object>> mData = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("name", "张三");
map1.put("sex", "男");
map1.put("class", "一年级");
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "李四");
map2.put("sex", "男");
map2.put("class", "二年级");
Map<String, Object> map3 = new HashMap<>();
map3.put("name", "王二");
map3.put("sex", "男");
map3.put("class", "三年级");
Map<String, Object> map4 = new HashMap<>();
map4.put("name", "春花");
map4.put("sex", "女");
map4.put("class", "一年级");
Map<String, Object> map5 = new HashMap<>();
map5.put("name", "夏草");
map5.put("sex", "女");
map5.put("class", "二年级");
Map<String, Object> map6 = new HashMap<>();
map6.put("name", "秋香");
map6.put("sex", "女");
map6.put("class", "三年级");
mData.add(map1);
mData.add(map2);
mData.add(map3);
mData.add(map4);
mData.add(map5);
mData.add(map6);
ListView listView = findViewById(R.id.list);
SimpleAdapter adapter = new SimpleAdapter(this, mData, R.layout.single_simple_adapter_item
, new String[] {"name", "sex", "class"},
new int[] {R.id.simple_name, R.id.simple_sex, R.id.simple_class});
// 设置分割线
listView.setDivider(new ColorDrawable(Color.RED));
// 设置分割线的宽度
listView.setDividerHeight(5);
listView.setAdapter(adapter);
}
}
实现的效果图
3 SimpleCursorAdapter 的主要代码如下
public class SimpleCursorActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_adapter_activity_layout);
String[] simpleCursor = new String[] {"_id", "name", "sex", "class"};
MatrixCursor cursor = new MatrixCursor(simpleCursor);
cursor.addRow(new Object[] {null,"张三", "男", "一年级"});
cursor.addRow(new Object[] {null,"李四", "男", "二年级"});
cursor.addRow(new Object[] {null,"王二", "男", "三年级"});
cursor.addRow(new Object[] {null,"春花", "女", "一年级"});
cursor.addRow(new Object[] {null,"夏草", "女", "二年级"});
cursor.addRow(new Object[] {null,"秋香", "女", "三年级"});
ListView listView = findViewById(R.id.list);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.single_simple_adapter_item, cursor, simpleCursor,
new int[] {R.id.simple_id,R.id.simple_name, R.id.simple_sex, R.id.simple_class});
// 设置分割线
listView.setDivider(new ColorDrawable(Color.RED));
// 设置分割线的宽度
listView.setDividerHeight(5);
listView.setAdapter(adapter);
}
}
实现的效果图
4 BaseAdapter 通用的是适配器,(一般都是自定义)
定义一个myAdapter
public class MyAdapter extends BaseAdapter {
private List<ListBean> mDatas = null;
private Context mContext = null;
public MyAdapter(Context context, List<ListBean> datas) {
mDatas = datas;
mContext = context;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_base_item, null);
holder.image = convertView.findViewById(R.id.image);
holder.title = convertView.findViewById(R.id.title);
holder.content = convertView.findViewById(R.id.content);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(mDatas.get(position).getImgId());
holder.title.setText(mDatas.get(position).getTitle());
holder.content.setText(mDatas.get(position).getContent());
return convertView;
}
public final class ViewHolder {
public ImageView image;
public TextView title;
public TextView content;
}
}
布局 list_base_item
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="120dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/image"
android:layout_width="120dp"
android:layout_height="match_parent"
android:src="@color/colorAccent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<TextView
android:id="@+id/title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="标题头"
app:layout_constraintLeft_toRightOf="@+id/image"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="50dp" />
<TextView
android:id="@+id/content"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="标题头"
app:layout_constraintLeft_toRightOf="@+id/image"
app:layout_constraintTop_toBottomOf="@+id/title"
android:layout_marginTop="50dp"
android:layout_marginLeft="50dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity 代码如下
public class ListBaseAdapterActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_adapter_activity_layout);
List<ListBean> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
ListBean listBean = new ListBean(R.mipmap.one, "标题头", "内容内容");
list.add(listBean);
}
ListView listView = findViewById(R.id.list);
MyAdapter adapter = new MyAdapter(ListBaseAdapterActivity.this, list);
// 设置分割线
listView.setDivider(new ColorDrawable(Color.RED));
// 设置分割线的宽度
listView.setDividerHeight(5);
listView.setAdapter(adapter);
}
}
实现的效果图
代码都狠简单就不多啰嗦了,