自定义圆角ListView
开始做Android,前段时间做了个自定义的listview,现在归纳一下。效果是这样。
步骤和重要代码如下如下:
1、创建一个item_listview.xml用来定义单个的listitem内容及布局;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/item_shape"
android:padding="10dp">
<TextView
android:id="@+id/tv_flightCompany"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CA"
android:textColor="#444"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_flightNo"
android:layout_toRightOf="@id/tv_flightCompany"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1831"
android:textColor="#444"
android:textSize="16sp" />
<View
android:id="@+id/top_line"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_below="@id/tv_flightNo"
android:background="#e1e1e1" />
<!--航班信息内容-->
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="75dp"
android:layout_below="@+id/top_line"
android:background="#fafafa"
android:orientation="horizontal">
<!--航班状态时钟-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="9dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_clock"
android:layout_width="18dp"
android:layout_height="18dp"
android:gravity="center"
android:src="@drawable/clock" />
<TextView
android:id="@+id/tv_flightTimeStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:text="正常"
android:textColor="#06AA55"
android:textSize="14sp" />
</LinearLayout>
<!--出发信息-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:gravity="center|right"
android:orientation="vertical">
<TextView
android:id="@+id/tv_plan_startTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计划 07.17 12:00"
android:textColor="#666666"
android:textSize="13sp" />
<TextView
android:id="@+id/tv_startTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="07:43"
android:textColor="#333333"
android:textSize="21sp" />
<TextView
android:id="@+id/tv_startPort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="北京首都(216)"
android:textColor="#666666"
android:textSize="13sp" />
</LinearLayout>
<ImageView
android:layout_width="67dp"
android:layout_height="28dp"
android:layout_gravity="center"
android:layout_margin="18dp"
android:src="@drawable/flight" />
<!--到达信息-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center|left"
android:orientation="vertical">
<TextView
android:id="@+id/tv_plan_arriveTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="07.17 14:55"
android:textColor="#666666"
android:textSize="13sp" />
<TextView
android:id="@+id/tv_arriveTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="09:45"
android:textColor="#333333"
android:textSize="21sp" />
<TextView
android:id="@+id/tv_arrivePort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上海虹桥(522)"
android:textColor="#666666"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/bottom_line"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_below="@id/ll_content"
android:background="#e1e1e1" />
<!--底部信息-->
<LinearLayout
android:padding="5dp"
android:layout_below="@id/bottom_line"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="座位数:"
android:textColor="#999999" />
<TextView
android:id="@+id/tv_seating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3/168" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="办票时间:"
android:textColor="#999999" />
<TextView
android:id="@+id/tv_runTicketTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11:15" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:gravity="right"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人数:"
android:textColor="#3c84d0" />
<TextView
android:id="@+id/tv_totalPeople"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8 >"
android:textColor="#3c84d0"
/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
效果如下:
2、圆角设置。在res/drawable文件夹下新建item_shap.xml 为listitem设置圆角属性。
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="12dp"/>
<solid android:color="#fff"/>
<stroke android:color="#ffffff"/>
</shape>
3、在activity_main.xml文件中添加ListView控件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#414141">
<ListView
android:layout_margin="10dp"
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="5dp">
</ListView>
</LinearLayout>
4、新建FlightInfo.java并实现get和set方法。
5、为listview设置Adapter。新建MyAdapter.java
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<FlightInfo> mDatas;
private Context context;
//MyAdapter需要一个Context,通过Context获得Layout.inflater,然后通过inflater加载item的布局
public MyAdapter(Context context, List<FlightInfo> datas) {
this.context = context;
mInflater = LayoutInflater.from(context);
mDatas = datas;
}
//返回数据集的长度
@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;
}
//每次读取listview都会加载getview方法。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_listview, parent, false); //加载布局
holder = new ViewHolder();
holder.airCompany = (TextView) convertView.findViewById(R.id.tv_flightCompany);
holder.flightNum = (TextView) convertView.findViewById(R.id.tv_flightNo);
holder.flightTimeStatus = (TextView) convertView.findViewById(R.id.tv_flightTimeStatus);
holder.claStrTime = (TextView) convertView.findViewById(R.id.tv_plan_startTime);
holder.strTime = (TextView) convertView.findViewById(R.id.tv_startTime);
holder.strPort = (TextView) convertView.findViewById(R.id.tv_startPort);
holder.claEndTime = (TextView) convertView.findViewById(R.id.tv_plan_arriveTime);
holder.endTime = (TextView) convertView.findViewById(R.id.tv_arriveTime);
holder.endPort = (TextView) convertView.findViewById(R.id.tv_arrivePort);
holder.seatJson = (TextView) convertView.findViewById(R.id.tv_seating);
holder.runTicketTime = (TextView) convertView.findViewById(R.id.tv_runTicketTime);
holder.totalPeople = (TextView) convertView.findViewById(R.id.tv_totalPeople);
convertView.setTag(holder);
} else { //else里面说明,convertView已经被复用了,说明convertView中已经设置过tag了,即holder
holder = (ViewHolder) convertView.getTag();
}
FlightInfo bean = mDatas.get(position);
holder.airCompany.setText(bean.getAirCompany());
holder.flightNum.setText(bean.getFlightNum());
holder.flightTimeStatus.setText("正常"); // 之后解决
holder.claStrTime.setText(bean.getClaStrTime());
holder.strTime.setText(bean.getStrTime());
holder.strPort.setText(bean.getStrPort());
holder.claEndTime.setText(bean.getClaEndTime());
holder.endTime.setText(bean.getEndTime());
holder.endPort.setText(bean.getEndPort());
holder.seatJson.setText(bean.getSeatJson());
holder.runTicketTime.setText("12:00");
holder.totalPeople.setText("0");
return convertView;
}
private class ViewHolder {
TextView airCompany;
TextView flightNum;
TextView flightTimeStatus;
TextView claStrTime;
TextView claEndTime;
TextView strTime;
TextView endTime;
TextView strPort;
TextView endPort;
TextView seatJson;
TextView runTicketTime;
TextView totalPeople;
}
}
6、在MainAcitvity.java中进行listview初始化及数据准备。如下:
public class MainActivity extends AppCompatActivity {
private List<FlightInfo> mFlightInfo;
private MyAdapter mAdapter;
private ListView listView;
private String seatJson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
initData();
}
public void initData() {
mFlightInfo = new ArrayList<>();
for(int i = 0;i<10;i++){
FlightInfo flightInfo = new FlightInfo();
flightInfo.setAirCompany("CA");
flightInfo.setFlightNum("1234");
flightInfo.setFlightDate("2017/01/21");
flightInfo.setClaEndTime("06:30");
flightInfo.setClaStrTime("06:30");
flightInfo.setEndTime("06:30");
flightInfo.setStrTime("06:30");
flightInfo.setStrPort("北京");
flightInfo.setEndPort("深圳");
flightInfo.setSeatJson("123/137");
mFlightInfo.add(flightInfo);
}
//为数据绑定适配器
mAdapter = new MyAdapter(this, mFlightInfo);
listView.setAdapter(mAdapter);
}
}
这样就完成了。