Android listview动态添加删除更新带ProgressBar的Item

Qt开发实战:C++与QML混合编程核心模式与架构设计 在跨平台应用开发中,GUI框架的选择与架构设计是决定项目成败的关键。Qt作为成熟的跨平台C++框架,其核心在于提供了一套完整的工具链,其中C++负责底层逻辑与性能,而QML则专注于声明式UI构建。从技术原理上看,C++采用命令式编程范式,强调对内存、线程和计算过程的精确控制,适合处理核心算法与系统交互;QML基于声明式范式,通过属性绑定和状态机实现高效的UI响应与动画,其场景图技术利用GPU加速渲染。这种分工的价值在于兼顾了应用的性能与开发效率,尤其适用于需要复杂业务逻辑与现代化界面的场景,如工业控制软件、 阅读详情

网上找资料看到一段代码,还是很不错的,至少里面逻辑处理挺好的,

但是如果我要实现局部更新单个ItemView的话不想用notifyDataSetChanged()可以用本文最末尾的方法测试下。微笑

MainActivity.java  Activity类

package com.example.androidlistprogress;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
	
	int jobcounter = 0 ;
    
    private static final int ADDJOB = 1001;
    private static final int PROCESSADD = 1002;
    private static final int PROCESSDONE = 1003;
    private static final int ITEMBUTTON_CLICKED = 1004;
     
    private static final String TAG = "ListviewTest";
 
    protected static final long REFRESH_INTERVAL = 100; 
 
    protected boolean mBusy = false ;
    long lastupdatetime = 0 ;
     
     
    Object lock = new Object() ;
     
    ListView listview ;
    Button buttonadd ;
     
    AddjavaListAdapter adapter ;
    LayoutInflater inflater ;
     
    LinkedHashMap<Integer, ListInfo> listdatas ;
     
    LinkedHashMap<Integer, ListInfo> addlist = new LinkedHashMap<Integer, MainActivity.ListInfo>() ;
    List<Integer> delidlist = new ArrayList<Integer>() ;
     
     
    Handler mainhandler = new Handler(){
         
        public void handleMessage(android.os.Message msg) {
            long v = System.currentTimeMillis() - lastupdatetime ;
             
             
            switch (msg.what) {
            case ADDJOB:
 
                //if (inView(msg.arg1) && !mBusy) {
//                  Log.i(TAG, " ADDJOB done!") ;
                    updateListView();
                    lastupdatetime += REFRESH_INTERVAL ;
                //}
                break;
            case PROCESSADD:
                if ( !mBusy && v>REFRESH_INTERVAL) {
                        updateListView();
                        lastupdatetime = System.currentTimeMillis() ;
                }
                break;
                 
            case ITEMBUTTON_CLICKED:{
                if(!listdatas.get(msg.arg1).running ) {
                    synchronized (listdatas.get(msg.arg1).lock) {
                        listdatas.get(msg.arg1).lock.notifyAll() ;
                    }
                } 
                listdatas.get(msg.arg1).running = !listdatas.get(msg.arg1).running ;
                if ( !mBusy ) {
                        updateListView();
                        lastupdatetime += REFRESH_INTERVAL ;
                }
                break;
            }
            case PROCESSDONE:
//              Log.i(TAG, " PROCESSDONE done!"+msg.arg1) ;
                synchronized (lock) {
                    delidlist.add(msg.arg1) ;
                }
                updateListView();
                lastupdatetime += REFRESH_INTERVAL ;
                break;
 
            default:
                break;
            }
 
        };
         
    };
 
    void updateListView(){
        synchronized (lock) {
            for (Integer delid : delidlist) {
                Log.i(TAG, " PROCESSDONE done!"+delid) ;
                listdatas.remove(delid) ;
            }
            listdatas.putAll(addlist) ;
             
            for (ListInfo info : addlist.values()) {
                //启动工作线程
                new WorkThread("workthread#"+jobcounter,info).start() ;
                jobcounter++ ;
            }
            //清空 delidlist 和 addlist
            delidlist.clear() ;
            addlist.clear() ;
        }
        adapter.notifyDataSetChanged();
    }
     
     
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        listdatas  = new LinkedHashMap<Integer, ListInfo>() ;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        listview = (ListView) findViewById(R.id.listView001) ;
        adapter = new AddjavaListAdapter();
        listview.setAdapter(adapter) ;
        //设置 当listview 进行上下拖动操作时的状态
        listview.setOnScrollListener( new OnScrollListener() {
             
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                case OnScrollListener.SCROLL_STATE_IDLE:
                    mBusy = false;
                     
                    break;
                case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                    mBusy = true;
                    break;
                case OnScrollListener.SCROLL_STATE_FLING:
                    mBusy = true;
                    break;
                }
            }
             
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                 
            }
        }) ;
         
         
        buttonadd  = (Button) findViewById(R.id.button_listaddjob);
        buttonadd.setOnClickListener(this);
         
        inflater = LayoutInflater.from(this);  
         
    }
    // 存放单条 listview 的数据
    class ListInfo{
        @Override
        public String toString() {
            return "ListInfo [index=" + index + ", id=" + id + ", running="
                    + running + ", title=" + title + ", process=" + process
                    + "]";
        }
        int index ;
        long id ;
        boolean running = true ;
         
        String title  ;
        int process ;
         
        Object lock = new Object();
    }
     
    class ViewHodler{
         
         
        TextView text ;
        ProgressBar bar ;
        Button button ;
        ItemClickListener listener;
         
    }
     
    // listview的适配器
    class AddjavaListAdapter extends BaseAdapter {
         
         
         
        @Override
        public int getCount() {
            return listdatas.keySet().size();
        }
 
        @Override
        public Object getItem(int position) {
            //从 listdata里获取 对应的数据 ,因为有删除的缘故.在有任务完成后 position不等于listdata的key
            Object[] d = listdatas.keySet().toArray() ;
            int c = (Integer)d[position] ;
//          Log.i(TAG, "~~~~~getItem~~position["+position+"] [c="+c+"]") ;
            return listdatas.get(c) ;
        }
 
        @Override
        public long getItemId(int position) {
            return ((ListInfo)this.getItem(position)).id ;
        }
 
        @Override
        public View getView(int position, View v, ViewGroup parent) {
            ViewHodler holder ;
            //  获取单条item 的view对象
            if (v==null) {
                v = inflater.inflate(R.layout.listview_item, null) ;
                holder = new ViewHodler() ;
                 
                holder.text = (TextView) v.findViewById(R.id.textView_item) ;
                holder.bar = (ProgressBar) v.findViewById(R.id.progressBar_item);
                holder.button = (Button) v.findViewById(R.id.button_item) ;
                holder.listener = new ItemClickListener() ;
                 
                v.setTag(holder) ;
                 
            }else{
                holder = (ViewHodler) v.getTag();
            }
            //将数据显示到每个对应的 view上.
            final ListInfo data = (ListInfo)getItem(position) ;
             
            holder.listener.setId(data.index) ;
            holder.button.setOnClickListener(holder.listener) ;
             
            holder.text.setText(data.title) ;
            holder.bar.setProgress(data.process) ;
            if (data.running) {
                holder.button.setText("正在运行 ") ;
            }else{
                holder.button.setText("开始") ;
            }
             
            return v;
        }
         
    }
     
     
    class ItemClickListener implements  OnClickListener{
        private int id ;
         
        public void setId(int id) {
            this.id = id;
        }
 
        @Override
        public void onClick(View v) {
            Log.i(TAG,"button clicked! "+id +"|"+listdatas.get(id).running+"-->"+!listdatas.get(id).running);
            sendMessageToHandler(ITEMBUTTON_CLICKED,id) ;
        }
         
    }
     
    class WorkThread extends Thread{
         
        ListInfo in ;
        public WorkThread(String name ,ListInfo in){
            super(name) ;
            this.in = in ;
        }
         
        @Override
        public void run() {
            ListInfo sdata = listdatas.get(in.index) ;
             
            while(sdata.process<100) {
                 
                //如果暂停 则等待
                if(!listdatas.get(in.index).running ) {
                    synchronized (listdatas.get(in.index).lock) {
                        try {
                            listdatas.get(in.index).lock.wait() ;
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                } 
                //模拟耗时任务操作
                try {
                    Thread.sleep((int)(3000*new Random().nextDouble()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sdata.process += new Random().nextInt(15)+1 ;
                sendMessageToHandler(PROCESSADD,in.index) ;
            }
            //发送任务结束消息
            if (sdata.process>=100) {
                sendMessageToHandler(PROCESSDONE,in.index) ;
//              Log.i(TAG, this.getName()+"#done") ;
 
            }
        }
         
    }
     
     
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_listaddjob:{
             
            ListInfo info = new ListInfo() ;
            info.title = "file" + jobcounter ;
            info.process = 0 ;
            info.id = jobcounter ;
            info.index = jobcounter ;
            synchronized (lock) {
                addlist.put(jobcounter, info) ;
            }
            sendMessageToHandler(ADDJOB,jobcounter) ;
             
            break;
        }
         
        default:
            break;
        }
    }
     
     
    void sendMessageToHandler(int what,int arg1){
        Message message = mainhandler.obtainMessage() ;
        message.what = what ;
        message.arg1 = arg1 ;
        message.sendToTarget() ;
    }

}


?

布局文件 listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="TextView" />

    <ProgressBar
        android:id="@+id/progressBar_item"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="0.75" />

    <Button
        android:id="@+id/button_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:focusable="false"
        android:text="start progress" />

</LinearLayout>


布局文件 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button_listaddjob"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="add a progress" />
 
    <ListView
        android:id="@+id/listView001"
        android:layout_below="@id/button_listaddjob"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</RelativeLayout>


 程序运行效果



[java]  view plain copy
  1. public void updateView(int itemIndex) {  
  2.         //得到第一个可显示控件的位置,  
  3.         int visiblePosition = mListView.getFirstVisiblePosition();  
  4.         //只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新  
  5.         if (itemIndex - visiblePosition >= 0) {  
  6.             //得到要更新的item的view  
  7.             View view = mListView.getChildAt(itemIndex - visiblePosition);  
  8.             //从view中取得holder  
  9.             ViewHolder holder = (ViewHolder) view.getTag();  
  10.             HashMap<String, Object> item = data.get(itemIndex);  
  11.               
  12.             holder.listItem = (RelativeLayout) view.findViewById(R.id.rl_item);  
  13.             holder.ibPlay = (ImageButton) view.findViewById(R.id.ib_play);  
  14.             holder.ibDelete = (ImageButton) view.findViewById(R.id.ib_delete);  
  15.             holder.tvName = (TextView) view.findViewById(R.id.tv_record_sound_name);  
  16.             holder.tvLastModifyTime = (TextView) view  
  17.                     .findViewById(R.id.tv_record_time);  
  18.             holder.tvCurrentPlayTime = (TextView) view  
  19.                     .findViewById(R.id.tv_current_play_time);  
  20.             holder.tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time);  
  21.             holder.sb = (MySeekBar) view.findViewById(R.id.pb_play);  
  22.             holder.layout = (LinearLayout) view  
  23.                     .findViewById(R.id.play_progress_info);  
  24.               
  25.             updateData(itemIndex, holder, item);  
  26.         }         
  27.     }  



自定义一个adapter继承BaseAdapter,写一个如上的方法,要更新数据时,不要调用notifyDataSetChanged()方法,调用上面的方法,即可做到更新单个item

这个艹蛋的问题,纠结了我好久。总算搞定了。。。


拼多多Android面试题及参考答案 Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。 阅读详情

相关推荐

Android 自定义ListView实现Item左右滑动删除

最近工作之中,要实现ListView左右滑动删除Item功能,在此做个记录。 案例图: 1.自定义ListView import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfigurati

安卓兼职framework和app工程师的博客 865

Android中ProgressBar进度条的动态更新实践

本文还有配套的精品资源,点击获取 简介:在Android应用开发中,ProgressBar用于显示任务执行进度。本教程深入讲解了如何结合Handler消息机制动态更新ProgressBar的进度显示,涵盖线性与圆形ProgressBar的使用以及进度值与数值的同步展示。通过具体代码示例,展示了如何在布局文件中创建ProgressBar,并通过Handler更新进度条和文本视...

weixin_35238815的博客 3263

android progressbar 循环,Android如何更新ProgressBar的值?

我的活动有一个ProgressBar.当开始活动时,我会检查从另一个地方获取的值并更新到ProgressBar.这是我的代码:final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar_detail);final TextView progressText = (TextView) findViewById...

weixin_29199873的博客 350

深入Android构建系统:一次修改ro.vendor.build.fingerprint失败的排查与解决记录

本文深入探讨了Android构建系统中修改ro.vendor.build.fingerprint的完整解决方案。通过分析vendor分区的特殊地位和构建指纹的生成路径,提供了三种实战修改方法,并揭示了指纹修改可能遇到的陷阱与对策,帮助开发者彻底解决这一常见问题。

weixin_30621711的博客 144

小案例:利用图床自动化批量上传图片并获取图片链接

用python爬虫写了一个小脚本,用来自动上传图片到图床,然后返回链接,我们只需直接复制链接就可以。(需要安装Requests库) 因为不同图床需要提交的POST表单不一致,所以在这里我用ImgURL图床做示范,如果大家有需求,可自行修改代码。使用脚本的时候,我们只需把需要上传的图片和这个脚本放在同一个文件夹中,然后运行脚本,稍作等待,看到提示时就可以在脚本运行文件夹中发现一个名为“图片链接地址.txt”的文件,里面就是图片链接啦! 四、图片链接地址.txt(单张图片):...

采菊东篱下,Python满乾坤! 4413

android listview删除刷新,如何刷新Android ListView?

添加/删除动态数据后如何刷新Android ListView ?#1楼请忽略所有对此问题的invalidate() , invalidateViews() , requestLayout() ,...答案。故障排除如果调用notifyDataSetChanged()不起作用,则所有布局方法也无济于事。 相信我ListView已正确更新。 如果找不到差异,则需要检查适配器中数据的来源。如果这只是一个...

weixin_32441957的博客 1375

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

Android开发---ListView实现局部刷新及删除

例如 A.jsp 里面有个 文本框 A.jsp 提交到 B_Servlet.java 那么 B 里面的 request.getParameter("id"); 就是取的 这个文本框里的值 如果访问 B_Servlet 的URL 类似与 http://localhost/test/b.do?id=123 那么 request.getParameter("id"); 的值就是 123

xunshishi的博客 3560

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 610

CST新手必看:共面波导色散曲线绘制全流程(附参数设置避坑指南)

本文详细介绍了CST Microwave Studio中绘制共面波导色散曲线的全流程操作,特别针对新手常见的边界条件设置错误、参数扫描失效等问题提供解决方案。通过模型建立、边界条件设置、本征模求解器配置等步骤,帮助工程师快速掌握CPW色散特性分析方法,并附有参数设置避坑指南,提升高频电路设计效率。

tomato的博客 990

音乐练习记录应用HarmonyOS ArkTS API 24 Stack 配合 Column 实现的进度条和柱状图组件,展示了在缺乏专用图表库时如何利用基础布局组件构建数据可视化效果

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 243

Unidbg补环境实战:复现Shopee风控Native层运行环境

Android App风控已从HTTP层签名校验,演进为深度依赖Native层系统调用与硬件特征的多维验证。其核心原理在于通过JNI桥接Java与Native代码,调用openat、sysconf、getrandom等系统接口读取/proc、/sys、/dev等路径的真实状态,并结合SELinux策略、CPU拓扑、分区哈希等硬性指标构建设备可信画像。这种技术架构显著提升了对抗黑灰产的能力,但也对逆向分析与自动化调用提出更高要求——必须精准模拟底层环境而非仅Hook逻辑。Unidbg补环境正是为此而生:它支持

weixin_30533109的博客 640

Android开发——ListView局部刷新的实现

0. 前言 局部刷新,即只需要在数据发生变化时才去刷新ListView中对应的Item,数据未发生变化时不会去刷新ListView中对应的Item。对于getView()非常耗时的情况下将体现出极大的性能优化。局部刷新的功能早已经被集成在了RecycleView中,而且RecycleView还引入了增加和删除的动态效果等等,在性能上和定制上都有很大的改善。本篇着重介绍ListView中局部刷新的...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 6582

18|AI 辅助精准测试:让平台会解释、会总结、会推荐

本文介绍 AI 在精准测试平台中的落地方式,包括变更摘要、风险解释、补测建议和报告总结。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。从报告中提取变更文件、未覆盖行、推荐用例。拼成结构化 JSON。让 AI 生成 200 字质量摘要。把摘要展示在报告顶部。读完本文后,可以复制下面的 Prompt,让 AI 生成一个报告总结练习。你是一名 AI 应用开发专家和测试架构师。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 55

成对使用离轴抛物面反射镜的设计

成对使用离轴抛物面反射镜的设计

weixin_72050316的博客 638

android listview增删改查 工程,Android应用开发Android listview 增删改查代码实例

本文将带你了解Android应用开发Android listview 增删改查代码实例,希望本文对大家学Android有所帮助。"ListView?12345678ListView可以用于展示列表数据,配合嵌入列表的控件,可以实现各种复杂的逻辑.我查到的资料里对ListView的使用大部分是显示固定的列表,少有谈及ListView的动态修改.这里大致总结下怎么动态增删改查列表备忘.ListView...

weixin_32311823的博客 588

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能

大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下拉是怎么实现的,滑动删除功能是怎么实现,其实要实现这些功能又不是唯一的方法,但是基本上思想都是一致的。然后githup上的这些例子是非常的多,然后实现的也是大同小异但是也不能不让我们去球童存异。作为天朝

Losileeya 5745

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 对listview数据的增删改查

android 对listview数据的增删改查 android listview是常用的数据展示控件。其中对数据的增删改查操作也是常用的功能,比如重新获取了新的数据,或者添加,删除某条记录等等更新都需要对listview的数据进行重新的加载。listview更新数据只需要调用到notifyDataSetChanged()方法,就可以实现对listview数据的更新。如果涉及

u010507199的专栏 7099

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓ListView的用法

ListView 列表视图是android中最常用的一种视图组件,它以垂直列表的形式列出需要显示的列表项。在android中有两种方法向屏幕中添加列表视图:一种是直接使用ListView组件创建;另外一种是让Activity继承ListActivity实现。下面分别介绍这两种方法: 一、直接使用ListView组件创建 在布局文件中首先添加ListView 代码 <?xml version=...

qq_38939691的博客 793

Android开发--自定义控件实现listview的滑动删除item

首先我们在日常的软件使用中已经有很多这样的例子了,例如我们用到的QQ、微信都具有这样的功能。 而本文只是简单的起一个引导的作用,在已经存在的listview的基础上对其进行改造,使它能更好的满足 我们在开发当中遇到的需求。 首先,我们先看下我们要达到的效果: 看到效果图,首先我们来思考一下,要实现这样的效果,我们需要进行怎样的步骤?

Poison_H的专栏 5319

【Android】ListView内数据的动态追加

设计思路 把置入适配器的list追加数据记录,再使用适配器的notifyDataSetChanged()刷新。 方法案例 以http://blog.youkuaiyun.com/jueblog/article/details/12114513的ListView为例,对Activity作如下改进。 package com.app.test01; import java.util.Arr

欲买桂花同载酒,终不似,少年游。 6322

listView的item向左滑动实现删除

有一种删除功能是这样的: ListView的item向左滑动,实现删除功能 注释很清楚,简单明了 1.自定义LeftDeleteView.java继承HorizontalScrollView.java public class LeftDeleteView extends HorizontalScrollView { private int start;//开始滑动的

u012123938的专栏 4511

Android列表侧滑删除就是这么简单

前言:今天突然想起来了列表的滑动删除功能,一些下拉刷新的框架也会带这个侧滑删除的功能,比如一些listview的和recycleview的刷新框架都有这个功能,我今天写这个博客的目的是如何不依赖这些框架也是实现侧滑删除,如果自己已经使用的列表框架没有侧滑删除怎么给单独加入侧滑删除功能。 概括:我今天写的这个文章就是讲的是怎么单独给列表加入侧滑删除功能,不去为了侧滑删除而依赖一个列表框架,就是说如

蒙的博客 1万+

android listview刷新 侧滑,android--------ListView和ExpandableListView的侧滑删除操作

本案例主要实现了ListView和ExpandableListView的侧滑删除操作功能效果图: 代码:private class SlideAdapter extends BaseAdapter {private LayoutInflater mInflater;SlideAdapter() {super();mInflater = getLayoutInflater();}@Overridep...

weixin_33751984的博客 349

详解Android中实现ListView左右滑动删除条目的方法

使用Scroller实现绚丽的ListView左右滑动删除Item效果这里来给大家带来使用Scroller的小例子,同时也能用来帮助初步解除的读者更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果。例如侧滑菜单,launcher,ListView的下拉刷新等等效果,我今天实现的是ListView的item的左右滑动删除item的效果,现在很多朋友看到这个...

weixin_30498921的博客 440
上一篇: TouchImageView源码分析
下一篇: 解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值