項目背景:希望listview帶title,每個title有背景顏色,並且每個content內容奇數條背景爲灰色,偶數條爲白色背景
設計圖:
第一步:做出一個listview 並獲取條目,設置不同顏色:
layout:main.xml activity的佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffffff">
<RelativeLayout
android:id="@+id/RL_apperror"
android:layout_width="match_parent"
android:layout_height="50dp" >
<TextView
android:id="@+id/TV_apperror_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:gravity="center"
android:paddingLeft="15dp"
android:text="後退" />
<TextView
android:id="@+id/TV_error"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"
android:text="錯誤" />
</RelativeLayout>
<ListView
android:id="@+id/LV_error"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
layout: list_item_section.xml title的佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#cbcbcb"
android:orientation="vertical" >
<TextView
android:id="@+id/list_item_section_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingLeft="15dp"
android:background="#e6e6e6"
style="?android:attr/listSeparatorTextViewStyle" />
</LinearLayout>
layout: list_item_enty.xml 條目佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingRight="?android:attr/scrollbarSize"
android:background="#ffffff">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dip"
android:layout_weight="1" >
<TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/list_item_entry_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/list_item_entry_title"
android:layout_below="@id/list_item_entry_title"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
<TextView
android:id="@+id/list_item_entry_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/list_item_entry_title"
android:layout_below="@id/list_item_entry_summary"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
</RelativeLayout>
</LinearLayout>
Item.java 判斷是否是title
package listview;
/**
* @author Administrator
*
*/
public interface Item {
public boolean isSection();
}
SectionItem.java 是title
/**
*
*/
package listview;
/**
* @author Administrator
*
*/
public class SectionItem implements Item{
private final String title;
public SectionItem(String title) {
this.title = title;
}
public String getTitle(){
return title;
}
@Override
public boolean isSection() {
return true;
}
}
EntryItem.java 不是titlepackage listview;
/**
* @author Administrator
*
*/
public class EntryItem implements Item{
public final String title;
public final String subtitle;
public final String time;
public EntryItem(String title, String subtitle,String time) {
this.title = title;
this.subtitle = subtitle;
this.time=time;
}
@Override
public boolean isSection() {
return false;
}
}
EntryAdapter.java 適配器
/**
*
*/
package listview;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.example.meituandemo.R;
/**
* @author Administrator
*
*/
public class EntryAdapter extends ArrayAdapter<Item> {
private Context context;
private ArrayList<Item> items;
private LayoutInflater mInflater;
private int tag = 0;
public EntryAdapter(Context context, ArrayList<Item> items) {
super(context, 0, items);
this.context = context;
this.items = items;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getSelectionByPosition(int position) {
int selection = 0;
for (int i = 0; i < position; i++) {
Item item = items.get(i);
if (item.isSection()) {
selection = i;
}
}
return selection;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder=new ViewHolder();
final Item i = items.get(position);
if (i != null) {
if (i.isSection()) {
SectionItem si = (SectionItem) i;
v = mInflater.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
holder.sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
holder.sectionView.setText(si.getTitle());
} else {
EntryItem ei = (EntryItem) i;
v = mInflater.inflate(R.layout.list_item_enty, null);
holder.title = (TextView) v.findViewById(R.id.list_item_entry_title);
holder.subtitle = (TextView) v.findViewById(R.id.list_item_entry_summary);
holder.time= (TextView) v.findViewById(R.id.list_item_entry_time);
if (holder.title != null)
holder.title.setText(ei.title);
if (holder.subtitle != null)
holder.subtitle.setText(ei.subtitle);
if(holder.time!=null)
holder.time.setText(ei.time);
int selection = getSelectionByPosition(position);
if ((position - selection) % 2 == 0) {// 偶數行
holder.title.setTextColor(Color.RED);
} else {
holder.title.setTextColor(Color.GREEN);
}
}
}
return v;
}
/**
* 視圖優化
*/
static class ViewHolder {
TextView sectionView;
TextView title;
TextView subtitle;
TextView time;
}
}
SectionListExampleActivity.java 主函數/**
*
*/
package listview;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
import com.example.meituandemo.R;
/**
* @author Administrator
*
*/
public class SectionListExampleActivity extends Activity implements OnItemClickListener{
ArrayList<Item> items = new ArrayList<Item>();
ListView listview=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview=(ListView)findViewById(R.id.LV_error);
items.add(new SectionItem("My Friends"));
items.add(new EntryItem("Abhi Tripathi", "Champpu","2014/9/28"));
items.add(new EntryItem("Sandeep Pal", "Sandy kaliya","2014/9/22"));
items.add(new EntryItem("Amit Verma", "Budhiya","2014/9/20"));
items.add(new EntryItem("Awadhesh Diwaker ", "Dadda","2014/9/20"));
items.add(new SectionItem("Android Version"));
items.add(new EntryItem("Jelly Bean", "android 4.2","2014/9/20"));
items.add(new EntryItem("IceCream Sandwich", "android 4.0","2014/9/20"));
items.add(new EntryItem("Honey Comb", "android 3.0","2014/9/20"));
items.add(new EntryItem("Ginger Bread ", "android 2.2","2014/9/20"));
items.add(new SectionItem("Android Phones"));
items.add(new EntryItem("Samsung", "Gallexy","2014/9/20"));
items.add(new EntryItem("Sony Ericson", "Xperia","2014/9/20"));
items.add(new EntryItem("Nokiya", "Lumia","2014/9/20"));
EntryAdapter adapter = new EntryAdapter(this, items);
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) {
EntryItem item = (EntryItem)items.get(position);
Toast.makeText(this, "You clicked " + item.title , Toast.LENGTH_SHORT).show();
}
private void setBackGround(){
}
}
然後進行改進:
title是分爲:今天,更早的,那麼從接口獲取的數據如何判斷是今天的還是屬於更早的,判斷出來後有如何只讓item加一次title?
假設從接口取得json存在變量successString ,則:
private void getData() {
//AppErrorBean 用於存json字符串,分類
Gson gson = new Gson();
List<AppErrorBean> appErrorBean = gson.fromJson(successString, new TypeToken<List<AppErrorBean>>() {
}.getType());
if (!appErrorBean.isEmpty()) {
boolean todayFlag=false;
boolean laterFlag=false;
for (int i = 0; i < appErrorBean.size(); i++) {
AppErrorBean b = appErrorBean.get(i);
if (isToday(b.getStartTime())) {
laterFlag = false;
if (!todayFlag) {
todayFlag = true;
items.add(new SectionItem("今天"));
}
}else {
todayFlag = false;
if (!laterFlag) {
laterFlag = true;
items.add(new SectionItem("更早"));
}
}
items.add(new EntryItem(applicationName, appErrorBean.get(i).getExceptionClass(), appErrorBean.get(
i).getMessage(), appErrorBean.get(i).getStartTime()));
adapter.notifyDataSetChanged();
}
}
}
public boolean isToday(String time) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String nowTime = sdf.format(new Date());
if(time.contains(nowTime)){
return true;
}else{
return false;
}
}
這樣基本完成需求,根據設計更改一下背景顏色之類的,已無難點。
參考文獻:http://sunil-android.blogspot.com/2013/08/section-header-listview-in-android.html