當前位置:首頁 » 安卓系統 » androidlistitem

androidlistitem

發布時間: 2022-06-26 02:32:36

⑴ 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會刪除選擇的行,重新更新

}

});

⑵ android 中listview 的用法

1.在xml裡面定義一個ListView,這個xml是一個activity的layout文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView android:layout_width="wrap_content" //定義一個listView
android:layout_height="wrap_content"
android:id="@+id/ListView01"
/>
</LinearLayout>

2.定義ListView每個條目的Layout,比如命名為listview_item.xml,用RelativeLayout實現:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:paddingBottom="4dip"
android:paddingLeft="12dip"
android:paddingRight="12dip">
<ImageView
android:paddingTop="12dip"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ItemImage"
/>
<TextView
android:text="TextView01"
android:layout_height="wrap_content"
android:textSize="20dip"
android:layout_width="fill_parent"
android:id="@+id/ItemTitle"
/>
<TextView
android:text="TextView02"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_below="@+id/ItemTitle"
android:id="@+id/ItemText"
/>
</RelativeLayout>

3.在Activity裡面調用和加入Listener,具體見注釋:
package com.ray.test;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class TestListView extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//綁定Layout裡面的ListView
ListView list = (ListView) findViewById(R.id.ListView01);

//生成動態數組,加入數據
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.checked);//圖像資源的ID
map.put("ItemTitle", "Level "+i);
map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves! ");
listItem.add(map);
}
//生成適配器的Item和動態數組對應的元素,這里用SimpleAdapter作為ListView的數據源
//如果條目布局比較復雜,可以繼承BaseAdapter來定義自己的數據源。
SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//數據源
R.layout.list_items,//ListItem的XML實現
//動態數組與ImageItem對應的子項
new String[] {"ItemImage","ItemTitle", "ItemText"},
//ImageItem的XML文件裡面的一個ImageView,兩個TextView ID
new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
);

//添加並且顯示
list.setAdapter(listItemAdapter);

//添加點擊
list.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
setTitle("點擊第"+arg2+"個項目");
}
});

//添加長按點擊
list.(new OnCreateContextMenuListener() {

@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
menu.setHeaderTitle("長按菜單-ContextMenu");
menu.add(0, 0, 0, "彈出長按菜單0");
menu.add(0, 1, 0, "彈出長按菜單1");
}
});
}

//長按菜單響應函數
@Override
public boolean onContextItemSelected(MenuItem item) {
setTitle("點擊了長按菜單裡面的第"+item.getItemId()+"個項目");
return super.onContextItemSelected(item);
}
}

⑶ android listview中listitem問題

這涉及到了listView的嵌套,裡面的listView需要重寫,將讓他沒有滾動條,listView才能正常顯示

⑷ android中怎麼讓listview的內容全部顯示出來

注意,如果listitem裡面有textview的話,就當一行處理進行截取數字。
public static void (ListView listView) {
// 獲取ListView對應的Adapter WeiboContentAdapter listAdapter = (WeiboContentAdapter) listView.getAdapter(); if (listAdapter == null) { return; } Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextAlign(Align.LEFT); LinearLayout listItem; TextView tvContent; int totalHeight = 0; int lineCount = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回數據項的數目 listItem = (LinearLayout)listAdapter.getView(i, null, listView); tvContent = (TextView) listItem.findViewById(R.id.tv_weibo_detail_content); lineCount = getLineCount(mPaint, ((SpannedString) tvContent.getText()).toString()); tvContent.measure(0, 0); // 計運算元項View 的寬高 totalHeight += tvContent.getMeasuredHeight()*lineCount + 60; // 統計所有子項的總高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)) ; // listView.getDividerHeight()獲取子項間分隔符佔用的高度 // params.height最後得到整個ListView完整顯示需要的高度 listView.setLayoutParams(params); }
private static int getLineCount(Paint mPaint, String content) { int index; int count = 0; while(content.length() > 0){ index = mPaint.breakText(content, true, ResolutionUtil.getWPx()/2, null); content = content.substring(index); count++; } return count; }
/** * 動態改變listView的高度 * @param pull */ private void setPullLvHeight(ListView pull){ int totalHeight = 0; for (int i = 0, len = adapter.getCount(); i < len; i++) { //listAdapter.getCount()返回數據項的數目 View listItem = adapter.getView(i, null, pull); listItem.measure(0, 0); //計運算元項View 的寬高 totalHeight += listItem.getMeasuredHeight(); //統計所有子項的總高度 } ViewGroup.LayoutParams params = pull.getLayoutParams(); params.height = totalHeight + (pull.getDividerHeight() * (pull.getCount() - 1)); pull.setLayoutParams(params); }

⑸ Android入門 在ListView中如何進行精確的位置設定

在android的開發中,經常會遇到需要主動去設定某條ListItem的位置的需求。設置位置的函數有
ListView.setSelection(int position)
ListView.setSelectionFromTop(int position, int y);
其中
position指的是指定的item的在ListView中的索引,注意如果有Header存在的情況下,索引是從Header就開始算的。
y指的是到ListView可見范圍內最上邊邊緣的距離。
函數有了,現在就是根據自身需求來進行設置。

這次遇到的需求,ListView要求是從下往上展示的,並且當Cursor更新時,要保持住原先的最上方的item(不包括header)的位置不變,然後新的歷史數據在原先那條item上方繼續向上展示。如圖:

ListView從下往上展示,也就是
android:stackFromBottom="true"
但是發現這一屬性的設置不會影響索引的排序順序,也就是item的索引都是從上往下遞增的,不會變成從下往上遞增。索引為0的item,都是在ListView的最上方的item(或header).

那麼當Cursor更新時,原先第一條的索引便會發生變化。要想保持住它(圖中的 R)的位置。步驟如下:
(1)獲取這一條在新Cursor中的位置(posiition)
(2)獲取這一條在更換Cursor後ListView中的位置。
(4)由於ListView的可滾動的屬性,我們需要記錄更換Cursor前可視的第一條item的索引(ListView.getFirstVisiblePosition())

(3)區分FirstVisiblePosition是0和大於0的情況。由於header,也就是圖中的Loading那一條在新數據出來後是會消失的。

(4)當FirstVisiblePosition為0時實際指向的是header,我們要保持位置不變的是header下面第一條(R)的位置。那麼此時要設置FirstVisiblePosition為1
(5)當FirstVisiblePosition大於0時實際指向的就是item,但是我們需要設置FirstVisiblePosition為0。*
(6)我們根據FirstVisiblePosition用ListView.getChildAt(int position)函數獲取對應的item的View,再根據View.getTop()函數獲取到ListView頂部的距離Y。
這樣ListView.setSelectionFromTop(int position, int y)所需的兩個參數 position 和 y就都有了。
*註解:ListView.getChildAt(int position), 這個position指的是在可視的item中的索引,跟cursor里的位置是大不一樣的。可以看看ListView.getChildCount()函數得到個數是小於或等於Cursor里的個數的(不考慮header的話)。雖然一共可能有20條數據,但是界面只能看到8條,那麼這個ChildCount大約就是8了。另一方面, FirstVisiblePosition取出的是在總的條數中的索引,再將會消失的header考慮進來,所以就是 FirstVisiblePosition為0時要設為1,大於0時又要設為0。
下面上代碼:
調用的代碼:

int headerCount = mListContainer.getListView().getHeaderViewsCount();
int firstVisiblePos = mListContainer.getListView().getFirstVisiblePosition();
int newCursorPosition = getPositionInNewCursor(cursor.getCount(), firstVisiblePos);
int offsetY = getOffsetY(cursor, firstVisiblePos, newCursorPosition);

mAdapter.changeCursor(cursor);

mUpRefreshLayout.setVisibility(View.GONE);

mListContainer.getListView().setSelectionFromTop(newCursorPosition + headerCount, offsetY);
getPositionInNewCursor函數:

private int getPositionInNewCursor(int newCursorCount, int firstVisiblePos){
if(firstVisiblePos == 0){
firstVisiblePos += 1;
}

int headerCount = mListContainer.getListView().getHeaderViewsCount();
int newCursorPos = newCursorCount - mAdapter.getCount() + firstVisiblePos - headerCount;

return newCursorPos;
}
getOffsetY函數:

private int getOffsetY(Cursor cursor, int firstVisiblePos, int newCursorPosition){
int y;

View firstVisibleItem = null;
if(firstVisiblePos == 0){
firstVisibleItem = mListContainer.getListView().getChildAt(1);
}else{
firstVisibleItem = mListContainer.getListView().getChildAt(0);
}
y = firstVisibleItem.getTop();

View timeView = firstVisibleItem.findViewById(R.id.time_text_view);
if(timeView != null && timeView.getVisibility() == View.VISIBLE){

Cursor curItem = (Cursor)mAdapter.getItem(newCursorPosition);
Cursor preItem = (Cursor)mAdapter.getItem(newCursorPosition - 1);
if(curItem != null || preItem != null){
long curTimeStamp = curItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);
long preTimeStamp = preItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);

if(Math.abs(curTimeStamp - preTimeStamp) <= SHOW_TIME_STAMP_TEN_MINS){
LayoutParams param = (LinearLayout.LayoutParams)mTimeView.getLayoutParams();
y += mTimeView.getHeight() + param.topMargin + param.bottomMargin;
}
}
}

return y;
}

getOffsetY中有一段計算圖中TimeStamp的高度的代碼,不關心的可以自己跳過一下。因為查詢出歷史數據後可能會造成原先有TimeStamp的那一條在刷新後不再顯示TimeStamp(與上一條合並到一個時間段了),所以要把它的高度也計算進去。

⑹ 如何清空android ListView控制項的內容

【清空android ListView控制項的內容方法】:

1,當我們要載入item的時候,首先把list清空

list.clear();

適配器

adapter1=newArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,list);

listView.setAdapter(adapter1);

這樣載入以後就把Listview中的數據清空了。

2、然後再載入我們想要的數據

list.add("a");

list.add("c");

list.add("b");

list.add("a");

list.add("c");

list.add("b");

適配器

adapter1=newArrayAdapter<String>

(getApplicationContext(),android.R.layout.simple_list_item_1,list);

listView.setAdapter(adapter1);


adapter1=newArrayAdapter<String>

(getApplicationContext(),android.R.layout.simple_list_item_1,list);


listView.setAdapter(adapter1);

⑺ android listview怎麼用

Android listview與adapter用法
listview與adapter用法

一個ListView通常有兩個職責。
(1)將數據填充到布局。
(2)處理用戶的選擇點擊等操作。
第一點很好理解,ListView就是實現這個功能的。第二點也不難做到,在後面的學習中讀者會發現,這非常簡單。
一個ListView的創建需要3個元素。
(1)ListView中的每一列的View。
(2)填入View的數據或者圖片等。
(3)連接數據與ListView的適配器。
也就是說,要使用ListView,首先要了解什麼是適配器。適配器是一個連接數據和AdapterView(ListView就是一個典型的AdapterView,後面還會學習其他的)的橋梁,通過它能有效地實現數據與AdapterView的分離設置,使AdapterView與數據的綁定更加簡便,修改更加方便
Android中提供了很多的Adapter,表4-5列出了常用的幾個。
表4-5 常用適配器

Adapter

含義

ArrayAdapter<T>

用來綁定一個數組,支持泛型操作

SimpleAdapter

用來綁定在xml中定義的控制項對應的數據

SimpleCursorAdapter

用來綁定游標得到的數據

BaseAdapter

通用的基礎適配器

其實適配器還有很多,要注意的是,各種Adapter只不過是轉換的方式和能力不一樣而已。下面就通過使用不同的Adapter來為ListView綁定數據(SimpleCursorAdapter暫且不講,後面講SQLite時會介紹)。
4.12.1 ListView使用ArrayAdapter
用ArrayAdapter可以實現簡單的ListView的數據綁定。默認情況下,ArrayAdapter綁定每個對象的toString值到layout中預先定義的TextView控制項上。ArrayAdapter的使用非常簡單。
實例:
工程目錄:EX_04_12
在布局文件中加入一個ListView控制項。

<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="
http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent"> <!-- 添加一個ListView控制項 --> <ListView
android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>

然後在Activity中初始化。

publicclass MyListView extends Activity {

privatestaticfinal String[] strs = new String[] {
"first", "second", "third", "fourth", "fifth"
};//定義一個String數組用來顯示ListView的內容private ListView lv;/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);

lv = (ListView) findViewById(R.id.lv);//得到ListView對象的引用 /*為ListView設置Adapter來綁定數據*/
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, strs));

}
}

▲圖4-29 ListView使用ArrayAdapter運行效果
代碼非常的簡單,運行效果如圖4-29所示。

分析一下使用的步驟。
(1)定義一個數組來存放ListView中item的內容。
(2)通過實現ArrayAdapter的構造函數來創建一個ArrayAdapter的對象。
(3)通過ListView的setAdapter()方法綁定ArrayAdapter。
其中第二步有必要說一下的是,ArrayAdapter有多個構造函數,例子中實現的是最常用的一種。第一個參數為上下文,第二個參數為一個包含TextView,用來填充ListView的每一行的布局資源ID。第三個參數為ListView的內容。其中第二個參數可以自定義一個layout,但是這個layout必須要有TextView控制項。通常我們使用Android提供的資源,除了例子中所用的,常用的還有如下幾種,可實現帶RadioButton和CheckBox的ListView。
(1)通過指定android.R.layout.simple_list_item_checked這個資源,實現帶選擇框的ListView。需要用setChoiceMode()方法設定選擇為多選還是單選,否則將不能實現選擇效果,運行效果如圖4-30所示。
實現代碼如下:
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, strs));
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

(2)通過指定android.R.layout.simple_list_item_multiple_choice這個資源實現帶CheckBox的ListView。同樣的,需要用setChoiceMode()方法來設置單選或者多選,運行效果如圖4-31所示。
實現代碼如下:
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, strs));
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

(3)通過指定android.R.layout.simple_list_item_single_choice這個資源實現帶RadioButton的ListView。這里要注意的是,這里並不是指定了單選。是多選還是單選要通過setChoiceMode()方法來指定,運行效果如圖4-32所示。
實現代碼如下:

lv.setAdapter(newArrayAdapter<String>(this,

android.R.layout.simple_list_item_single_choice,strs));

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

在前面講到過,ListView的職責除了填充數據外,還要處理用戶的操作。通過如下的代碼就可以為ListView綁定一個點擊監聽器,點擊後在標題欄顯示點擊的行數。

lv.setOnItemClickListener(new OnItemClickListener() {

@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//點擊後在標題上顯示點擊了第幾行 setTitle("你點擊了第"+arg2+"行");
}
});

4.12.2 ListView使用SimpleAdapter
很多時候需要在列表中展示一些除了文字以外的東西,比如圖片等。這時候可以使用SimpleAdapter。SimpleAdapter的使用也非常簡單,同時它的功能也非常強大。可以通過它自定義ListView中的item的內容,比如圖片、多選框等。看一個例子,實現一個每一行都有一個ImageView和TextView的ListView。先看一下運行效果,如圖4-34所示。

▲圖4-34 帶圖標的ListView

首先在布局文件中增加一個ListView控制項。
還需要定義一個ListView中每一行的布局,用RelativeLayout來實現一個帶兩行字和一個圖片的布局。
item.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent" android:layout_width="fill_parent">
<ImageViewandroid:layout_alignParentRight="true" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/ItemImage"/>
<TextViewandroid:id="@+id/ItemTitle" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:textSize="20sp"/>
<TextViewandroid:id="@+id/ItemText" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_below="@+id/ItemTitle"/> </RelativeLayout>

配置完畢,就可以在Java代碼中為ListView綁定數據。

publicclass MyListViewSimple extends Activity {

private ListView lv;
/** Called when the activity is first created. */ @Override
publicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);

lv = (ListView) findViewById(R.id.lv);/*定義一個動態數組*/
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();/*在數組中存放數據*/
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.icon);//加入圖片 map.put("ItemTitle", "第"+i+"行");
map.put("ItemText", "這是第"+i+"行");
listItem.add(map);
}

SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,//需要綁定的數據
R.layout.item,//每一行的布局//動態數組中的數據源的鍵對應到定義布局的View中new String[] {"ItemImage"
,"ItemTitle", "ItemText"},
newint[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
);

lv.setAdapter(mSimpleAdapter);//為ListView綁定適配器 lv.setOnItemClickListener(new
OnItemClickListener() {

@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
setTitle("你點擊了第"+arg2+"行");//設置標題欄顯示點擊的行
}
});
}
}

使用simpleAdapter的數據一般都是用HashMap構成的列表,列表的每一節對應ListView的每一行。通過SimpleAdapter的構造函數,將HashMap的每個鍵的數據映射到布局文件中對應控制項上。這個布局文件一般根據自己的需要來自己定義。梳理一下使用SimpleAdapter的步驟。
(1)根據需要定義ListView每行所實現的布局。
(2)定義一個HashMap構成的列表,將數據以鍵值對的方式存放在裡面。
(3)構造SimpleAdapter對象。
(4)將LsitView綁定到SimpleAdapter上。
4.12.3 ListView使用BaseAdapter與ListView的優化
在ListView的使用中,有時候還需要在裡面加入按鈕等控制項,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是裡面的控制項要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。

使用simpleAdapter的數據一般都是用HashMap構成的列表,列表的每一節對應ListView的每一行。通過SimpleAdapter的構造函數,將HashMap的每個鍵的數據映射到布局文件中對應控制項上。這個布局文件一般根據自己的需要來自己定義。梳理一下使用SimpleAdapter的步驟。
(1)根據需要定義ListView每行所實現的布局。
(2)定義一個HashMap構成的列表,將數據以鍵值對的方式存放在裡面。
(3)構造SimpleAdapter對象。
(4)將LsitView綁定到SimpleAdapter上。
4.12.3 ListView使用BaseAdapter與ListView的優化
在ListView的使用中,有時候還需要在裡面加入按鈕等控制項,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是裡面的控制項要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。

⑻ android 點擊listitem時將點擊的數據傳到另一個activity的輸入框中

activity1 list設置lonitemonclick事件,事件里intent傳輸數據並打開activity2;
activity2獲取數據,edittext.setText("獲取的數據");
lv_main.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.putExtra("url", "數據");
intent.setClass(OrderListActivity.this, ProctDetailActivity.class);
startActivity(intent);
}
}
});
String url=(String ) getIntent().getSerializableExtra("url");//獲取數據

⑼ 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方法,最終執行

⑽ 請問前輩們,在Android裡面如何獲取listview里listitem的text view的值

通過adapter啊,裡面有個getView方法,可以取得組件,然後通過textView.getText().toString()取得值。其實在listView的onItemClickListener()裡面的參數View也可以

熱點內容
蜜蜂編程官網 發布:2025-05-14 19:59:28 瀏覽:56
優酷怎麼給視頻加密 發布:2025-05-14 19:31:34 瀏覽:633
夢三國2副本腳本 發布:2025-05-14 19:29:58 瀏覽:860
phpxmlhttp 發布:2025-05-14 19:29:58 瀏覽:433
Pua腳本 發布:2025-05-14 19:24:56 瀏覽:448
蘋果像素低為什麼比安卓好 發布:2025-05-14 19:13:23 瀏覽:460
安卓機微信怎麼設置紅包提醒 發布:2025-05-14 19:00:15 瀏覽:271
androidsystem許可權設置 發布:2025-05-14 18:56:02 瀏覽:970
mq腳本 發布:2025-05-14 18:45:37 瀏覽:25
仙境傳說ro解壓失敗 發布:2025-05-14 18:45:01 瀏覽:868