国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)——控件_ListView

2019-11-09 17:34:35
字體:
供稿:網(wǎng)友

初見ListView深入ListView 定義適配器的適配類Msg創(chuàng)建子項的布局msg_item 創(chuàng)建適配器類MsgAdapter 主活動的布局activity_main編寫主活動MainActivity類

當(dāng)要顯式的數(shù)據(jù)很多時,屏幕無法完全裝下,這時就要用到控件ListView。只需在屏幕上滑動,未在屏幕顯示的數(shù)據(jù)將滾動到屏幕內(nèi)。

初見ListView

創(chuàng)建項目,項目名稱為ListView_simple。

首先,在布局文件中添加控件ListView<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/simple_list_view" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>然后,修改主活動MainActivity類 我們需要向上面的ListView提供要顯示的數(shù)據(jù)。首先準(zhǔn)備好這樣一組數(shù)據(jù),比如下面示例中的字符串?dāng)?shù)組data。然后通過adapter向ListView傳遞數(shù)據(jù)。package com.example.victoria.listview_simple;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends AppCompatActivity { PRivate ListView simpleListView; private String[] data = {"apple", "banana", "orange", "watermalon", "lemon", "mango", "cherry", "pear", "peach", "apple", "grape"};//希望顯示在屏幕上的一組數(shù)據(jù) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);//創(chuàng)建適配器:第二個參數(shù)表示子項布局的id,這里傳入的android.R.layout.simple_list_item_1是內(nèi)置布局 simpleListView = (ListView) findViewById(R.id.simple_list_view); simpleListView.setAdapter(adapter);//通過adapter向ListView傳遞數(shù)據(jù) }}

深入ListView

這里使用《第一行代碼》第三章的聊天例子。消息是一條條顯示在屏幕上的,而且屏幕一般無法顯示所有的聊天記錄,這里就可以用到ListView。

首先,創(chuàng)建nine patch圖片作為消息的背景 參考繪制nine patch圖片 得到圖片message_left.9.png和message_right.9.png。

定義適配器的適配類Msg

類Msg相當(dāng)于初見ListView中的String類型,存儲的是想要展示的子項的內(nèi)容。

package com.example.victoria.myapplication;public class Msg{ //消息的實體類 public static final int TYPE_RECEIVED = 0; //屬于類的不可變變量 public static final int TYPE_SEND = 1; private String content; //消息內(nèi)容 private int type; //消息類型,可以是TYPE_RECEIVED或者TYPE_SEND public Msg(String content, int type){ this.content = content; this.type = type; } public String getContent(){ return content; } public int getType(){ return type; }}

在創(chuàng)建適配器實例時,需要把一組Msg傳給適配器構(gòu)造函數(shù)。

創(chuàng)建子項的布局msg_item

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:background="@drawable/message_left"> <TextView android:id="@+id/left_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:textColor="#fff"/> </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:background="@drawable/message_right"> <TextView android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:textColor="#fff"/> </LinearLayout></LinearLayout>

這里包含左右兩個LinearLayout,因為聊天消息是以一個接收消息和一個發(fā)送消息(或者反過來)為一個顯示單位的,聊天記錄就是重復(fù)顯式接收-發(fā)送對。 但是消息畢竟是一條一條的,接受-發(fā)送之間應(yīng)該是獨立的。如何控制其獨立性?答案是通過設(shè)置控件的可見屬性。

創(chuàng)建適配器類MsgAdapter

繼承自ArrayAdapter類,泛型指定為Msg。 重寫父類的構(gòu)造函數(shù): public MsgAdapter(Context context, int textViewResourceId, List < Msg > objects):     context:     textViewResourceId:子項布局id     objects:待顯示消息列表

重寫getView方法:這個方法在每個子項被滾動到屏幕內(nèi)的時候被調(diào)用,用于返回每個位置應(yīng)該顯示的子項。首先通過參數(shù)textResourceId動態(tài)加載子項布局,然后按id讀取子項布局中的控件或者布局,根據(jù)提供的消息數(shù)據(jù)設(shè)置它們的屬性。 這里有兩處重復(fù)操作,一個是加載子項布局,一個是按id取出子項布局的控件或者嵌套布局。前者可以通過使用convertView參數(shù)進(jìn)行優(yōu)化,因為converView中緩存了子項布局;后者可以通過定義類ViewHolder進(jìn)行優(yōu)化,ViewHolder中存儲了控件實例,通過把view的tag設(shè)為ViewHolder方便后面直接讀取。

package com.example.victoria.myapplication;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;/** * Created by victoria on 2017/2/6. */public class MsgAdapter extends ArrayAdapter<Msg> { private int resourceId; public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; //子項布局的id } @Override public View getView(int position, View convertView, ViewGroup parent){ //convertView參數(shù)的目的是把之前加載好的布局緩存以便之后可以重用 Msg msg = (Msg) getItem(position); /*******************************************************************************/ /*經(jīng)過兩個優(yōu)化操作,加載子項布局以及讀取控件實例*/ View view; ViewHolder viewHolder; //viewHolder的目的是避免重復(fù)獲取控件實例 if(convertView == null){ //沒有緩存子項布局:緩存子項布局 view = LayoutInflater.from(getContext()).inflate(resourceId, null); //動態(tài)加載一個布局文件,inflate方法的兩個參數(shù)分別代表加載的布局文件的id、給加載的布局再添加一個父布局。 viewHolder = new ViewHolder(); viewHolder.leftLayout = (LinearLayout) view.findViewById(R.id.left_layout); viewHolder.rightLayout = (LinearLayout) view.findViewById(R.id.right_layout); viewHolder.leftMsg = (TextView) view.findViewById(R.id.left_msg); viewHolder.rightMsg = (TextView) view.findViewById(R.id.right_msg); view.setTag(viewHolder); //把子項布局的控件以更簡單的格式保存到view自身,方面后面直接的讀取,而不用每次都要按id獲取控件實例 }else{//有緩存的子項布局 view = convertView; viewHolder = (ViewHolder) view.getTag(); } /*******************************************************************************/ /*******************************************************************************/ /*根據(jù)消息Msg數(shù)據(jù)設(shè)置控件屬性*/ if(msg.getType() == Msg.TYPE_RECEIVED){ viewHolder.leftLayout.setVisibility(View.VISIBLE); viewHolder.rightLayout.setVisibility(View.GONE); viewHolder.leftMsg.setText(msg.getContent()); }else if(msg.getType() == Msg.TYPE_SEND){ viewHolder.rightLayout.setVisibility(View.VISIBLE); viewHolder.leftLayout.setVisibility(View.GONE); viewHolder.rightMsg.setText(msg.getContent()); } /*******************************************************************************/ return view; } class ViewHolder{ LinearLayout leftLayout; LinearLayout rightLayout; TextView leftMsg; TextView rightMsg; }}

主活動的布局activity_main

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/msg_list_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:divider="#0000"> </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/input_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="something here" android:maxLines="2"/> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send"/> </LinearLayout></LinearLayout>

編寫主活動MainActivity類

提供Msg數(shù)據(jù)列表,并通過適配器向ListView傳遞數(shù)據(jù)。

package com.example.victoria.myapplication;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import com.google.android.gms.appindexing.Action;import com.google.android.gms.appindexing.AppIndex;import com.google.android.gms.appindexing.Thing;import com.google.android.gms.common.api.GoogleApiClient;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private ListView msgListView; private EditText inputText; private Button send; private MsgAdapter adapter; private List<Msg> msgList = new ArrayList<Msg>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); /*******************************************************************************/ /*通過適配器向ListView傳遞數(shù)據(jù)*/ initMsg();//提供待顯示數(shù)據(jù) adapter = new MsgAdapter(MainActivity.this, R.layout.msg_item, msgList);#創(chuàng)建適配器 msgListView = (ListView) findViewById(R.id.msg_list_view); msgListView.setAdapter(adapter); /*******************************************************************************/ inputText = (EditText) findViewById(R.id.input_text); /*******************************************************************************/ /*為Button的點擊事件注冊監(jiān)聽器:當(dāng)點擊按鈕時,獲取EditText控件中的內(nèi)容,并添加到消息列表中,并通知ListView有新消息需要顯示*/ send = (Button) findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String content = inputText.getText().toString();//獲取編輯內(nèi)容 if(! "".equals(content)){ Msg msg = new Msg(content, Msg.TYPE_SEND); msgList.add(msg); adapter.notifyDataSetChanged();//當(dāng)有新消息時,刷新ListView中的顯示 msgListView.setSelection(msgList.size());//將顯式的數(shù)據(jù)定位到最后一行,以確保一定可以看到最后一行消息 inputText.setText(""); //清空輸入框中的內(nèi)容 } } }); /*******************************************************************************/ } private void initMsg(){ Msg msg1 = new Msg("hello guy.", Msg.TYPE_RECEIVED); msgList.add(msg1); Msg msg2 = new Msg("hi. who is that?.", Msg.TYPE_SEND); msgList.add(msg2); Msg msg3 = new Msg("victoria.", Msg.TYPE_RECEIVED); msgList.add(msg3); Msg msg4 = new Msg("bye", Msg.TYPE_SEND); msgList.add(msg4); }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 富裕县| 镇赉县| 隆回县| 澄江县| 景德镇市| 敦化市| 阿拉善盟| 许昌县| 西平县| 苏尼特左旗| 丹阳市| 昭平县| 福泉市| 红河县| 临沧市| 尚志市| 乌兰县| 武穴市| 永川市| 英山县| 通化市| 曲麻莱县| 大余县| 汉寿县| 通渭县| 昭平县| 吉首市| 汕尾市| 和田县| 平阳县| 阿鲁科尔沁旗| 油尖旺区| 灌云县| 东台市| 六安市| 岢岚县| 宜城市| 特克斯县| 桃源县| 四会市| 南汇区|