編輯:Android開發實例
首先看效果圖:
這個是多選模式的
首先看Layout配置文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/addButton"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="增加一個"
- />
- <!-- android:scrollbarFadeDuration 一直顯示滾動條 android:fastScrollEnabled 顯示拖動塊-->
- <ListView
- android:id="@id/android:list"
- android:layout_width="fill_parent"
- android:divider="#ee31ff5e"
- android:dividerHeight="1dp"
- android:choiceMode="multipleChoice"
- android:layout_height="fill_parent"
- android:fastScrollEnabled="true"
- android:focusable="true"
- android:scrollbarFadeDuration="0"/>
- </LinearLayout>
其中的android:choiceMode="multipleChoice"選項就是設置選擇模式的,
他包括幾個選擇 CHOICE_MODE_MULTIPLE(多選), CHOICE_MODE_NONE(默認), CHOICE_MODE_SINGLE(單選)
這裡還設置了divider
下面看代碼
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import android.app.ListActivity;
- import android.content.Context;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.View.OnTouchListener;
- import android.widget.AdapterView;
- import android.widget.ArrayAdapter;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.widget.AdapterView.OnItemClickListener;
- public class ListViewDemo2 extends ListActivity{
- private Cursor cursor;
- private Button button;
- private TextView textViewFooter;
- private TextView textViewHeader;
- private ArrayAdapter<String> adapter ;
- private int counter = 10;
- private List<String> list = new ArrayList<String>();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- list.add("aa");
- list.add("bb");
- list.add("cc");
- list.add("dd");
- list.add("ee");
- list.add("ff");
- list.add("gg");
- list.add("hh");
- list.add("ii");
- list.add("jj");
- list.add("kk");
- list.add("ll");
- list.add("mm");
- list.add("nn");
- super.onCreate(savedInstanceState);
- setContentView(R.layout.listviewdemo2);
- final ListView listView= (ListView) findViewById(android.R.id.list);
- textViewHeader = new TextView(this);
- textViewHeader.setGravity(Gravity.CENTER);
- textViewHeader.setTextSize(17);
- textViewFooter = new TextView(this);
- textViewFooter.setGravity(Gravity.CENTER);
- textViewFooter.setText("點擊查看更多");
- textViewFooter.setTextSize(18);
- textViewHeader.setText("全部信息("+list.size()+")");
- listView.addHeaderView(textViewHeader);
- listView.addFooterView(textViewFooter);
- adapter = new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);
- listView.setOnItemClickListener(new OnItemClickListener(){
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- String strtemp = "";
- for(long ids :listView.getCheckItemIds()){
- strtemp += ids+":";
- }
- Toast.makeText(ListViewDemo2.this, ""+strtemp, Toast.LENGTH_LONG).show();
- }});
- setListAdapter(adapter);
- listView.setOnTouchListener(new OnTouchListener(){
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- //獲得當前點擊位置的item序號
- int itemnum = listView.pointToPosition((int)event.getX(), (int)event.getY());
- //獲得當前點擊位置的RowId,為-1的除外
- long temp = listView.pointToRowId((int)event.getX(), (int)event.getY());
- Toast.makeText(ListViewDemo2.this, ""+itemnum+":"+temp, Toast.LENGTH_LONG).show();
- break;
- default:
- break;
- }
- return false;
- }});
- button = (Button) findViewById(R.id.addButton);
- button.setOnClickListener(new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- Random random = new Random();
- int position = random.nextInt(list.size());
- list.add(position, ""+counter++);
- adapter.notifyDataSetInvalidated();
- textViewHeader.setText("全部信息("+list.size()+")");
- }
- });
- }
- }
通過android已定義的ArrayAdapter來顯示數據,效果如圖,
裡面添加了三個事件:
1、OnTouchListener 這裡通過觸摸點來定位這個list的position信息,包括兩個方法 pointToPosition和pointToRowId,注意這兩個方法的不同點,就是在狀態為-1的數據是否計算的區別
2、OnItemClickListener 這裡獲得當前選擇的條目 通過方法getCheckItemIds來獲得
3、Button的點擊,這裡動態增加一條數據項,可以發現通過 getCheckItemIds來標記的選擇項是通過位置來記錄的,跟選擇選項的內容無關,所以這裡如果數據是動態的就要 需要注意
還有一個問題,剛開始我
new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);
這裡構造方法傳入的是一個數組, 這樣就發現了一個問題:
在我點擊button當然是數組數據增加一條,但是發現list中的數據沒有變化,
這個是為什麼呢,難道是傳入的集合跟 ArrayAdapter中的集合不是同一個引用,那又發現了 ArrayAdapter中有add和insert方法,但用了之後發現有 java.lang.UnsupportedOperationException這個異常,android居然還沒實現,真是奇怪啊,
後來詳細看了下 ArrayAdapter這個類的構造方法,原來傳入list跟數據操作不同,如果是list直接用該引用,如果傳入數組,就會通過Arrays.asList()來創造一個新List 這個區別就太大了, 後來只能把數組改成List 真是郁悶啊
這裡使用的是 ArrayAdapter ,那很多時候我們需要自定義Adater的,可能會處於數據處理,效率優化的考慮,
如果自定義Adapter如下
- class MyAdapter extends BaseAdapter{
- @Override
- public int getCount() {
- return list.size() ;
- }
- @Override
- public Object getItem(int position) {
- return list.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView tv = new TextView(ListViewDemo2.this);
- tv.setText(list.get(position));
- tv.setHeight(30);
- tv.setGravity(Gravity.CENTER);
- return tv;
- }
- }
這樣定義顯示的時候就會發現多選按鈕框不見了,看 ArrayAdapter的實現就會發現,他所用的 android.R.layout.simple_list_item_multiple_choice布局用的是CheckedTextView組件
- <?xml version="1.0" encoding="UTF-8"?>
- <CheckedTextView android:textAppearance="?textAppearanceLarge" android:gravity="center_vertical" android:id="@id/text1" android:paddingLeft="6.0dip" android:paddingRight="6.0dip" android:layout_width="fill_parent" android:layout_height="?listPreferredItemHeight" android:checkMark="?listChoiceIndicatorMultiple"
- xmlns:android="http://schemas.android.com/apk/res/android" />
所以這裡如果用TextVew就不會顯示選擇提示框,其實這個組件就是TextView的子類
這裡我們要用這個組件
- class MyAdapter extends BaseAdapter{
- @Override
- public int getCount() {
- return list.size() ;
- }
- @Override
- public Object getItem(int position) {
- return list.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LayoutInflater inflater = (LayoutInflater)getApplication().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View view = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
- TextView tv = (TextView)view;
- tv.setText(list.get(position));
- tv.setHeight(30);
- tv.setGravity(Gravity.CENTER);
- return tv;
- }
- }
這樣就正確顯示了
學習目的: 1、掌握在Android中如何建立EditText2、掌握EditText的常用屬性3、掌握EditText焦點的事件、按鍵的事件(監聽器) 介紹:
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
這篇文章只是總結下getView裡面優化視圖的幾種寫法,就像孔乙己寫茴香豆的茴字的幾種寫法一樣,高手勿噴,勿笑,只是拿出來分享,有錯誤的地方歡迎大家指正,謝謝。
什麼是AppWidget?AppWidget就是我們平常在桌面上見到的那種一個個的小窗口,利用這個小窗口可以給用戶提供一些方便快捷的操作。本篇打算從以下幾個點來介