Listview学习(一)
Listview是安卓中非常常用的控件。下边是一些学习过程中的总结。
使用方法:
1.加载数据,数据类型可以是list,map,set等基本类型的相关类。
2.新建adapter,adapter比较常用的是arrayadapter,或者是复写baseadapter的getview方法得到的自定义adapter。
3.将adapter绑定到listview上
一个简单的示例如下:
package com.bupt.markfavor.demo0910listview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter adapter;
public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",
"blackberry","cherry","coconut","cumquat","fig","fresh"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.普通listview
listView = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
listView.setAdapte`````````
(adapter); }
}
这个例子看起来并不复杂,但是在实际使用当中却有很多问题。当listview当中的item数量过多时,过快滑动条目会产生明显的卡顿现象。这是因为listview的每一个条目在使用过程中会不断地调用adapter里getview来获取新的内容,当条目数量过多滑动速度过快时,会重复加载新的view对象,不管该对象之前是否被加载过。因此,在实际使用中更多的时候是自定义adapter,在getview方法中定义viewholder,缓存已经出现过的条目,再利用convertview来进行判断该条目是否出现过,是否可以加载缓存。这样可以提升listview的效率。代码如下:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter adapter;
public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",
"blackberry","cherry","coconut","cumquat","fig","fresh"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
1.普通listview
// listView = (ListView) findViewById(R.id.listview);
// adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
// listView.setAdapter(adapter);
//2.自定义adapter的listview,提升运行效率
listView=(ListView)findViewById(R.id.listview);
MyAdapter myAdapter = new MyAdapter(this);
for (int i =0;i<=50;i++){
myAdapter.addItem("item"+i);
}
listView.setAdapter(myAdapter);
}
}
下面是自定义adapter,实现了检查convertview是否有缓存,用viewholder装载布局文件。
package com.bupt.markfavor.demo0910listview;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import static android.content.ContentValues.TAG;
/**
* Created by markfavor on 2017/9/13.
*/
public class MyAdapter extends BaseAdapter {
private ArrayList<String>myData = new ArrayList<>();
private LayoutInflater myInflater;
public MyAdapter(Context context) {
super();
myInflater=LayoutInflater.from(context);
// myInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);效果与上句相同
}
public void addItem(String a){
myData.add(a);
notifyDataSetChanged();//通知所有与已经改变数据相关联的观测者应当刷新数据
}
@Override
public int getCount() {
return myData.size();
}
@Override
public Object getItem(int position) {
return myData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
Log.d(TAG, "getView: "+position+","+convertView);
if (convertView==null){
holder=new ViewHolder();
convertView=myInflater.inflate(R.layout.item1,null);
holder.textview= (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
holder.textview.setText(myData.get(position));
return convertView;
}
public static class ViewHolder{
public TextView textview;
}
}
item1.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center_vertical"
android:text="text" />
</LinearLayout>