Contents
  1. 1. ListView 分割线
  • 2015-09-15
    1. 1. 设置listview无点击背景效果
  • 2015/11/3 17:21:05
    1. 0.1. ListView的下拉刷新,上拉加载数据
  • 2015/11/3 17:20:58
    1. 0.1. 使用不同布局的Listview
  • 2015/11/3 17:21:14
    1. 0.1. notifyDataSetChanged方法正常使用的前提是数据源ID没变
  • 2015/11/9 9:36:13
    1. 0.1. 关于getItemViewType报数组越界的问题
  • 2015/11/10 10:51:10
    1. 0.1. 加载更多的逻辑判断
  • 2015/11/10 14:22:34
    1. 0.1. 下发后的json,转成对象后,集合一定要判断是否为空。
  • 2015/11/10 14:36:52
    1. 0.1. listview点击item选中的实现
  • 2016/1/4 0:26:37
    1. 1. ListView的Item点击传递对象
  • 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
    2
    3
    4
    class Student{
    private String name;
    private int stuNum;
    }

    我们重写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获取对象
    Contents
    1. 1. ListView 分割线
  • 2015-09-15
    1. 1. 设置listview无点击背景效果
  • 2015/11/3 17:21:05
    1. 0.1. ListView的下拉刷新,上拉加载数据
  • 2015/11/3 17:20:58
    1. 0.1. 使用不同布局的Listview
  • 2015/11/3 17:21:14
    1. 0.1. notifyDataSetChanged方法正常使用的前提是数据源ID没变
  • 2015/11/9 9:36:13
    1. 0.1. 关于getItemViewType报数组越界的问题
  • 2015/11/10 10:51:10
    1. 0.1. 加载更多的逻辑判断
  • 2015/11/10 14:22:34
    1. 0.1. 下发后的json,转成对象后,集合一定要判断是否为空。
  • 2015/11/10 14:36:52
    1. 0.1. listview点击item选中的实现
  • 2016/1/4 0:26:37
    1. 1. ListView的Item点击传递对象