ListView的理解
Contents
2015-09-15 2015/11/3 17:21:05 2015/11/3 17:20:58 2015/11/3 17:21:14 2015/11/9 9:36:13 2015/11/10 10:51:10 2015/11/10 14:22:34 2015/11/10 14:36:52 2016/1/4 0:26:37
ListView 分割线
在divider 为颜色 时 需设置dividerHeight
如何判断listview是最后一个
if(坐标<总长度-1)
如何取消分割线
在java中取消
listView.setDividerHeight(0); listView.setDivider(null);
在XML布局文件取消
android:divider="#FFCC00" 或 android:divider="@null"
2015-09-15
设置listview无点击背景效果
android:listSelector="@android:color/transparent"
2015/11/3 17:21:05
ListView的下拉刷新,上拉加载数据
在跟服务器交互时
- 当ListView 下拉时,清空原数据,请求新的一页数据(用currentPage判断)。 currentPage = 1 ;
当Listview 上拉时,重新加载一页数据。 currentPage ++;
srlExp.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { currentPage = 1; getData(); //向服务器请求数据 } }); srlExp.setOnLoadListener(new RefreshLoadLayout.OnLoadListener() { @Override public void onLoad() { currentPage++; getData(); } });
- 处理服务器获得的数据
1. 判断是否要清空原数据。
2. **将服务端的数据加入到list中,然后更新adapter。**(用list.addAll()方法)
3. (adapter更新之后)通过服务器下发总条数跟当前list的长度对比,设置是否有加载更多数据。
4. 最后设置refresh、loading为false
代码如下:
@Override
public void onGeneralSuccess(String result, long flag) {
if (flag == reqFlagAchieve) {
achieveResp = GsonTool.getServerBean(result, AchieveResp.class);
if (achieveResp.isSuccess()) {
if (achieveResp.getAchievelist() != null && achieveResp.getAchievelist().size() > 0) {
//refreshLayout显示
srlShare.setVisibility(View.VISIBLE);
//判断是上拉还是下拉
if (currentPage == 1) {
list.clear();
}
//获取服务器下发数据总长度
amount = achieveResp.getAmount();
//加入全部元素(卧槽,for循环已经low了)
list.addAll(achieveResp.getAchievelist());
achieveShareAdapter.notifyDataSetChanged();
//判断是否有加载更多
if (list.size() < amount) {
srlShare.setLoadMoreEnable(true);
} else {
srlShare.setLoadMoreEnable(false);
}
}
}
} else {
Functions.toast(this, getString(R.string.common_hint_server_error));
rvShare.showFailed();
}
//设置停止刷新(ProgressBar消失)
srlShare.setRefreshing(false);
srlShare.setLoading(false);
}
2015/11/3 17:20:58
使用不同布局的Listview
getViewTypeCount 返回该listview有多少个布局
getItemViewType 返回布局的id
有多少个布局就要创建多少个Holder
每个ListView都有一个数据源 下面给出一个例子:
1 | class Student{ |
我们重写getViewTypeCount跟getitemViewType方法如下
public class MyAdapter extends BaseAdapter{
//我们设置这个ListView 有两种布局,则就要定义两种type
//type为1时我们创建一个item,type为0时创建一个分割线
private static final int DATA = 1;
private static final int DIVIDER = 0;
ArrayList<Student> = new ArrayList<Student>();
.
.
.
.
.
@Override
public int getItemViewType(int position) {
//通过判断Student对象的stuNum的值来决定返回什么布局
if (getItem(position).getsuNum == -1) {
return DIVIDER;
}
return DATA;
}
}
@Override
public int getViewTypeCount(int position) {
//因为要返回两种布局类型,所以这里是2
return 2;
}
}
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
.
.
.
int type = getItemViewType(position);
switch(type){
case DATA:
//这里装载item数据
break;
case DIVIDER:
//这里装载一个divider
break;
}
}
在MainACtivity里,我们可以这样创建数据时,如果要加载一个Divider就设置Student里stuNum属性为-1 即可
ArrayList<Student> list = new ArrayList<>();
for(int i = 0 ;i<50;i++){
Student student = new Student();
student.setStuNum(i);
if(i%4==0){
student.setStuNum(-1);
}
list.add(student)
}
2015/11/3 17:21:14
notifyDataSetChanged方法正常使用的前提是数据源ID没变
2015/11/9 9:36:13
关于getItemViewType报数组越界的问题
原因:
getItemViewType的值必须小于getItemViewTypeCount
例子:
public static final int TYPE_COUNT = 2;
public static final int TYPE_USER_ME = 1;
public static final int TYPE_USER_OTHER = 2; //此处报错,应该设置成0
@Override
public int getItemViewType(int position) {
return users.get(position).getUserType();
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
2015/11/10 10:51:10
加载更多的逻辑判断
- 显示的数据>=下发的数据 则不可以加载更多
2015/11/10 14:22:34
下发后的json,转成对象后,集合一定要判断是否为空。
2015/11/10 14:36:52
listview点击item选中的实现
- 在Adapter定义一个类方法setSelectedItem,用于接收点击的item。
- 外部listiview点击事件中调用上述方法即可。
public static void setSelectedItem(int selectedItem) {
MySchoolAdapter.selectedItem = selectedItem;
}
public void onItemClick(AdapterView<?> adapterView, View view, int i,long l) {
mySchoolAdapter.setSelectedItem(i);//用于设置adapter的点击项
}
//getView下面重写 使其 点击选中修改背景
if (i == selectedItem) {
holder.tvSchool.setTextColor(context.getResources().getColor(R.color.common_system_style_red));
holder.rlRoot.setBackgroundColor(context.getResources().getColor(R.color.white));
} else {
holder.tvSchool.setTextColor(context.getResources().getColor(R.color.white));
holder.rlRoot.setBackgroundColor(context.getResources().getColor(R.color.common_system_style_red));
}
2016/1/4 0:26:37
ListView的Item点击传递对象
- Adapter 的getItem返回集合的对象 可以在getView里重用,将点击的数据传递给下一个activity
示例:
public AgencyInfo getItem(position){ //将Object改成实际的对象
return list.get(position);
}
.
.
.
public getView(....){
int tag = 1; //定义一个tag 用于获取相关的数据
AgencyInfo info = getItem(position);
convertView.setonClickListener(....){
AgencyInfo msg = v.getTag(tag);//之后便可以将msg对象传给下一个Activity
}
convertView.setTag(tag,info);
}
总结:
- 重写getItem方法、getView设置tag
- 通过setTag设置对象、通过getTag获取对象