当看到这个需求的时候,我是懵逼的,怎么在list view中插入一条广告的数据,如果说给list view添加一个头视图或者是尾视图,这都不是问题,在list view中间添加一个数据,我最开始的思路是,给最下面的list view添加两个头视图,一个是list view,另一个是广告,当运行的时候,发现这种做法并不可行,那就一定会有办法解决的。
于是我们换个思路,两个不同的数据,也就是说就是两种不同的ItemViewType,或许我们可以通过判断type的方式来完成这个功能:
1.首先来写布局文件,很简单,就是一个list view
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.otherviewinlistview.MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
2.再来看数据实体类:
import java.util.List;
/**
* Created by Administrator on 2017/3/22.
*/
public class Bean {
private List<Data> dataList;
private int num;
public Bean(int num, List<Data> dataList) {
this.num = num;
this.dataList = dataList;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public List<Data> getDataList() {
return dataList;
}
public void setDataList(List<Data> dataList) {
this.dataList = dataList;
}
public static class Data {
private String title;
private String body;
public Data(String title, String body) {
this.title = title;
this.body = body;
}
public Data() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
}
3.然后在MainActivity中使用:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private MainAdapter mainAdapter;
private Bean bean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
mainAdapter = new MainAdapter(this);
List<Bean.Data> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
Bean.Data data = new Bean.Data("this is title " + i, "this is body " );
list.add(data);
}
for (int i = 0; i < 30; i++) {
bean = new Bean(i, list);
}
mainAdapter.setBean(bean);
listView.setAdapter(mainAdapter);
}
}
4.最重要的是在adapter中做处理:
public class MainAdapter extends BaseAdapter {
private Context context;
private Bean bean;
private ArrayList list = new ArrayList();
public MainAdapter(Context context) {
this.context = context;
}
public void setBean(Bean bean) {
this.bean = bean;
mergeList();
notifyDataSetChanged();
}
private void mergeList() {
//清空
list.clear();
for (int i = 0; i < bean.getDataList().size(); i++) {
Bean.Data title = bean.getDataList().get(i);
//添加数据
list.add(title);
if (i % 10 == 0 && i != 0){
//每当大于10的时候,向集合中添加一个别的类型数据
list.add(bean.getNum());
}
}
}
//获取item的类型
@Override
public int getItemViewType(int position) {
return list.get(position) instanceof Bean.Data ? 0 : 1;
}
//获取有多少view type
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
ViewHolderTwo viewHolderTwo = null;
int type = getItemViewType(position);
if (type == 0) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
//设置数据
Bean.Data data = (Bean.Data) list.get(position);
viewHolder.titleTv.setText(data.getTitle());
viewHolder.bodyTv.setText(data.getBody());
} else if (type == 1) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_view_two, parent, false);
viewHolderTwo = new ViewHolderTwo(convertView);
convertView.setTag(viewHolderTwo);
} else {
viewHolderTwo = (ViewHolderTwo) convertView.getTag();
}
//设置数据
}
return convertView;
}
class ViewHolder {
public TextView titleTv, bodyTv;
public ViewHolder(View itemView) {
titleTv = (TextView) itemView.findViewById(R.id.title);
bodyTv = (TextView) itemView.findViewById(R.id.body);
}
}
class ViewHolderTwo {
public ImageView headIv;
public ViewHolderTwo(View itemView) {
headIv = (ImageView) itemView.findViewById(R.id.item_view_two_iv);
}
}
}
5.item_view的布局:
<?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">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="2dp"
android:text="标题"
android:textSize="20sp" />
<TextView
android:id="@+id/body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="200dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:text="内容"
android:textSize="17sp"
android:textColor="@color/colorPrimaryDark"/>
</LinearLayout>
6.item_view_two的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="210dp">
<ImageView
android:id="@+id/item_view_two_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/headiv"
android:scaleType="fitXY"/>
</LinearLayout>
7.效果图如下
8.demo下载地址:
本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!