javainlistview
Ⅰ ListView怎麼設高度在代碼中
ListView設高度在代碼方法:
1、在ListView的布局文件中把屬性android:layout_height設置成"wrap_content"
<ListView
android:cacheColorHint="#00000000"
android:textColor="#ff435346"
android:textSize = "20sp"
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout="@+id/textViewCurrentBase"
android:listSelector="#00000000"
android:drawSelectorOnTop="false"/>
2、設置子項xml文件(比如這里把一個item.xml設置成ListView的一行)的各個控制項android:layout_height的值。這里80sp+40sp就是需要的一行的高度。
item.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:focusable="false"
android:textColor="@drawable/white"
android:id="@+id/ItemTitle"
android:layout_height="80sp"
android:layout_width="fill_parent" />
<TextView android:focusable="false"
android:id="@+id/ItemText"
android:textColor="@drawable/blue"
android:layout_height="40sp"
android:layout_width="wrap_content"
android:layout_below="@+id/ItemTitle" />
<Button
android:id="@+id/ItemButton"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentRight="true" />
</RelativeLayout>
Ⅱ 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 報錯:java.lang.IllegalStateException
把 listview的adapter數據更新和dapter.notifyDataSetChanged()必須同時放到單獨一個線程里,
報錯基本是都是這個原因,有人把adapter里的數據更新了,但是 dapter.notifyDataSetChanged() 放到一個單獨線程去更新,結果出現notifyDataSetChanged更新同步的問題,
Ⅳ android用java處理二維json數組並放入listview中。
用谷歌提供的gson包,或者是阿里巴巴提供的fastjson包,方便快捷。
把javabean的裡面的變數的聲明和json關鍵詞一樣。
比如{"id":"30","title":"��������","num":"3","author":"���B��","lpostt":"2015-01-07 19:33:50"}
javabean就為
publicclassBean{
privateStringid;
privateStringtitle;
privateStringnum;
privateStringauthor;
privateStringlpostt;
...//get和set我就不寫了
}
fastjson包使用:
importcom.alibaba.fastjson.JSONObject;
...
JSONObjectobject=JSON.parseObject(String);//這是獲取一個JSONObject對象使用方法和org.json.JSONObject差不多
//Bean中的變數名必須和返回過來的JSON串裡面的參數一樣,不一樣的變數名將不會有數據。多了或者少了不會有影響。
List<Bean>beanList=JSON.parseArray(String,Bean.class);//JSON數組,解析成一個list
Beanbean=JSON.parseObject(String,Bean.class)//JSON數據,解析成一個對象
如果JSON中的元素還有JSON數據,比如{「id」:{"data","123"}}
publicclassBean{
privateDataid;
...//省略get和set
}
//下面是另一個javabean文件
publicclassData{
privateStringdata;
...//省略get和set
}
解析的辦法和上面一樣。是json數組就在javabean裡面定義list。
使用Gson包和fastjson類似,但是還是有區別
Gsongson=newGson();//需要先實例化一個Gson對象
Beanbean=gson.fromJson(String,Bean.class);//JSON數據,返回一個Bean對象
List<Bean>beanList=gson.fromJson(String,newTypeToken<List<Bean>>(){}.getType());//JSON數組,返回一個List對象
最後,當你將你的JSON數據解析成了List,難道放入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);
}
}
Ⅵ 在一個ListView中的ListItem中再建一個子ListView
前幾天因為項目的需要,要在一個ListView中放入另一個ListView,也即在一個ListView的每個ListItem中放入另外一個
ListView。但剛開始的時候,會發現放入的小ListView會顯示不完全,它的高度始終有問題。上網查了下,發現別人也有遇到這樣的問題,而大多
數人都不推薦這樣的設計,因為默認情況下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是無法計算的。
又搜索了一下,發現有StackOverflow上的牛人已經解決了這個問題,經過試驗發現是可以解決問題的,它的思路就是在設置完ListView的
Adapter後,根據ListView的子項目重新計算ListView的高度,然後把高度再作為LayoutParams設置給ListView,這
樣它的高度就正確了,以下是源碼:
Java代碼
public class Utility {
public static void (ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
只要在設置ListView的Adapter後調用此靜態方法即可讓ListView正確的顯示在其父ListView的ListItem中。但是要注意
的是,子ListView的每個Item必須是LinearLayout,不能是其他的,因為其他的Layout(如RelativeLayout)沒有
重寫onMeasure(),所以會在onMeasure()時拋出異常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一個問題就是,子ScrollView中無法滑動的(如果它沒有顯示完
全的話),因為滑動事件會被父ScrollView吃掉,如果想要讓子ScrollView也可以滑動,只能強行截取滑動事件,有牛人在論壇中發過代碼說
可以。雖然我沒有親自試過,但估計是可行的。
雖然在ScrollView中顯示ScrollView在技術上的難題可以攻破,但是這樣的設計卻是非常差的用戶體驗因為用戶會不容易看到和操作子
ScrollView中的內容。比如好的設計是,父ListView的每個Item只顯示概括性的描述,然後點擊其Item會進入另外一個頁面來詳細描述
和展示以及對這個Item的操作。
Ⅶ java listview是怎麼使用的
javax.swing.text.html.ListView ?
ListView(Element elem)
Creates a new view that represents a list element.