當前位置:首頁 » 安卓系統 » 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 00:11:49 瀏覽:10
安卓游戲舊版本從哪個軟體下載 發布:2025-05-16 00:00:20 瀏覽:329
連接聚類演算法 發布:2025-05-15 23:55:09 瀏覽:978
工資演算法單休 發布:2025-05-15 23:52:30 瀏覽:819
超凡先鋒配置不行怎麼辦 發布:2025-05-15 23:27:54 瀏覽:532
win7取消加密 發布:2025-05-15 23:26:37 瀏覽:472
不用internet打開ftp 發布:2025-05-15 23:06:00 瀏覽:154
sql字元串取數字 發布:2025-05-15 22:57:45 瀏覽:125
推薦編程課 發布:2025-05-15 22:34:12 瀏覽:618
表拒絕訪問 發布:2025-05-15 22:29:37 瀏覽:978