Android ListView嵌套ListView、滚动刷新数据

ListView 与 RecyclerView 对比 布局效果对比 常用功能与API对比 在Android L引入嵌套滚动机制(NestedScrolling) ListView与RecyclerView的简单使用: ListView:  1. 继承重写BaseAdapter类;  2. 自定义ViewHolder与convertView的优化(判断是否为null); RecyclerView:  1. 继承重写RecyclerView.Adapt... 阅读详情

       

       在Android开发中,咱们常用到的API中ListView就是其中之一,其在有限的手机屏幕上友好的展示数据提供了很好的功能,包括列表展示数据,及滚动分页展示数据,在界面上如果不需要ListView互相嵌套,那么使用就很简单,如:

    //context :界面容器对象

    //new ArrayList<Map<String,Object>>() :需要展示的数据集合

    //R.layout.layout_name 数据项展示列表xml界面

    //new String[]{}  :绑定数据字段名称

    //new int[]{} :需要绑定的空间ID名称

    SimpleAdapter  simpleAdapter= new SimpleAdapter  (context,new ArrayList<Map<String,Object>>(), R.layout.layout_name, new String[]{},new int[]{});

    ListView listView=new ListView();

    listView.setAdapter(simpleAdapter); 

    效果图展示链接:http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward        


   如果某页面数据展示较为复杂,需要嵌套ListView才可展示出来,总的思路就是 在adapter中的getView方法中再次使用 嵌套的adaper来绑定数据展示子ListView信息,如:

   /**
     * @Description TODO(父明细展示适配器)
     * @author 
     * @Date 2014-7-1 11:03:43
     *
     */
    private class  BalancePayAdapter  extends SimpleAdapter{
    //获取收支详细记录信息
    List<Map<String,Object>> dataDetails;
    LayoutInflater mInflater;
    Context context;
    ListViewInScrollView listViewDetail;
    private TextView  balance_pay_year_lable;
    private TextView  pay_amount_total_title;
    private TextView  pay_number_title;
    private TextView  income_amount_total_title;
    private TextView  income_number_title;
    private TextView  balance_pay_year;
    private TextView  balance_pay_month;
    private TextView  balance_pay_day;
    private LinearLayout pay_id_lin_LinearLayout;
    private LinearLayout income_id_lin_LinearLayout;
public BalancePayAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context=context;
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.dataDetails=(List<Map<String, Object>>) data;
}
/**
* @Description TODO(收支详细记录信息)
* @param dataDetail
*/
public void setDataDetails(List<Map<String,Object>> dataDetails){
this.dataDetails=dataDetails;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
if(convertView==null){
 convertView = mInflater.inflate(R.layout.listview_balance_pay_item, null); 
}


//设置收支日期
balance_pay_year=(TextView) convertView.findViewById(R.id.balance_pay_year);
balance_pay_month=(TextView) convertView.findViewById(R.id.balance_pay_month);
balance_pay_day=(TextView) convertView.findViewById(R.id.balance_pay_day);

//设置某天支出总额
pay_amount_total_title=(TextView) convertView.findViewById(R.id.pay_amount_total_title);
//设置某天支出笔数
pay_number_title=(TextView) convertView.findViewById(R.id.pay_number_title);
//设置某天收入总额
income_amount_total_title=(TextView) convertView.findViewById(R.id.income_amount_total_title);
//设置某天收入笔数
income_number_title=(TextView) convertView.findViewById(R.id.income_number_title);
balance_pay_year_lable=(TextView) convertView.findViewById(R.id.balance_pay_year_lable);

listViewDetail=(ListViewInScrollView)convertView.findViewById(R.id.balance_pay_detail_view);
if(null!=dataDetails&&!dataDetails.get(position).isEmpty())
   {       Map mainMapData= dataDetails.get(position);
           String balancePayRemark=PMSUtil.isNull(mainMapData.get("balancePayRemark"));
           //获取当年年份
           String currentYear=DateTimeUtil.formatDate8(new Date());
           String queryDate=PMSUtil.isNull(mainMapData.get("balance_pay_date"));
           String[] yearMonthDay=new String[]{"XXXX","XX","XX"};
           if(null!=queryDate&&!"".equals(queryDate)){
            yearMonthDay=queryDate.split("-");
           }
              /**
               * 
               * 开始设置实际内容
               */
           if(currentYear.equals(yearMonthDay[0])){
              balance_pay_year.setVisibility(View.GONE);
              balance_pay_year_lable.setVisibility(View.GONE);
           }
           balance_pay_year.setText(PMSUtil.isNull(yearMonthDay[0]));
           balance_pay_month.setText(PMSUtil.isNull(yearMonthDay[1]));
           balance_pay_day.setText(PMSUtil.isNull(yearMonthDay[2]));
           
   pay_amount_total_title.setText(PMSUtil.isNull(mainMapData.get("pay_amount_total")));
   String pay_number=PMSUtil.isNull(mainMapData.get("pay_number"));
   pay_number_title.setText(pay_number);
   if(pay_number==null||"".equals(pay_number)||(Constant.REMARK_KEY_VALUE.equals(balancePayRemark)&&"1".equals(pay_number))){
    pay_id_lin_LinearLayout=(LinearLayout) convertView.findViewById(R.id.pay_id_lin);
    pay_id_lin_LinearLayout.setVisibility(View.GONE);
   }
  
   income_amount_total_title.setText(PMSUtil.isNull(mainMapData.get("income_amount_total")));
   String income_number=PMSUtil.isNull(mainMapData.get("income_number"));
   income_number_title.setText(income_number);
   income_id_lin_LinearLayout=(LinearLayout) convertView.findViewById(R.id.income_id_lin);
   if(income_number==null||"".equals(income_number)||"0".equals(income_number)){   
    income_id_lin_LinearLayout.setVisibility(View.GONE);
   }else{
    income_id_lin_LinearLayout.setVisibility(View.VISIBLE);
   }
   

        String[] from=new String[]{"id","create_date","amount","income_model","remark","thumbnail_path"};
int[] to=new int[]{R.id.incomeId,R.id.create_date_title,R.id.amount_title,R.id.income_model_title,R.id.remark_title,R.id.image_uri_path_title};
//获取收支详细记录信息
    List<Map<String,Object>> dataDetail=(List<Map<String, Object>>) mainMapData.get("datas");
    BalancePayDetailAdapter balancePayDetailAdapter = new BalancePayDetailAdapter(position,context, (dataDetail==null?new          ArrayList<Map<String,Object>>():dataDetail), R.layout.listview_balance_pay_detail_item, from, to);
   
   
    listViewDetail.setOnItemClickListener(new BalancePayDetailOnItemClickListener());           
           listViewDetail.setAdapter(balancePayDetailAdapter);
           
   }
  return convertView;
}

/**
* @Description TODO(收支详细ListView选择事件)
* @author
*
*/
private class BalancePayDetailOnItemClickListener implements OnItemClickListener{


@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long arg3) {
  ListView lView=(ListView)adapter;//adapter其实就是ListView
 ImageView imageView= (ImageView) view.findViewById(R.id.image_uri_path_title);
 Bitmap bitmap=imageView.getDrawingCache();
 
  if(R.id.deleteIncomeRecord==view.getId()){
  //点击了删除按钮
  Map<String,Object> map=(Map<String, Object>) lView.getItemAtPosition(position);
  if(incomeRecordService==null){
  incomeRecordService=new IncomeRecordServiceImpl(context);
  }
  try {
Map msg=incomeRecordService.deleteIncomeRecordInfo(map);
if( Constant.MSG_RESULT_TRUE.equals(msg.get(Constant.MSG_RESULT_CODE))){
   if(!bitmap.isRecycled()){
 bitmap.recycle();
   }
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }

}

}
      }




      /**
     * @Description TODO(子明细适配器)
     * @author 
     *
     */
    private class  BalancePayDetailAdapter  extends SimpleAdapter{
    //获取收支详细记录信息
    List<Map<String,Object>> dataDetails;
    LayoutInflater mInflater;
    private TextView create_date_view;
    private TextView amount_view;
    private TextView income_model_view;
    private TextView remark_view;
    private ImageView image_uri_path_view;
    private ImageButton deleteIncomeRecord;
    private Bitmap bmp;
    private int positionParent;


    private Context context;
public BalancePayDetailAdapter(int position,Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context=context;
this.dataDetails=(List<Map<String, Object>>) data;
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.positionParent=position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
if(convertView==null){
 convertView = mInflater.inflate(R.layout.listview_balance_pay_detail_item, null); 
}
if(null!=dataDetails&&!dataDetails.get(position).isEmpty())
   {       
Map mainMapData= dataDetails.get(position);
  
create_date_view=(TextView) convertView.findViewById(R.id.create_date_title);
amount_view=(TextView) convertView.findViewById(R.id.amount_title);
income_model_view=(TextView) convertView.findViewById(R.id.income_model_title);
remark_view=(TextView) convertView.findViewById(R.id.remark_title);
image_uri_path_view=(ImageView) convertView.findViewById(R.id.image_uri_path_title);
deleteIncomeRecord=(ImageButton) convertView.findViewById(R.id.deleteIncomeRecord);
deleteIncomeRecord.setOnClickListener(new DeleteBalancePayRecordOnClickListener(position));
create_date_view.setText(PMSUtil.isNull(mainMapData.get("create_date")));
amount_view.setText(PMSUtil.isNull(mainMapData.get("amount"))+getResources().getString(R.string.rmb));
//income_model_view.setText(Constant.getIncomeModelValue(PMSUtil.isNull(mainMapData.get("income_model"))));
income_model_view.setText(PMSUtil.isNull(mainMapData.get("project_name")));
String income_model=PMSUtil.isNull(mainMapData.get("income_model"));
if(Constant.incomeModel[0].equals(income_model)){
//支出
amount_view.setTextColor(getResources().getColor(R.color.lightred));

}else if(Constant.incomeModel[1].equals(income_model)){
//收入
amount_view.setTextColor(getResources().getColor(R.color.lightblue));

}

remark_view.setText(PMSUtil.isNull(mainMapData.get("remark")));
image_uri_path_view.setOnClickListener(new ImageViewOnClickListener(position));
String image_uri_path=PMSUtil.isNull(mainMapData.get("thumbnail_path"));
if(image_uri_path!=null&&!"".equals(image_uri_path)&&!"null".equals(PMSUtil.isNull(image_uri_path))){
    try {    
//BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 1;
//bmp = BitmapFactory.decodeFile(image_uri_path, options);
// bmp=OptimizeImage.decodeSampledBitmapFromFile(image_uri_path, 100, 100);
// image_uri_path_view.setImageBitmap(bmp);
   
    if(imageThreadNum<sysNum){
    //子线程异步加载图片数据
        new MyLoadImageThread(image_uri_path_view,image_uri_path).start();
        imageThreadNum++; 
    } else{
    //主线程加载图片
    OptimizeImage optimizeImage=OptimizeImage.initializeInstance();
    optimizeImage.loadBitmap(image_uri_path, image_uri_path_view);
    }
   
} catch (Exception e) {
Toast.makeText(context, R.string.loadImageError, Toast.LENGTH_SHORT).show();
} 
}else{
//image_uri_path_view.setVisibility(View.GONE);
image_uri_path_view.setMinimumHeight(30);
}
  }

return convertView;
}


   /**
    * @Description TODO(删除收支记录单击监听事件)
    * @author 彭甜
    *
    */
   public class DeleteBalancePayRecordOnClickListener implements OnClickListener{
    private int position;
       public DeleteBalancePayRecordOnClickListener(int position){
      this.position=position;
       }
@Override
public void onClick(View arg0) {
if(R.id.deleteIncomeRecord==arg0.getId()){
//删除收支记录
final Map mapData= dataDetails.get(position);
if(mapData!=null&&!"".equals(mapData.get("id"))){
AlertDialog.Builder builder = new Builder(context);
builder.setMessage("确认删除吗?");
builder.setTitle("提示");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
//删除的收支金额
double amount=PMSUtil.toTwoPointDouble(PMSUtil.isNull(mapData.get("amount")));   
try {
if(incomeRecordService==null){
incomeRecordService=new IncomeRecordServiceImpl(context);
}

Map msg=incomeRecordService.deleteIncomeRecordInfo(mapData);
if((Constant.MSG_RESULT_TRUE).equals(msg.get(Constant.MSG_RESULT_CODE))){

//刷新收支明细ListView
dataDetails.remove(position);
BalancePayDetailAdapter.this.notifyDataSetChanged();
//刷新收支明细ListView 父级
String income_model=PMSUtil.isNull(mapData.get("income_model"));
if((Constant.incomeModel[0]).equals(income_model)){
    //支出数据调整
    int pay_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("pay_number")));
    double pay_amount_total=PMSUtil.toTwoPointDouble(PMSUtil.isNull(list.get(positionParent).get("pay_amount_total")));
    list.get(positionParent).put("pay_amount_total", PMSUtil.toNPointDouble(pay_amount_total-amount));
    list.get(positionParent).put("pay_number", pay_number-1);
}else if((Constant.incomeModel[1]).equals(income_model)){
    //收入数据调整
    int income_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("income_number")));
    double income_amount_total=PMSUtil.toTwoPointDouble(PMSUtil.isNull(list.get(positionParent).get("income_amount_total")));
    list.get(positionParent).put("income_amount_total", PMSUtil.toNPointDouble(income_amount_total-amount));
    list.get(positionParent).put("income_number", income_number-1);
}
int income_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("income_number")));
int pay_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("pay_number")));
if((income_number<1&&pay_number<1)||(income_number<=0&&pay_number<=1)){
String balance_pay_date=PMSUtil.isNull(list.get(positionParent).get("balance_pay_date"));
incomeRecordService.deleteIncomeRecordByIncomeDate(balance_pay_date);
//但某天收支记录都没有时候 就删除这天的记录
list.remove(positionParent);
//总记录数也就减一
--num;
}
//刷新最上级ListView列表
simpleAdapter.notifyDataSetChanged();
}
Toast.makeText(context, PMSUtil.isNull(msg.get(Constant.MSG_RESULT_DES)), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.getStackTrace();
Toast.makeText(context,"删除收支记录失败("+e.getMessage()+")", Toast.LENGTH_SHORT).show();
}
arg0.dismiss();
} });
builder.setNegativeButton("取消", new DialogInterface.OnClickListener(){


@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
}
 
 });
 builder.create().show();

}
}

}

   
   }
   
   /**
    * @Description TODO(图片点击监听)
    * @author 彭甜
    *
    */
   public class ImageViewOnClickListener implements OnClickListener{
            private int position;
       
       public ImageViewOnClickListener(int position){
      this.position=position;
       }
@Override
public void onClick(View view) {
if(R.id.image_uri_path_title==view.getId()){
  //点击图片 
Map<String,Object> map=(Map<String, Object>)  dataDetails.get(position);
String image_uri_path = !PMSUtil.isEmpty(PMSUtil.isNull(map
.get("image_uri_path"))) ? PMSUtil.isNull(map
.get("image_uri_path")) : PMSUtil.isNull(map
.get("thumbnail_path"));
if(image_uri_path!=null&&!"".equals(image_uri_path)){
  Intent intent=new Intent(context,ImageZoomActivity.class);  
  intent.putExtra("image_uri_path", image_uri_path);
  startActivity(intent);
  }
  }

}
   
   }





    }


 有需要的朋友可以留下邮箱我把完整的源码发过去。

  效果图展示链接:http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward



Android ListView中处理嵌套滑动问题,类似ScrollView嵌套ListView 前言 最近笔者在友情客串去给一培训机构android培训生讲解android初级实际开发技巧中,就提到了这个问题.这里分享下,避免其他童鞋在处理类似的滑动嵌套上走同样的弯路. 这里打算用两篇来讲解我们开发中常遇到listView和recyclerView在处理滑动嵌套的时候的最佳解决方案. 实现思路 首先第一篇,是我们ListView.ListView相对于recyclerView处理相对要简单一些 阅读详情

相关推荐

Android ListView下拉刷新完整指南

本文还有配套的精品资源,点击获取 简介:在移动应用中实现ListView下拉刷新功能,需要使用SwipeRefreshLayout组件,处理适配器更新和自定义Header视图,以提供最新的数据。本指南将详细介绍如何实现这一功能,包括初始化SwipeRefreshLayout,设置下拉监听器,异步加载数据,更新ListView适配器以及可能的Header视图自定义。通过实际示...

weixin_42596011的博客 1387

Android有关ListView嵌套ListView的一些问题

利用ListView嵌套ListView实现评论回复功能

随风小江~ 2032

Android高效实现ListView上拉下拉刷新与加载更多

本文还有配套的精品资源,点击获取 简介:在Android开发中,ListView组件常用于展示数据列表。为了改善用户体验,开发者需要为ListView添加上拉下拉刷新和加载更多数据的功能。本课程将探讨实现这些功能的不同方法,包括使用第三方库如SwipeRefreshLayout或XListView,以及自定义实现滚动监听逻辑。课程将涉及自定义行为、性能优化和不同设备及And...

weixin_42298778的博客 1511

Android 中ListView 嵌套 ListView

在 Android 有时候会用到一个 ScrollView 嵌套一个 ScrollView 的问题,虽说不推荐这样使用。但是还是可以了解一下。 下面是一个 ListView 嵌套一个 ListView 。效果如下: 在上面的效果图中,主要是在于子 ListView 的滑动。这时候就需要由事件的分发机制来解决了。子 ListView 需要滑动,那么父 ListView 就不能把事

antimage08的博客 1061

Android ScrollView、ListView与GridView下拉刷新上拉加载实战详解

GridView的问题比ListView更严重,因为它还要考虑列数适配。我们可以通过重写来强制它展开:@Override这里的关键是用了模式,并赋予一个极大值(约50万像素),相当于说:“你想多高就多高,但别超过这个上限。虽然听着有点野蛮,但在某些固定内容的页面(如标签墙、功能入口网格)中还挺实用的。但说实话,这些“打补丁”的方式就像是给漏水的船贴创可贴。真正靠谱的解决方案,还得靠现代化的嵌套滚动架构。默认的刷新样式太普通?想要更有个性的动画?完全可以!

weixin_29025501的博客 941

安卓多级树形列表(最大同时异步加载60万条数据)

该安卓多级树形列表是在前人的基础上做了大量的优化而诞生的,目前已经支持多级拓展,异步一次性最大加载量60万条不崩溃,点击秒展开,支持全选与单选,支持点击单列后再插入数据,支持数据联动

RecyclerView嵌套RecyclerView的加载更多问题

recyclerview嵌套,子层recyclerview加载更多,会导致一直加载的问题,于是指定子层recyclerView的高度,但指定了高度子层的recyclerview就不能滑动,下面这篇文字能了解决这个问题。

我的专栏 1475

OpenEuler内核编译及替换

一、内核源码下载 在gitee上下载OpenEuler内核源码 下载地址 选择需要的内核版本源码压缩包进行下载 二、内核编译 1.解压缩 将下载好的源码进行解压 tar xvf openeuler-kernel-4.19.90-2107.1.0.tar.gz 2.清理源代码树 解压后得到一个名为kernel的内核源码文件夹,进入后执行命令 make mrproper 清理过去内核编译产生的config,第一次编译时可不执行此命令 3.生成内核配置文件.config 先将将系统原配置文件拷贝过来,原

m0_56602092的博客 2万+

问题记录-RecyclerView加载上千条数据的时候ANR

项目里有个普通的详情页面,有时候跳转到该页面后直接卡死,手指点几下屏幕后,就出现ANR,或者是容推送通知里跳转该详情页面,会出现黑屏现象。想了想,虽然我的列表数据没有分页,有些详情的item数据会有一千多条,但item绘制超出一屏后item就会被复用的,理论上没问题。我用命令adb shell data/anr导出整个anr文件夹,对应产生anr的时间,打开traces.txt文件,...

qq_21924213的博客 5510

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 331

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 376

Android开发之“ListView与RecyclerView的对比”

在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;如果我们需要淑贤自己的动画效果,我们可以通过相应的接口实现自定义的动画效果(RecyclerView.ItemAnimator类),然后调用RecyclerView.setItemAnimator() (默认的有SimpleItemAnimator与DefaultItemAnimator);而RecyclerView则不需要。

hcgeng的专栏 297

从仿真到实践:两级直接耦合放大电路的静态工作点协同调试指南

本文详细解析了两级直接耦合放大电路的静态工作点协同调试方法,从仿真到实践提供系统指南。重点介绍了Rc2电阻调整技巧、集电极电位测量方法及常见问题排查,帮助工程师解决各级静态工作点相互影响的难题,提升模拟电路设计效率。

weixin_29189373的博客 124

ListView 与 RecyclerView 简单对比

RecyclerView 与 ListView 的主要区别: 布局效果对比 常用功能与API对比 在Android L引入嵌套滚动机制(NestedScrolling) ListView与RecyclerView的简单使用: ListView: 1. 继承重写BaseAdapter类; 2. 自定义ViewHolder与convertView的优化(判断是否为null); Re...

shu_lance的博客 2万+

离合器KP点自学习:从原理到工程实践的全景解析

本文全面解析了离合器KP点自学习的原理与工程实践,详细介绍了KP点的物理本质、控制价值及自学习方法。通过扭矩增量式和转速变化式学习法,结合不同变速箱构型的适配策略,提升离合器控制的精度与效率。文章还探讨了液压系统迟滞补偿和摩擦材料老化应对方案,为工程实践提供可靠保障。

weixin_33717117的博客 287

【Bluetooth|蓝牙开发】三、一篇文章,带你总览蓝牙协议

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

ListView和RecycleView对比

1. 布局效果对比 RecycleView默认就支持,线性布局,网格布局,瀑布流布局。 2. API对比 2.1 ListView 继承重写BaseAdaoter类 自定义ViewHolder和convertView一起完成复用优化工作。 2.2 RecycleView 继承重写RecycleView.Adapater和RecycleView.ViewHolder 设置布局管理器,控制布局效果 package com.sihan.chatroomdemo; import android.view.Layo

weixin_47285644的博客 408

领域知识图谱构建的技术流程

因此概念的属性定义十分重要,通常大部分知识库中的概念属性都是采用人工定义等方式生成的,通用知识图谱则可以从开放数据集中获取概念的属性,然后从在线百科中学习实体的属性,并对实体属性进行往上规约从而生成概念的属性。由于百科的分类体系都是经过了百科管理员或是高级编辑人员的校验,其分类系统中的数据可靠性非常高,因此从百科中抽取概念和实体,通常将标题作为实体的候选,而将百科中的分类系统直接作为概念的候选。为了对知识进行合理的组织,更好地描述知识本身与知识之间的关联,需要对知识图谱的模式进行良好的定义。

weixin_43961909的博客 334

RecyclerView和ListView的对比分析

1、布局效果对比: Android 默认提供的 RecyclerView 就能支持 线性布局、网格布局、瀑布流布局 三种(这里我们暂且不提代码细节,后文再说),而且同时还能够控制横向还是纵向滚动。 2、API 使用对比: ListView 的基础使用大家再熟悉不过,其使用的关键点主要如下: A、继承重写 BaseAdapter 类; B、自定义 ViewHolder 和 convertVi...

haoyuegongzi的博客 561

7、Python高光谱分析工具(PyHAT)简介

Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高

aa123的博客 138

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Android】ListView和RecycleView的比较区别和各自的性能详述

RecyclerView 和 ListView 布局效果的对比 RecyclerView 和 ListView 一些常用的功能 和 API 的对比 RecyclerView 和 ListView 在 Android L 引入嵌套滚动机制之后的对比 有一点需要强调下,文中所有的效果在真机上都是很流畅的,因为录制 GIF 图很容易掉帧,所以特地放慢了操作,千万不要误会成卡顿了啊! 布局效果对比 作为一...

yuan1244487110的博客 8639

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android经常遇到Scrollview嵌套Listview造成listview无法滚动

Scrollview嵌套Listview造成listview无法滚动解决方法mActionAdapter.notifyDataSetChanged(); // 刷新按钮 setListViewHeightBasedOnChildren(mActionListView); public void setListViewHeightBasedOnChildren(ListView listView

TimMobile的博客 746

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Android面试】Listview和Recyclerview的区别

请你谈谈Listview和Recyclerview的区别Listview和Recyclerview的区别(阿里一面,滴滴一面,被问到)简单比较布局上局部刷新item view的重用ViewHolder嵌套滑动机制空数据处理Listview的二级缓存ActiveViewsScrapViewsRecyclerview的四级缓存RecyclerRecycledViewPoolViewCacheExtension Listview和Recyclerview的区别(阿里一面,滴滴一面,被问到) 简单比较 listvi

Rose J 的博客 5931

Android scrollview里面放listview 滚动出现的问题:只滚listview不滚scrollview

第一次用scrollview嵌套listview,发现scrollview不滚动只有listview在那艰难的滚动着、 想要让scrollview滚动  , 哈哈,解决了,很简单,先写一个工具类 package com.android.fmis.client.util; import android.view.View; import android.view.ViewGr

承諾、許卟哋 1684

Android控件系列——RecyclerView和ListView对比

RecyclerView和ListView对比 ViewHolder 均是用来保存视图引用的类 ListView ViewHolder需自己定义,可选择是否使用。如不使用,getView时会多次调用findViewById(),带来性能问题 RecycleView 必须自定义类使用RecycleView.ViewHolder类 布局效果 ListView 只能垂直方向滑动,系统API无水平方向滑动...

mLuoya的博客 4630
上一篇: Linux基本命令
下一篇: Android图片缓存技术
aspnetandjava
博客等级 码龄16年 43粉丝 42原创
评论 96
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值