1、在布局中写一个ListView,给个id
<RelativeLayout 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=".MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="⑧⑨⑩⑧⑨⑩⑧⑨⑩⑧⑨⑩⑧⑨⑩" />
<ListView
android:layout_below="@id/tv"
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</ListView>
</RelativeLayout>
2、在布局中再创建一个ListView的单个条目,把每个条目的布局id等等都写好
<?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"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_item"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:drawablePadding="5dp"
android:text="小鸡炖蘑菇"
/>
<!--
android:drawableLeft="@drawable/ic_launcher"
给textview的坐标定义一个图片
-->
</LinearLayout>
3、再创作一个BaseAdapter的子类,就是你写一个类继承BaseAdapter,最常用的就是配合ArrayList来完成这个数据的填充,完成了条目id和数据的设置
//创建一个自己的类继承BaseAdapter
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {//得到显示的条目数
return myList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//用打气筒inflate把布局文件打进来
View v = View.inflate(MainActivity.this, R.layout.listitem, null);
//操作布局文件中的组件
TextView tv_item = (TextView) v.findViewById(R.id.tv_item);
//给tv_item设置内容
tv_item.setText(myList.get(position));
return v;
}
}
}
4、在代码中找到listView 的id,把listview组件和适配器关联即可,适配器有3种以下是BaseAdapter。点击网址看全部适配器写法(http://5200415.blog.51cto.com/3851969/800507/)
package us.mifeng.listview;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
//定义一个集合
private ArrayList<String> myList=new ArrayList<String>();
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
//给listView设置适配器
lv.setAdapter(new MyAdapter());
}
private void initView() {
lv = (ListView) findViewById(R.id.lv);
}
private void initData() {
myList.add("恭喜发财");
myList.add("大吉大利");
myList.add("猴年马月");
myList.add("等等");
myList.add("好好学习");
myList.add("天天向上");
myList.add("恭喜发财");
myList.add("恭喜发财");
}
//创建一个自己的类继承BaseAdapter
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {//得到显示的条目数
return myList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//用打气筒inflate把布局文件打进来
View v = View.inflate(MainActivity.this, R.layout.listitem, null);
//操作布局文件中的组件
TextView tv_item = (TextView) v.findViewById(R.id.tv_item);
//给tv_item设置内容
tv_item.setText(myList.get(position));
return v;
}
}
}
5.优化方案
第一步:如果没有缓存就加载布局,如果有缓存就直接用convertView对象。所以这样就用滑动listview的时候调用getView()方法每次都去加载布局了(如果改布局已经加载)。
第二步:convertView为空时,viewHolder会将空间的实力存放在ViewHolder里,然后用setTag方法讲viewHolder对象存储在view里。convertView不为空时,用getTag方法获取viewHolder对象.
第三步:图片的压缩
第四步:分页加载
http://blog.youkuaiyun.com/u010921385/article/details/52435203
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageResource(R.drawable.icon);
holder.text.setText(mData[position]);
return convertView;
}
static class ViewHolder {
ImageView icon;
TextView text;
}
使用分页加载 优化
上面三种方式其实也不能完全解决OOM崩溃的情况,因为虽然我们在分段中一次只增加10条数据到List集合中,然后再刷新到ListView中去,假如有10万条数据,如果我们顺利读到最后这个List集合中还是会累积海量条数的数据,还是可能会造成OOM崩溃的情况,这时候我们就需要用到分页,比如说我们将这10万条数据分为1000页,每一页100条数据,每一页加载时都覆盖掉上一页中List集合中的内容,然后每一页内再使用分批加载,这样用户的体验就会相对好一些。
http://www.cnblogs.com/tianshidechibang234/p/3194121.html(点击进入看详细代码)
```
pubass MainActivity extends ActionBarActivity {
ArrayList<String> list=new ArrayList<String>();
private View v;
private Abc abc;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//把预先写好的地步item按键声明出来
v = View.inflate(this,R.layout.bb, null);
//把声明出来的布局放在listview的底部
lv.addFooterView(v);
Button bt=(Button) v.findViewById(R.id.bt);
for (int i = 0; i < 10; i++) {
list.add("A"+i);
}
abc = new Abc();
lv.setAdapter(abc);
//设置底部按键点击加载数据
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int count = abc.getCount();
if (count<50) {
for (int i=count; i < count+10; i++) {
list.add("A"+i);
}
abc.notifyDataSetChanged();
}else {
abc.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "已经到底了", 0).show();
}
}
});
}
public class Abc extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHader vh;
if (convertView==null) {
convertView=convertView.inflate(MainActivity.this, R.layout.aaa, null);
vh = new ViewHader();
vh.tv=(TextView) convertView.findViewById(R.id.tv);
convertView.setTag(vh);
}else {
vh = (ViewHader) convertView.getTag();
}
vh.tv.setText(list.get(position));
return convertView;
}
class ViewHader{
TextView tv;
}
}
}
布局
MainActivity的布局
<RelativeLayout 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.example.myfenye.MainActivity" >
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lv" />
</RelativeLayout>
listview每个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"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="aaa"
android:id="@+id/tv"
/>
</LinearLayout>
底部按键的布局
<?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="wrap_content"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bt"
android:text="点击加载"
/>
</LinearLayout>