android listview convertview,Android:ListView、BaseAdapter、convertView、ListView优化及事件、notifyDataSetCha...

这篇博客探讨了如何在Android中优化ListView的性能,包括复用convertView以提高滚动流畅性,以及如何创建自定义BaseAdapter。博主详细解释了getView方法的逻辑,展示了如何根据position设置不同数据,并介绍了如何在ListView中展示复杂的数据结构,如包含标题、子标题、时间和图片的消息列表。同时,还展示了如何响应按钮操作更新ListView内容。
摘要由CSDN通过智能技术生成

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final ArrayList title = new ArrayList();

for (int i = 0; i < 20; i++)

{

title.add("标题" + i);

}

ListView listView = (ListView) findViewById(R.id.listView1);

listView.setAdapter(new BaseAdapter()

{

@Override

public View getView(int position, View convertView, ViewGroup parent)//执行数等于当前页面出现的行数,convertView指滚动消失的layout

{

Log.e("getView", "调用getView"+ i++ + "convertView:" + convertView);

LayoutInflater inf = getLayoutInflater();//通过LayoutInflater将布局id转换到对象

RelativeLayout relativeLayout = (RelativeLayout) inf.inflate(R.layout.relat, null);

TextView titleview = (TextView) relativeLayout.findViewById(R.id.textView1);//通过布局找到里面的控件

titleview.setText(title.get(position));//得到容器内的内容

return relativeLayout;

}

@Override

public long getItemId(int position)

{

return 0;

}

@Override

public Object getItem(int position)

{

return null;

}

@Override

//先执行getCount再执行getView,出现新行数时再次执行getCount

//listview清单里要设置高度match_parent

//每次点击屏幕一次都会先执行getCount

public int getCount()

{

Log.e("getCount", "调用getCount"+ j++);

return title.size();

}

});

}

复用converview:ListView listView = (ListView) findViewById(R.id.listView1);

listView.setAdapter(new BaseAdapter()

{

@Override

public View getView(int position, View convertView, ViewGroup parent)//执行数等于当前页面出现的行数,convertView指滚动消失的layout

{

//复用converview

RelativeLayout relativeLayout = null;

if(convertView == null)

{

LayoutInflater inf = getLayoutInflater();

relativeLayout = (RelativeLayout) inf.inflate(R.layout.relat, null);

}

else

{

relativeLayout = (RelativeLayout) convertView;

}

TextView titleView = (TextView) relativeLayout.findViewById(R.id.textView1);

titleView.setText(title.get(position));

return relativeLayout;

}

继续优化:public class MainActivity extends Activity

{

int imID = 0;

class Msg//内容

{

String mTitle;

String mSubtitle;

String mTime;

int mImagID;

public Msg(String mTitle, String mSubtitle, String mTime, int mImagID)

{

super();

this.mTitle = mTitle;

this.mSubtitle = mSubtitle;

this.mTime = mTime;

this.mImagID = mImagID;

}

}

class ViewHolder//控件

{

TextView viewTitle;

TextView viewSubtitle;

TextView viewTime;

ImageView viewImage;

}

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Date timeNow = new Date();

SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");

String time = timeFormat.format(timeNow);

final ArrayList msgList = new ArrayList();

for (int i = 0; i < 30; i++)//选择图片

{

if(i % 4 == 0)

{

imID = R.drawable.ic_launcher;

}

if(i % 4 == 1)

{

imID = R.drawable.ic_1;

}

if(i % 4 == 2)

{

imID = R.drawable.ic_2;

}

if(i % 4 == 3)

{

imID = R.drawable.ic_3;

}

Msg msg = new Msg("标题" + i, "内容" + i, time ,imID);

msgList.add(msg);

}

ListView listView = (ListView) findViewById(R.id.listView1);

listView.setAdapter(new BaseAdapter()

{

ViewHolder holder = null;

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

RelativeLayout relout = null;

if (convertView == null)//创建首页时才find控件

{

LayoutInflater layoutInflater =getLayoutInflater();

relout = (RelativeLayout) layoutInflater.inflate(R.layout.relaout, null);

holder = new ViewHolder();

holder.viewTitle= (TextView) relout.findViewById(R.id.textView_title);

holder.viewSubtitle = (TextView) relout.findViewById(R.id.textView_subtitle);

holder.viewTime = (TextView) relout.findViewById(R.id.textView_time);

holder.viewImage = (ImageView) relout.findViewById(R.id.p_w_picpathView1);

relout.setTag(holder);

}

else//否则复用layout和view

{

relout = (RelativeLayout) convertView;

holder = (ViewHolder) relout.getTag();//记得得到holder

}

Msg msg = msgList.get(position);

holder.viewTitle.setText(msg.mTitle);

holder.viewSubtitle.setText(msg.mSubtitle);

holder.viewTime.setText(msg.mTime);

holder.viewImage.setImageResource(msg.mImagID);//设置图片的方法

return relout;

}

@Override

public long getItemId(int position)

{

return 0;

}

@Override

public Object getItem(int position)

{

return null;

}

@Override

public int getCount()

{

return msgList.size();

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

点击按钮更新listview:Adapter使用notifyDataSetChanged()通知listview更新3private void btn1Click()//增加一行信息

{

i++;

data.add("内容" + i );

arrAdapter.notifyDataSetChanged();//Adapter通知listview做更新

}

private void btn2Click()//删除第一行信息

{

if(data.size() < 1)

{

Toast.makeText(this, "信息已删除完毕!", Toast.LENGTH_LONG).show();

}

else

{

data.remove(0);

arrAdapter.notifyDataSetChanged();//Adapter通知listview做更新

}

}

private void btnsortClick()//对列表进行排序

{

Collections.sort(data);

arrAdapter.notifyDataSetChanged();

}

注:

1.LayoutInflater inflater = getLayoutInflater();

layout = (RelativeLayout) inflater.inflate(R.layout.relayout, null);

layout要通过LayoutInflater拿到。

2.getView返回layout,getCount()返回int。

3.layout.getTag()要转换为holder = (ViewHolder)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值