android怎样选中listview中一行进行删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎样选中listview中一行进行删除相关的知识,希望对你有一定的参考价值。

listView是保存在SQLite数据库里,删除这一行后数据库里的数据也得删除

androidActivity生命周期

onStart()与onResume()有什么区别?

onStart()是activity界面被显示出来的时候执行的,但不能与它交互;

onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。

Activity启动流程

startActivity最终都会调用startActivityForResult,通过ActivityManagerProxy调用system_server进程中ActivityManagerService的startActvity方法,如果需要启动的Activity所在进程未启动,则调用Zygote孵化应用进程,进程创建后会调用应用的ActivityThread的main方法,main方法调用attach方法将应用进程绑定到ActivityManagerService(保存应用的ApplicationThread的代理对象)并开启loop循环接收消息。ActivityManagerService通过ApplicationThread的代理发送Message通知启动Activity,ActivityThread内部Handler处理handleLaunchActivity,依次调用performLaunchActivity,handleResumeActivity(即activity的onCreate,onStart,onResume)。

深入理解Activity启动流程

Android类加载器

Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并,优化,然后生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,如果我们的Android应用不进行分dex处理,最后一个应用的apk只会有一个dex文件。

Android中常用的有两种类加载器,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader。区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以我们可以用DexClassLoader去加载外部的apk。

Android消息机制

应用启动是从ActivityThread的main开始的,先是执行了Looper.prepare(),该方法先是new了一个Looper对象,在私有的构造方法中又创建了MessageQueue作为此Looper对象的成员变量,Looper对象通过ThreadLocal绑定MainThread中;
当我们创建Handler子类对象时,在构造方法中通过ThreadLocal获取绑定的Looper对象,并获取此Looper对象的成员变量MessageQueue作为该Handler对象的成员变量;
在子线程中调用上一步创建的Handler子类对象的sendMesage(msg)方法时,在该方法中将msg的target属性设置为自己本身,同时调用成员变量MessageQueue对象的enqueueMessag()方法将msg放入MessageQueue中;
主线程创建好之后,会执行Looper.loop()方法,该方法中获取与线程绑定的Looper对象,继而获取该Looper对象的成员变量MessageQueue对象,并开启一个会阻塞(不占用资源)的死循环,只要MessageQueue中有msg,就会获取该msg,并执行msg.target.dispatchMessage(msg)方法(msg.target即上一步引用的handler对象),此方法中调用了我们第二步创建handler子类对象时覆写的handleMessage()方法,之后将该msg对象存入回收池;
Looper.loop()为什么不会阻塞主线程
Android是基于事件驱动的,即所有Activity的生命周期都是通过Handler事件驱动的。loop方法中会调用MessageQueue的next方法获取下一个message,当没有消息时,基于Linux pipe/epoll机制会阻塞在loop的queue.next()中的nativePollOnce()方法里,并不会消耗CPU。

IdleHandler (闲时机制)

IdleHandler是一个回调接口,可以通过MessageQueue的addIdleHandler添加实现类。当MessageQueue中的任务暂时处理完了(没有新任务或者下一个任务延时在之后),这个时候会回调这个接口,返回false,那么就会移除它,返回true就会在下次message处理完了的时候继续回调。

同步屏障机制(sync barrier)

同步屏障可以通过MessageQueue.postSyncBarrier函数来设置。该方法发送了一个没有target的Message到Queue中,在next方法中获取消息时,如果发现没有target的Message,则在一定的时间内跳过同步消息,优先执行异步消息。再换句话说,同步屏障为Handler消息机制增加了一种简单的优先级机制,异步消息的优先级要高于同步消息。在创建Handler时有一个async参数,传true表示此handler发送的时异步消息。ViewRootImpl.scheduleTraversals方法就使用了同步屏障,保证UI绘制优先执行。

View的绘制原理

View的绘制从ActivityThread类中Handler的处理RESUME_ACTIVITY事件开始,在执行performResumeActivity之后,创建Window以及DecorView并调用WindowManager的addView方法添加到屏幕上,addView又调用ViewRootImpl的setView方法,最终执行
参考技术A

声明这个ListvIew

/生成动态数组,加入数据

listItem = new ArrayList<HashMap<String, Object>>();

map = new HashMap<String, Object>();

for(int i=0;i<10;i++)

// 后台数据

HashMap<String, Object>   map = new HashMap<String, Object>();

map.put("ItemImage", R.drawable.checked);来下

map.put("ItemTitle", "Level ");

map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves!");

listItem.add(map);

list.setOnItemClickListener(new OnItemClickListener()

@Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) 

删除操作

listItem.remove(position);//选择行的位置

listItemAdapter.notifyDataSetChanged();

list.invalidate();

listview会删除选择的行,重新更新

);

参考技术B 声明这个ListvIew
/生成动态数组,加入数据
listItem = new ArrayList<HashMap<String, Object>>();
map = new HashMap<String, Object>();
for(int i=0;i<10;i++)

// 后台数据
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.checked);来下
map.put("ItemTitle", "Level ");
map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves!");
listItem.add(map);


list.setOnItemClickListener(new OnItemClickListener()



@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)

删除操作
listItem.remove(position);//选择行的位置
listItemAdapter.notifyDataSetChanged();
list.invalidate();
listview会删除选择的行,重新更新


);
参考技术C 通过listview的一行listItem对应一个HashMap,可一通过listitem动态的增加删除一行数据 参考技术D listview有个事件监听,比如OnItemLongClickListener这样之类的,扑捉到事件之后就能对此条记录做处理了,remove就行。本回答被提问者采纳

C# winform listview 选中的复选框排序

请问如何做到,点击按钮button1后,数据3那项排到数据1的上边并且让复选框选中,如下图

  ListView本身提供了ListViewItemSorter属性让用户实现自定义的排序。

  增加以下代码可以实现你要的功能。

 public class ListViewSorterAscending : System.Collections.IComparer
        
            public int Compare(object x, object y)
            
                //我们需要的是先对所有已选中的项目进行升序排列,然后对未选中的项目进行升序排列
                ListViewItem c1 = x as ListViewItem;
                ListViewItem c2 = y as ListViewItem;
                if (c1.Checked && c2.Checked || !c1.Checked && !c2.Checked)
                    return c1.Text.CompareTo(c2.Text);
                if (c1.Checked && !c2.Checked)
                    return -1;
                if (!c1.Checked && c2.Checked)
                    return 1;
                return 0;
            
        


  在某处生成排序器的一个实例,赋值ListView的排序比较器属性:

myListView.ListViewItemSorter = new ListViewSorterAscending();


  在Button的Click事件中写:

mylistView.Sort();


  需要反向排序请自行改动排序器。

备注:本例排序中参考值是Item的Text属性,如需使用其他的属性进行排序请自行修改。

参考技术A 你这个应该是硬编码的问题。如果实现排序的话,可以实现IComparer接口,但这并不能保证3在上面。而且ICompare你实现的排序还要去自己处理,数字的排序和字符串的排序肯定不一样的。

就你题目而言,最简单的放法就是
private List<ListViewItem> lvis = new List<ListViewItem>();
private void Form1_Load(object sender, EventArgs e)

ListViewItem lvi = new ListViewItem(new string[] "数据1", "1", "2" );
ListViewItem lvi1 = new ListViewItem(new string[] "数据2", "3", "4" );
ListViewItem lvi2 = new ListViewItem(new string[] "数据3", "5", "6" );
this.listView1.Items.Add(lvi);
this.listView1.Items.Add(lvi1);
this.listView1.Items.Add(lvi2);
lvis.Add(lvi);
lvis.Add(lvi1);
lvis.Add(lvi2);

private void button1_Click(object sender, EventArgs e)

//先listview1清空
this.listView1.Items.Clear();
//绑定勾选的
for (int i = 0; i < lvis.Count; i++)

if (lvis[i].Checked)

this.listView1.Items.Add(lvis[i]);
lvis.Remove(lvis[i]);
break;


//绑定其他的
for (int i = 0; i < lvis.Count; i++)

this.listView1.Items.Add(lvis[i]);

//listview的item继续存入lvis
lvis.Clear();
for (int i = 0; i < this.listView1.Items.Count; i++)

lvis.Add(this.listView1.Items[i]);

参考技术B

把整个项目代码发我看看

1720406057@qq.com

以上是关于android怎样选中listview中一行进行删除的主要内容,如果未能解决你的问题,请参考以下文章

C# winform listview 选中的复选框排序

winform c# listview 如何 选中行!急!在线等!

winform c# listview 如何 选中行!急!在线等!

如何在Android中的ListView中突出显示行?

Android中ListView结合CheckBox判断选中项

android 怎listview一行显示3个数据