当前位置:首页 » 安卓系统 » androidlistview选中

androidlistview选中

发布时间: 2022-04-22 11:41:00

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

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.scheleTraversals方法就使用了同步屏障,保证UI绘制优先执行。

View的绘制原理

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

2. android listview 获取选中项的问题

checkedID.add(position); //这里添加选中项,但是再次点击选中项会再一次添加。
把上面这句的代码改成如下:
int count=checkedID.indexOf(position);

if(count == -1){
checkedID.add(podition);
}else{
checkedID.remove(count);
}
还有checkedID的定义最好是定义成全局变量
问题解决,下面的可忽略。。。

--------------------------------------------------------------------------------------------------------
一般来说像这种选中或取消问题,从执行效率来说用下面会更好一些,这也是常用的方法:
List<Boolean> checkedID = new ArrayList<Boolean>();
for(int i=0 ;i<getData();i++){
checkedID.add(false);
}
然后在你的监听中实现
checkedID.set(position, !checkedID.get(position));
当你需要调用选中的选项是,只要判断出checkedID中true的选项就可以了!
--------------------------------------------------------------------------------------------------
当然以上是模板,实际应用中更多的是把你定义的
List<Boolean> checkedID = new ArrayList<Boolean>();
for(int i=0 ;i<getData();i++){
checkedID.add(false);
}
这部分放在你的geData中::
比如你的getData返回的是List<Object>;你可以在List add的时候把其处理成返回
List<HashMap<Object,Boolean>>这样的Map列表!!!
在你需要拿出选中的object 直接判断boolean拿出你的Oject就好!

------------------------------------------------------------------------------------------------
最后希望能够帮到你,也希望你能写出更有效率的代码!

3. android listview第一行默认选中

是的,listview默认选中的是第一行,如果你想默认选择其他行,可以使用:
listview.setselection(你的行数-1);

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

声明这个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会删除选择的行,重新更新

}

});

5. android Listview第一个行默认为选中状态,怎么实现按下某一行在没松开时设置其为选中行,选中行为蓝色

1. 你从 A跳转到B的时候 通过 INTENT 传一个值 intent.putStringExtart("selection", 4);
2. 然后在B接受这个值: int selection = getExtart().getIntExtart("selection");
3. 然后设置ListView 选择这个 selection: myListView.setselection(selection);

就OK了

----------- 补充:
刚看太快看错了, 如果是想选中ListView 某一个 TEXTVIEW, 需要这样:

ViewGroupitem=(ViewGroup)mAdapter.getChild(selection);
TextViewtextView=item.findviewById(R.id.textView1);
textview.requestFocus();

前提是要设置这个 textview 的 focusable=true, 还有 focusableInTouchmode = true

6. android 控件listview 如何获取选中行的数据

onItemClickListener事件获取点击返回的itemID,根据这个ID在数据源list中获取对应数据。

7. android listview初始化设定选中项

本身是想做一个类似用户配置的界面,在listview里面有checkbox 当用户选中这个checkbox的时候 自动保存,第二次打开的时候也是保存的状态。
最主要的是自定义的 MyAdatper的代码
[java] view plain
class MyAdatper extends BaseAdapter{
public HashMap<Integer, Boolean> selectedMap;
String gamesStr = getContentByType("games");
String alamString = getConfigByGames(gamesStr,"alarms");

/*
public MyAdatper(){
init();
}
private void init(){
selectedMap = new HashMap<Integer, Boolean>();
JSONArray alamsJsonArray;
try {
alamsJsonArray = new JSONArray(alamString);
for(int i=0; i<alamsJsonArray.length(); i++){
JSONObject alarmsobj=(JSONObject) alamsJsonArray.get(i);
String alarmId = alarmsobj.getString("id");
boolean isSelected = getUserIsChecked(alarmId);
selectedMap.put(Integer.parseInt(alarmId), isSelected);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
@Override
public int getCount() {
try {
JSONArray jsonCount = new JSONArray(alamString);
return jsonCount.length();
} catch (JSONException e) {
e.printStackTrace();
}
return 10;
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
private class RecentViewHolder {
TextView alarmTitle; //提醒名称
TextView alarmTime; //活动时间
CheckBox isOpenAlarm; //是否打开提醒
}
@Override
public View getView(int position, View contentView, ViewGroup arg2) {
// TODO Auto-generated method stub
RecentViewHolder holder;
if(contentView==null)
{
holder = new RecentViewHolder();
contentView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.alarm_item, null);
holder.alarmTitle = (TextView) contentView.findViewById(R.id.alarmTitle);
holder.alarmTime = (TextView) contentView.findViewById(R.id.alarmTime);
holder.isOpenAlarm = (CheckBox) contentView.findViewById(R.id.isOpenAlarm);
contentView.setTag(holder);
}else{
holder = (RecentViewHolder) contentView.getTag();
}
JSONArray alamsJsonArray;
try {
alamsJsonArray = new JSONArray(alamString);
JSONObject alarmsobj=(JSONObject) alamsJsonArray.get(position);
String title = alarmsobj.getString("title");
String target_time = alarmsobj.getString("target_time");
String clock = alarmsobj.getString("clock");
holder.alarmTitle.setText(title);
holder.alarmTime.setText(target_time);

final String alarmId = alarmsobj.getString("id");
boolean isChecked = getUserIsChecked(alarmsobj.getString("id"));
holder.isOpenAlarm.setOnCheckedChangeListener(null);
holder.isOpenAlarm.setChecked(isChecked);
buttonOnclick(holder.isOpenAlarm,alarmId);
/*
//判断用户的这个是否设置
//boolean isChecked = getUserIsChecked(alarmsobj.getString("id"));
//Log.e("is_selected",isChecked+"");
//holder.isOpenAlarm.setSelected(isChecked);
//holder.isOpenAlarm.setVisibility(View.VISIBLE);
//boolean checked = selectedMap.get(Integer.parseInt(alarmId));
//holder.isOpenAlarm.setChecked(checked);
//final CheckBox checkbox = holder.isOpenAlarm;
contentView.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//checkbox.toggle();
//selectedMap.put(Integer.parseInt(alarmId), checkbox.isChecked());

//holder.isOpenAlarm.setSelected(checkbox.isChecked());
}
});*/
//holder.isOpenAlarm.setId(Integer.parseInt(alarmId));

//buttonOnclick(holder.isOpenAlarm,alarmId);

} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return contentView;
}
private void buttonOnclick(CheckBox checkbox,final String alarmId){
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 判断是否选中 更新用户的配置
if(isChecked){
updateConfigInfo(alarmId,1);
}else{
updateConfigInfo(alarmId,0);
}
}
});
}
}

8. android中如何清除listview的选中状态

你可以使用变量存储点击item的位置id,然后刷新ListView列表时将该id传入Adapter中,在getView中判断传入id来画item,注意要去掉getView中的判断,每次都要重新构建item。当前id与保存id相等时可以将item背景变回原来的背景。。。

9. android中选择listview时怎么改变选中条目颜色

ListView.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> adapterView, View item, int position, long time) { item.setBackgroundColor(Color.WHITE);//设置你想要的高亮颜色,在取消的时候再设置一下颜色就可以}

10. android listView 改变选中行的 背景颜色,字体颜色,和 图片

这种情况还是用selector吧,把你setTextColor的方法删掉


修改你的tuijian_building_listview_row的xml文件,最外层background属性这么设置

android:background="@color/list_item_bg_selector"

tvTJCustomName和tvTJCustomPhone的textColor属性这么设置

android:textColor="@color/text_color_selector"

在res目录下,新建color子文件夹,在里面创建list_item_bg_selector
.xml文件和text_color_selector.xml文件,除了颜色值,其他内容一样(颜色值我随便写的,你根据需要的效果自己改)

<?xmlversion="1.0"encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">

<!--被选中时的颜色-->
<itemandroid:state_selected="true"android:color="#333333"/>
<!--获得焦点时的颜色-->
<itemandroid:state_focused="true"android:color="#333333"/>
<!--点击时的颜色-->
<itemandroid:state_pressed="true"android:color="#333333"/>
<!--默认颜色-->
<itemandroid:color="#66666"/>
</selector>


如果要修改背景图片也大同小异,关于selector的详细说明请自行网络

热点内容
移动光猫如何自行修改密码 发布:2025-05-16 08:20:15 浏览:124
作为基线存储 发布:2025-05-16 08:15:22 浏览:858
安卓怎么关闭手机应用推荐 发布:2025-05-16 08:03:38 浏览:929
sql内置函数 发布:2025-05-16 08:03:34 浏览:922
怎么看服务器内存型号 发布:2025-05-16 08:03:30 浏览:812
哪里修安卓手机最好 发布:2025-05-16 07:58:25 浏览:825
服务器和电脑是什么区别 发布:2025-05-16 07:58:24 浏览:720
安卓116是什么意思 发布:2025-05-16 07:44:59 浏览:591
配置低而动力好的车怎么选 发布:2025-05-16 07:44:15 浏览:900
如何退出登录的服务器界面 发布:2025-05-16 07:41:58 浏览:71