java取余时前者前者小于后者_ListView数据项隔行换色控制实现详解

packagecom.xiaoma.listviewbackground;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.HashSet;

importjava.util.List;

importjava.util.Map;

importjava.util.Set;

importjava.util.TreeSet;

importandroid.app.Activity;

importandroid.app.Dialog;

importandroid.app.ProgressDialog;

importandroid.content.Context;

importandroid.graphics.drawable.Drawable;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.view.ViewGroup;

importandroid.widget.AdapterView;

importandroid.widget.AdapterView.OnItemSelectedListener;

importandroid.widget.BaseAdapter;

importandroid.widget.Button;

importandroid.widget.ImageView;

importandroid.widget.ListView;

importandroid.widget.TextView;

importandroid.widget.Toast;

/**

* @Title: ListViewBackgroundDemoActivity.java

* @Package com.xiaoma.listviewbackground

* @Description: 小马学习隔行换色,一定仔细看注释

* @author XiaoMa

*/

publicclassListViewBackgroundDemoActivityextendsActivity

implementsOnItemSelectedListener{

privateListView lv =null;

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

lv = (ListView)findViewById(R.id.listview);

/**

* 设置快速滚动块可用,这个大家注意下,就是设置之后,ListView

* 里面的数据条数必须大于一定数量(小马试了下,这个数量是大于一屏)

* 才会显示这个小拖块,不然无效

*/

lv.setFastScrollEnabled(true);

lv.setOnItemSelectedListener(this);

lv.setAdapter(newListDemoAdapter(getApplicationContext()));

}

/**

* @Title: ListViewBackgroundDemoActivity.java

* @Package com.xiaoma.listviewbackground

* @Description:适配器实现

* @author XiaoMa

*/

privateclassListDemoAdapterextendsBaseAdapter{

privatestaticfinalintITEM =0;

privatestaticfinalintSEPARATOR =1;

privatestaticfinalintTYPE_MAX_COUNT = SEPARATOR +1;

privateLayoutInflater inflater =null;

privateList listItem =newArrayList();

/*

* 用这个set来保存分隔线的位置,这个地方必须注意,小马写两个不同类型的Set来跟大家复习下

* 这两个小东东的不同之处,效果太神奇了,这个Set你该用哪个会直接影响到换色效果的,不同之

* 处是:

*

* TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序

*               或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法

*

* Set:一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2)

*     的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学

*     上的 set 抽象

*/

@SuppressWarnings("rawtypes")

//private Set set = new HashSet();

privateTreeSet set =newTreeSet();

privateMap map =newHashMap();

publicListDemoAdapter(Context context ){

this.inflater = LayoutInflater.from(context);

/**

* 大家稍微注意下这个循环,i从1开始?为什么?  小马在这犯的错

* 每5条数据加一条换色Item是用 i%6 == 0来控制的,如果这

* 个i值从0开始的话,会出现上面贴图中错误的换色,看图三,图四,

* 原因是取余的时候小马犯了低级错误,小错,记下:两数取余,前者

* 大于后者时,取余会按正常取余来取,如果前者小于后者时,取余

* 后的值始终是前者,如果这个地方的i从0开始取的话,正好是满

* 足取余后的值等于0这个情况,就出现上面两图中的错误隔×××了,

* 当前者大于等于后者时,这个隔色就又正常了,一定注意下,记在这,

* 提醒大家也提醒自己,吼吼,听不明白的可以看下小马在工程中加的

* 一个测试类(测试取余规律的类PercentTest.java)

*/

//填充ListView

for(inti=1;i<=50;i++){

this.listItem.add("添加的第"+i+"条数据");

if(i%6==0){

addSeparatorItem();

}

Log.i("KKK","添加的第"+i+"条数据");

}

}

/**

* 添加换色项方法实现

* @param item

*/

@SuppressWarnings("unchecked")

publicvoidaddSeparatorItem() {

set.add(listItem.size()-1);

notifyDataSetChanged();

}

/**

* 此处是根据特定值(在getView方法中加入)

* 来判断应该绘制选项还是换色选项的分支值

* 由position返回view type id

*/

@Override

publicintgetItemViewType(intposition) {

returnset.contains(position) ? SEPARATOR : ITEM;

}

/**

* 返回你有多少个不同的布局

*/

@Override

publicintgetViewTypeCount() {

returnTYPE_MAX_COUNT;

}

@Override

publicintgetCount() {

returnlistItem.size();

}

@Override

publicObject getItem(intposition) {

returnlistItem.get(position);

}

@Override

publiclonggetItemId(intposition) {

returnposition;

}

/**

* 这个地方也需要注意下,小马这个方法里面写的有点多了,其实官方是不支持在

* getView()方法中写太多的逻辑因为你手拖下屏幕,这个方法是逛调用

* 的,所以太多逻辑不适合放在这个地方,大家可自行调整下,但有些还是必

* 须的,写在这无防...吼吼

*/

@Override

publicView getView(intposition, View convertView, ViewGroup parent) {

inttype = getItemViewType(position);

XiaoMa xiaoMa = null;

finalintlocation = position;

if(convertView ==null){

switch(type) {

//如果需要绘制选项时分支

caseITEM:

xiaoMa = newXiaoMa();

convertView = inflater.inflate(R.layout.listview_items, null);

xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage);

xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle);

xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext);

xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn);

break;

//如果需要绘制换色选项时分支

caseSEPARATOR:

xiaoMa = newXiaoMa();

convertView = inflater.inflate(R.layout.listview_items, null);

xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage);

xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle);

xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext);

xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn);

convertView = inflater.inflate(R.layout.separator, null);

/*

* 这个地方的drawable2用法跟在ListView换色选项布局中的

* android:background="@drawable/gradient_box"

* 效果是一样的,小马写在这,熟悉下两种方式,大家根据自己需要改

*/

Drawable drawable2 = getResources().getDrawable(R.drawable.gradient_box);

xiaoMa.sep = (TextView)convertView.findViewById(R.id.sep);

xiaoMa.sep.setBackgroundDrawable(drawable2);

break;

}

/*

* 此处小马犯错了,如果下面这句不加的话,

* 加载时正常,拖动列表时就会报空指针了,

* 小点注意下

*/

convertView.setTag(xiaoMa);

}else{

xiaoMa = (XiaoMa)convertView.getTag();

}

xiaoMa.iv.setBackgroundResource(R.drawable.xiaolvzi);

xiaoMa.tv.setText("这是第"+(position+1)+"个标题");

xiaoMa.text.setText("这是第"+(position+1)+"个概述");

/**

* 按钮事件监听实现

*/

xiaoMa.btn.setOnClickListener(newOnClickListener() {

@Override

publicvoidonClick(View v) {

//单击Item按钮后,弹出提示

ShowDialog(location);

}

});

returnconvertView;

}

}

/**

* 弹出提示实现,这个地方扩展一下,细心的话大家会发现小马违反了方法命名规范,其实不是的,

* 安卓Activity有临时弹出对话框方法的,跟下面这个方法只有一个字母之差(小马故意

* 首字母大写的),安卓自带弹出方法在这个方法下面的注释中

* @param posi

*/

privatevoidShowDialog(intposi){

Toast.makeText(getApplicationContext(), "单击了第"+(posi+1)

+"个按钮", Toast.LENGTH_SHORT).show();

/*

* 下面这两个方法大家熟悉吧?调用系统提供的临时弹出对话框,必须实现下面的

* onCreateDialog(int id)方法

*/

showDialog(1);//弹出时可以做如:从服务器取数据等操作

/**

* 这个地方小马就简单的睡眠5秒种来模拟从服务器下载数据完成后关闭对话框

*/

newThread(newRunnable() {

@Override

publicvoidrun() {

try{

Log.i("KKK","已进入睡眠");

Thread.sleep(3000);

dismissDialog(1);//隐藏 表示数据下载完毕等的...

} catch(Exception e) {

e.printStackTrace();

}

}

}).start();

}

@Override

protectedDialog onCreateDialog(intid) {

/*

* 下面这个构造器中的this不能用getApplicationContext()来代替,

* 但可用类名.this来代替,没有为什么, 必须这样写!!!这个地方小马晕了

* 不少时间,如果直接get....代码没错,但还是会报错,很邪门的哦 ...

*/

ProgressDialog dialog = newProgressDialog(this);

//小测试,中文就临时写这了,大家要注意把内容都写到string.xml中去,好习惯从小开始养,嘿嘿

dialog.setCancelable(false);//设置用户不能用返回键取消对话框

dialog.setIcon(getResources().getDrawable(R.drawable.xiaolvzi));

dialog.setTitle("那些年,我们一起追的女孩");

dialog.setMessage("小马果 呆丫头 O_O");

dialog.show();

returndialog;

}

/**

* @Title: ListViewBackgroundDemoActivity.java

* @Package com.xiaoma.listviewbackground

* @Description: 为提高加载效率而写的类,可以看下ListView优化

* @author XiaoMa

*/

publicfinalclassXiaoMa{

publicImageView iv ;

publicTextView tv ;

publicButton btn ;

publicTextView text;

publicTextView sep;

}

@Override

publicvoidonItemSelected(AdapterView> parent, View view,intposition,

longid) {

}

@Override

publicvoidonNothingSelected(AdapterView> parent) {

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值