Android ListView使用小结
2016-08-21 21:06
211 查看
ListView用于在AndroidUI上进行大量数据的展示,本文为整理《第一行代码Android》3.7节中的例子。
ListView基本设置其实只有一句:listView.setAdapter(adapter)
也就是说设置ListView实质就是设置adapter,下面我们来看adapter默认的设置方法(以T类型为例):
ArrayAdapter<T>adapter =new ArrayAdapter<T>(MainActivity.this,android.layout.simple_list_item_1,data), //data为类型T的集合
因此为了显示更丰富的内容我们需要重写以下内容:
(1)T的类型
(2)ListView中每行的布局
(3)显示的数据集合data
(4)更据(1)(2)(3)中的内容重写adapter
(5)在onCreate方法中为ListView设置adapter
参考《第一行代码Android》3.7节的例子我们来一一对应上面的步骤
(1)重写T的类型,新建Msg类,该类表示每行显示的消息,因此需要定义String类型的content表示消息内容,int类型的 type表示消息是发送还是接收,同时定义静态属性TYPE_RECEIVED与TYPE_SENT标识type可能的两种值。
(2)重写ListView的布局,layout文件夹中新建msg_item.xml布局文件,两个线性布局分别位于左右,其中有一个TextView用于显示消息。
(3)数据集合data,在此例中直接定义一个List<msg> msgList后赋值
(4)重写adapter,新的MsgAdapter继承ArrayAdapter<Msg>,主要重写两个部分构造函数和getView方法
构造函数:
唯一要强调的一点,textViewResourceId表示ListView每行的布局文件,具体为什么是int类型我也没弄清楚
getView()方法:
viewHolder和convertView的使用是为了提高ListView的效率,可以看出getView主要做的事情就是将布局放入view中,再为布局中各组件赋值,比如Layout是否可见,TextView显示的数据等
(5)完成上面的工作后,我们就可以在onCreate方法中像设置默认ListView一样为ListView设置adapter了。
ListView基本设置其实只有一句:listView.setAdapter(adapter)
也就是说设置ListView实质就是设置adapter,下面我们来看adapter默认的设置方法(以T类型为例):
ArrayAdapter<T>adapter =new ArrayAdapter<T>(MainActivity.this,android.layout.simple_list_item_1,data), //data为类型T的集合
因此为了显示更丰富的内容我们需要重写以下内容:
(1)T的类型
(2)ListView中每行的布局
(3)显示的数据集合data
(4)更据(1)(2)(3)中的内容重写adapter
(5)在onCreate方法中为ListView设置adapter
参考《第一行代码Android》3.7节的例子我们来一一对应上面的步骤
(1)重写T的类型,新建Msg类,该类表示每行显示的消息,因此需要定义String类型的content表示消息内容,int类型的 type表示消息是发送还是接收,同时定义静态属性TYPE_RECEIVED与TYPE_SENT标识type可能的两种值。
public class Msg { public static final int TYPE_RECEIVED=0; public static final int TYPE_SENT=1; private String content; private int type; public Msg(String content,int type) { this.content=content; this.type=type; } public String getContent() { return content; } public int getType() { return type; } }
(2)重写ListView的布局,layout文件夹中新建msg_item.xml布局文件,两个线性布局分别位于左右,其中有一个TextView用于显示消息。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/left_layout" android:layout_gravity="left" android:background="@drawable/message_left"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/left_msg" android:layout_gravity="center" android:layout_margin="10dp" android:textColor="#fff"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/right_layout" android:layout_gravity="right" android:background="@drawable/message_right"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/right_msg" android:layout_gravity="center" android:layout_margin="10dp"/> </LinearLayout> </LinearLayout>
(3)数据集合data,在此例中直接定义一个List<msg> msgList后赋值
private void initMsg(){ Msg msg1=new Msg("Hello guy",Msg.TYPE_RECEIVED); msgList.add(msg1); Msg msg2=new Msg("Hello, Who is that?",Msg.TYPE_SENT); msgList.add(msg2); Msg msg3=new Msg("This is Tom. Nice talking to you.",Msg.TYPE_RECEIVED); msgList.add(msg3); }
(4)重写adapter,新的MsgAdapter继承ArrayAdapter<Msg>,主要重写两个部分构造函数和getView方法
构造函数:
public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects){ super(context,textViewResourceId,objects); resourceId=textViewResourceId; }
唯一要强调的一点,textViewResourceId表示ListView每行的布局文件,具体为什么是int类型我也没弄清楚
getView()方法:
@Override public View getView(int position, View convertView, ViewGroup parent){ Msg msg=getItem(position); View view; ViewHolder viewHolder; if(convertView==null){ view= LayoutInflater.from(getContext()).inflate(resourceId,null); 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); }else{ view=convertView; viewHolder=(ViewHolder)view.getTag(); } 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_SENT){ viewHolder.rightLayout.setVisibility(View.VISIBLE); viewHolder.leftLayout.setVisibility(View.GONE); viewHolder.rightMsg.setText(msg.getContent()); } return view; }
viewHolder和convertView的使用是为了提高ListView的效率,可以看出getView主要做的事情就是将布局放入view中,再为布局中各组件赋值,比如Layout是否可见,TextView显示的数据等
(5)完成上面的工作后,我们就可以在onCreate方法中像设置默认ListView一样为ListView设置adapter了。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //getSupportActionBar().hide(); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initMsg(); adapter=new MsgAdapter(MainActivity.this,R.layout.msg_item,msgList); inputText=(EditText)findViewById(R.id.input_text); send=(Button)findViewById(R.id.send); msgListView=(ListView)findViewById(R.id.msg_list_view); msgListView.setAdapter(adapter); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String content=inputText.getText().toString(); if(!"".equals(content)){ Msg msg=new Msg(content,Msg.TYPE_SENT); msgList.add(msg); adapter.notifyDataSetChanged();//当有新消息时,刷新ListView中的显示 msgListView.setSelection(msgList.size());//将ListView定位到最后一行 inputText.setText("");//清空输入框内容 } } }); }
相关文章推荐
- android ListView,GridView 使用小结
- Android开发---Listview使用技巧小结
- android中的listView使用小结
- android expandablelistview使用小结
- Android ExpandableListView使用小结(一)
- Android ExpandableListView使用小结
- Android ExpandableListView使用小结(二)
- ListView 的使用 —— Android 发现之旅 2011/03/28
- Android ListView的简单使用
- Android ListView+image的使用
- Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!
- Android---快速拨话程序(涵盖appWidget、Tab、联系人、多线程、自定义ListView使用)
- Android中ListView的使用
- android ListView 使用
- Android基础教程(五)之 ------ ListView 的使用
- android ListView布局之一(继承listActivity、使用arrayAdapter)
- android ListView的使用
- Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!
- Android中ListView与ArrayAdapter配合使用
- Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!