总结这周学习的内容,首先是学习了一些常用的控件,包括控件的一些常用的属性。第二,学习了四大布局,其中最为主要学习的是LinearLayout和RelativeLayout,还有帧布局和TableLayout。最后学习了最为重要的LIstView。本周笔记的内容,我主要总结一下ListView的用法的简单思路和一些关键代码的解析,还有ListView的优化问题,扩展内容是如何创建自定义控件。
首先进行第一个内容,最为常用的ListView。
我们都知道ListView绝对是Android最为常用的控件之一,那么如何写出一个最为简单的ListView呢,如下就是最简单的ListView。首先在Activity对应的Layout中创建一个<ListView>
<ListView
android:id="@+id/listView_1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
内容也是非常简单,最有id 和一些高度和宽度的属性。接下来就在activity中创建一个适配器,作为一个最简单的ListView,我定义它的属性只有String类型的内容。这里我们用到android自带的ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,StringData);
解析一下里面的内容,首先创建一个适配器,其中后面包括三个参数,第一个是上下文,第二个是Android自带的内置布局文件 ,第三个参数数据。现在把数据定好
private String[] StringData = {"one","two","three"};
最后一步就是创建一个ListView变量找到布局的Layout和被适配器set进去即可。
ListView listView = (ListView)findViewById(R.id.listView_1);
listview.setAdapt(adapter);
这个就是一个较为简单的ListView,因为他大部分用到的是自带的布局文件和自带的适配器。当然不是所有的ListView内容只有String,可能在我们之后的编程中ListView中包括的内容还包含图片和其他的一些内容,所以ListView布局的文件我们要自己来写,还有要有我们自己写的适配器,接下来的内容我就以老师布置的作业为例子的ListView,虽然ListView的内容也是只有String类型,当为了更好的理解,我创建了自己的适配器和布局。
//首先第一步还是创建ListView
<ListView
android:id="@+id/listView_1"
android:layout_marginTop="35dp"
android:background="@color/white"
android:layout_below="@+id/image_weixing"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
在主页面中创建ListView变量找到ListView
ListView mListView =(ListView)findViewById(R.id.listView_1);
创建要显示的数据类,这里的数据只有字符串,用data表示
public class Data {
private String data;
public Data(String data){
this.data= data;
}
public void setData(String NewData){
data=NewData;
}
public String getData(){
return data;
}
}
接下来就是创建我们自己的适配器,适配器继承的是基础适配器
public class NewAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private List<Data> mData =new ArrayList<>();
public NewAdapter(Context context,List<Data> data){
mContext = context;
mData= data;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//创建一个LayoutInflater,有三种法方创建,这里用一种
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
view=mLayoutInflater.inflate(R.layout.choose_item,null);
TextView dataText= (TextView)view.findViewById(R.id.data_text);//获取id
view =convertView;
dataText(mData.get(position).getData());//获取数据
return view;
}
}
最后一步在主页面setAdapter即可。
当然这里的ListView性能是非常不好的,因为在加载ListView时候,每一次都要运行view=mLayoutInflater.inflate(R.layout.choose_item,null);,还有id的获取也需要加载,当ListView很大和快速滑动的时候有可能就会出现闪屏的状况,这个时候要修改一下。
public class NewAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private List<Data> mData =new ArrayList<>();
public NewAdapter(Context context,List<Data> data){
mContext = context;
mData= data;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//创建一个LayoutInflater,有三种法方创建,这里用一种
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView==null){
view=mLayoutInflater.inflate(R.layout.choose_item,null);
TextView wordText= (TextView)view.findViewById(R.id.data_text);//获取id
}else{
view =convertView;
}
wordText.setText(mData.get(position).getData());//获取数据
return view;
}
}
接下来我们还可以用ViewHolder来继续优化
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if(convertView==null){
viewHolder = new ViewHolder();
view=mLayoutInflater.inflate(R.layout.data_item,null);
viewHolder.dataText= (TextView)view.findViewById(R.id.data_text);
view.setTag(viewHolder);
}else {
view =convertView;
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.dataText.setText(mChooses.get(position).getSomeWord());
return view;
}
class ViewHolder{
TextView dataText;
}
这样就可已完成好ListView很不错的优化了。