ListView是在程序开发中经常要用到。在开发之中被用来做列表的设计实现。根据需求的列表中可能有很多数据,数据加载中原始的方法
1.一次全部加载数据,这肯定很耗内存,也影响性能,更好的方法
2.加载页面显示的数据,更优化的方法
3.使用复用技术,加载页面的数据。
方法一的实现:在布局文件中加入视图
布局文件activity_main.xml
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
主程序MainActivity.java
public class MainActivity extends ActionBarActivity {
private LinearLayout layout ;
private TextView textView;
private List<Person> list;
private ImageView p_w_picpathView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = (LinearLayout)findViewById(R.id.linearlayout);
list = addPerson();
//界面中显示多条数据
for(int i = 0 ; i< 1000; i++){
textView = new TextView(this);
p_w_picpathView = new ImageView(this);
p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);
textView.setTextColor(Color.BLUE);
textView.setText(list.get(i).toString());
// 在LinearLayout中加入View
layout.addView(p_w_picpathView);
layout.addView(textView);
}
}
private List<Person> addPerson() {
List<Person> list1 = new ArrayList<Person>();
Person person;
for(int i = 0 ; i < 100000 ; i++){
person = new Person("hhh", "zhangwwww", i);
list1.add(person);
}
return list1;
}
}
这个是简单列表简单的实现,Person类是个学生类包括name,info,age,三个字段。自定义了toString()方法,用于显示学生的姓名,信息和年龄。
在测试中,当把循环次数增到很大的时候,不能全部加载出所有的项,超出的不会显示。性能是最低的。
方法二:在布局中加入view性能很低,我们用ListView控件实现系统给BaseAdapter,SimpleAdapter,ArrayAdapter等等。实现性能的优化。它是在通过页面显示的个数,调用getView方法多少次来绘制界面,滑动的时候在重绘。
布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/list"
/>
</LinearLayout>
主程序MainActivity.java
public class MainActivity extends ActionBarActivity {
private ListView listView;
MyAdapter myAdapter;
private List<Person> list;
Button button;
private int pressedId = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.list);
button = (Button)findViewById(R.id.button);
list = getListData();
myAdapter = new MyAdapter(this,list);
listView.setAdapter(myAdapter);
}
private List<Person> getListData() {
List<Person> list1 = new ArrayList<Person>();
Person person;
for(int i = 0 ; i < 100 ; i++){
person = new Person("hhhh","ssss",i);
list1.add(person);
}
return list1;
}
}
MyAdapte是继承BaseAdapter的类,重写public View getView(int arg0, View arg1, ViewGroup arg2) 方法。在这个方法中设置ListView控件中每行要显示的数据。简单的实现:
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
//布局文件LinearLayout的id
linear = new LinearLayout(context);
//图片视图的ID
p_w_picpathView = new ImageView(context);
p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);
//加入到布局中
linear.addView(p_w_picpathView);
textView = new TextView(context);
textView.setTextColor(Color.BLUE);
textView.setText(person.get(arg0).toString());
linear.addView(textView);
//返回视图
return linear;
}
方法三:是在方法二的基础上改进。加入了item布局文件,独立控件ID的获取,判断视图是否在内存中存在。
item布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/imgView_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView android:id="@+id/textViewName_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewInfo_1"></TextView>
<Button
android:id="@+id/load_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_bt_load"
></Button>
</LinearLayout>
ListView布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.feiliu.fllistview_2.MainActivity$PlaceholderFragment" >
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
在MyAdapter中加入独立获取控件的ID的方法.
//view的声明在类的成员变量中声明
public void getViewId(){
imgView_1 = (ImageView) convertView.findViewById(R.id.imgView_1);
textViewName_1 = (TextView) convertView.findViewById(R.id.textViewName_1);
textViewInfo_1 = (TextView) convertView.findViewById(R.id.textViewInfo_1);
load_1 = (Button)convertView.findViewById(R.id.load_1);
}
在MyAdapter构造方法中调用一次,接下来是重写getView(int arg0, View arg1, ViewGroup arg2)方法。
protected View getView(int position, View convertView) {
//convertView是每一项的视图,判断是否为空,不为空就不重加载
if (convertView == null) {
convertView = mLayoutInflater.inflate(getResourceId(), null);
}
imgView_1.setBackgroundResource((Integer)arrayList.get(position).get("imgView"));
textViewName_1.setText((String)arrayList.get(position).get("imgName"));
textViewInfo_1.setText(arrayList.get(position).get("imgInfo").toString());
load_1.setText("下载");
return convertView;
}
主程序MainActivity.java
public class MainActivity extends ActionBarActivity {
private ArrayList<HashMap<String, Object>> arrayList;
private ListViewAdapter<HashMap<String, Object>> listViewAdapter;
private ListView listView;
String[] imgNames = new String[] { "刀塔传奇", "群星斗地主", "二战前线", "剑圣传奇首发",
"消灭星星", "黄金矿工3", "放开那三国", "3D捕鱼达人", "全民打飞机",
};
String[] imgInfos = new String[] { "互动网游|128.1M", "×××桌游|5.5M", "飞行射击|5.3M",
"互动网游|90.1M", "休闲趣味|3.6M", "休闲趣味|7.5M", "互动网游|95.0M", "休闲趣味|26.6M",
"飞行射击|5.4M", " };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
arrayList = getData();
listView = (ListView) findViewById(R.id.listView);
listViewAdapter = new ListViewAdapter<HashMap<String, Object>>(this, this.arrayList);
listView.setAdapter(listViewAdapter);
}
private ArrayList<HashMap<String, Object>> getData() {
ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map;
for (int j = 0; j < 9; j++) {
map = new HashMap<String, Object>();
map.put("imgView", R.drawable.ic_launcher);
map.put("imgName", imgNames[j * 3]);
map.put("imgInfo", imgInfos[j * 3]);
map.put("imgView1", R.drawable.ic_launcher);
map.put("imgName1", imgNames[j * 3 + 1]);
map.put("imgInfo1", imgInfos[j * 3 + 1]);
map.put("imgView2", R.drawable.ic_launcher);
map.put("imgName2", imgNames[j * 3 + 2]);
map.put("imgInfo2", imgInfos[j * 3 + 2]);
arrayList.add(map);
}
return arrayList;
}
}
ListView在开发中占的比重还是很重的。本人也是初学,有什么不当的请谅解。
转载于:https://blog.51cto.com/liwenchen/1545282