今天学习了关于ListView控件的基础知识
1.ListView:在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet,Adapter的作用就是把数据展示在Listview中
2.ListView的一些方法:
设置表头:
ColumnHeader title=new ColumnHeader(); //声明标头,并创建对象。 title.Text="标头1名称"; //标头一显示的名称。 title.Width=120; //标头一名称 的宽度。 this.listView1.Columns.Add(title); //将标头添加到ListView控件。
3.适配器
3.1 ArrayAdapter 是字符串数值,只能在ListView显示出文本信息。
3.2 BaseAdapter 一种自定义的数据来源,要自定义布局方式,可以放置图片,按钮,文本之类的。
3.3 SimpleCursorAdapter 数据来源于数据库。
4 使用ListView为其添加ArrayAdapter的步骤。
4.1在布局文件中添加ListView定义
<?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/costlist" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> tools:context=".OneActivity" <ListView android:id="@+id/list1" android:layout_width="150dp" android:layout_height="match_parent" /> </LinearLayout>
4.2 在主程序中绑定适配器
import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MyListView extends Activity{ private static final String[] str=new String[]{"first","second","third","fourth","fifth"};//定义要列出的项目内容 @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); lv=(ListView)findViewById(R.id.lv); //绑定ArrayAdapter适配器 lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str)); } }
其中 lv.setAdapter(Context context, int textViewResourceId, T[] objects)
第一个参数表示上下文
第二个参数表示一个包含TextView,用来填充listView的每一行的布局资源ID
第三个参数为ListView的内容
通过指定第二个参数来实现不同的显示效果,
资源android.R.layout.simple_list_item_1来实现仅显示内容,无勾选。
资源android.R.layout_simpel_list_item_checked实现带选择框的ListView,需要用setChoiceMode()设定选择为多选还是单选。
资源android.R.layout.simple_list_item_multiple_choice实现带checkbox的ListView,需要用setChoiceMode()设定选择为多选还是单选。
资源android.R.layout.simple_list_item_single_choice实现带RadioButton的ListView,需要用setChoiceMode()设定为多选还是单选。
实现带RadioButton的ListView并设置多选:
lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_ single_choice,str)); lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
5.使用自定义适配器的步骤
5.1 同4.1
5.2为ListView中的每一项Item定义布局文件(这里实现三列显示文本,每一列的同一都是一个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"> <TextView android:id="@+id/text1" android:layout_width="150dp" android:layout_height="100dp" /> <TextView android:id="@+id/text2" android:layout_width="150dp" android:layout_height="100dp" /> <TextView android:id="@+id/text3" android:layout_width="150dp" android:layout_height="100dp" /> </LinearLayout>
5.3 将每一个Item封装为一个类,并编写get()和set()函数,相当于java Been。
5.4 编写自定义适配器(需要重写4个方法)
public class MyAdapter extends BaseAdapter { private List<Message> Datas;//需要显示的内容 private Context mContext;//上下文参数
//构造函数
public MyAdapter(List<Message> datas, Context mContext) { Datas = datas; this.mContext = mContext; } /** * 返回item的个数 * @return */ @Override public int getCount() { return Datas.size(); } /** * 返回每一个item对象 * @param i * @return */ @Override public Object getItem(int i) { return Datas.get(i); } /** * 返回每一个item的id * @param i * @return */ @Override public long getItemId(int i) { return i; } /** * 暂时不做优化处理,后面会专门整理BaseAdapter的优化 * @param i * @param view * @param viewGroup * @return */ @Override public View getView(int i, View view, ViewGroup viewGroup) { view = LayoutInflater.from(mContext).inflate(R.layout.list_item,viewGroup,false); TextView money = (TextView)view.findViewById(R.id.text1);
TextView beizhu = (TextView)view.findViewById(R.id.text2);
TextView data = (TextView)view.findViewById(R.id.text3);
money.setText(String.valueOf(Datas.get(i).getMoney()));
beizhu.setText(Datas.get(i).getBeizhu());
data.setText(Datas.get(i).getData());
//此处需要返回view 不能是view中某一个
return view; } }
getView()介绍:
三个参数的意义:
int i
一般BaseAdapter都是很多类型一样的数据展示在界面,该属性是判断显示在界面上的是第几个,通过position在BaseAdapter自定义的数组或者集合中取值。并展示在界面上。
View view
展示在界面上的一个item。因为手机屏幕就那么大,所以一次展示给用户看见的内容是固定的,如果你List中有1000条数据,不应该new1000个converView,那样内存肯定不足,应该学会控件重用,滑出屏幕的converView就在下面新进来的item中重新使用,只是修改下他展示的值
ViewGroup viewGroup
这个属性是加载XML视图时使用
各个方法的意义:
得到布局文件中每个控件的id,为其设置值。 textView1.setText(Datas.get(i).getTheme()); 得到列表中第i个位置的对象调用他的get()函数为控件设置值。
5.5 在Activity中调用ListView并为其设置适配器
public class MainActivity extends Activity{ // 这三个经常是同时出现的 private List<Message> lists; private MyAdapter adapter; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.list1); lists = new ArrayList<>(); //利用封装好的类类型像list中添加内容
lists.add(new Message("1000","工资收入","2020/2/1")); lists.add(new Message("-260","超市支出","2020/2/2")); lists.add(new Message("-40","电费支出","2020/2/3")); adapter = new MyAdapter(lists,MainActivity.this); listView.setAdapter(adapter); } }