一、ListView常用优化技巧:
1、话说使用ViewHolder模式可以提高50%以上的效率,主要是在BaseAdapter中操作
代码:ViewHolderAdapter.java
package com.mfc.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.administrator.fourlistview.R;
import java.util.List;
/**
* Created by Administrator on 2017/8/13.
*/
public class ViewHolderAdapter extends BaseAdapter {
private List<String> mData;
private LayoutInflater mInflater;
public ViewHolderAdapter(Context context,List<String> data) {
this.mData = data;
mInflater = LayoutInflater.from(context);
}
@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) {
ViewHolder holder = null;
//判断是否缓存
if(convertView == null){
holder = new ViewHolder();
//通过LayoutInflater实例化布局
convertView = mInflater.inflate(R.layout.viewholder_item,null);
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
//通过tag找到缓存的布局
holder = (ViewHolder) convertView.getTag();
}
//设置布局中控件要显示的视图
holder.img.setBackgroundResource(R.drawable.ic_launcher);
holder.title.setText(mData.get(position));
return convertView;
}
public final class ViewHolder{
public ImageView img;
public TextView title;
}
}
2、ListView标签中优化的属性;
<!--
设置项目间分割线
android:divider="@android:color/background_dark"
android:dividerHeight="10dp"
分割线设置为透明:
android:divider="@null"
隐藏ListView的滚动条:
android:scrollbars="none"
取消ListView的Item点击效果:
android:listSelector="#00000000"或者
android:listSelector="@android:color/transparent"
-->
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:divider="@android:color/background_dark"
android:dividerHeight="10dp"
android:listSelector="@android:color/transparent"></ListView>
3、动态修改ListView:
如果每次修改了ListView后都需要重新设置Adapter来更新ListView的显示,这样效率很低,而且显示界面也不友好。因此,可以使用一个简单的方法对ListView实现动态更新。
ListView动态更新思路:当修改了传递给Adapter的List后,通过调用adapter的notifyDataSetChanged(),通知listview动态修改数据。
代码:
适配器代码同 1 中的ViewHolderAdapter.java。
activity:
package com.example.administrator.fourlistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import com.mfc.utils.ViewHolderAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 2017年8月13日23:50:31
* 动态修改ListView
* */
public class NotifyActivity extends AppCompatActivity {
private ListView listView;
List<String> list;
ViewHolderAdapter viewHolderAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notify);
listView = (ListView) findViewById(R.id.listView);
list = new ArrayList<String>();
for (int i = 0; i<20; i++){
list.add("测试数据"+i);
}
viewHolderAdapter = new ViewHolderAdapter(NotifyActivity.this,list);
listView.setAdapter(viewHolderAdapter);
//遍历ListView中所有的Item,在这里没什么用,只是为了测试listview可以使用这个方法
for(int i = 0; i < listView.getChildCount(); i++){
//getChildAt(i)获取第i个子View
View view = listView.getChildAt(i);
}
}
public void addView(View view){
list.add("new item");
//调用notifyDataSetChanged()方法,通知ListView更改数据源
viewHolderAdapter.notifyDataSetChanged();
//设置最后本页最后一个Item显示的是第几项
listView.setSelection(list.size()-1);
}
}
xml:
<?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">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="9"></ListView>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:text="addView"
android:layout_weight="1"
android:onClick="addView"/>
</LinearLayout>
效果图:
4、处理空的ListView
只需要调用ListView的 setEmptyView()就可以了。
activity代码:
package com.example.administrator.fourlistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.mfc.utils.ViewHolderAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 2017年8月14日00:29:06
* 处理空的ListView
* */
public class EmptyListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.emptylistview);
listView = (ListView) findViewById(R.id.listView);
/*List<String> list = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
list.add("测试数据"+i);
}
listView.setAdapter(new ViewHolderAdapter(EmptyListViewActivity.this,list));*/
//ListView为空时显示这个组件
listView.setEmptyView(findViewById(R.id.empty_view));
}
}
xml代码:
<?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">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
<ImageView
android:id="@+id/empty_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_launcher"/>
</LinearLayout>
5、ListView的滑动监听:
如果需要很精确的监听滑动事件,通常需要使用GestureDetector手势识别、VelocityTracker滑动速度检测等辅助类来完成更好的监听。
这里记录一下两种略微简单的滑动监听:OnTouchListener 和OnScrollListener。
适配器代码同 1 中ViewHolderAdapter.java
activity代码:
package com.example.administrator.fourlistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.menu.ShowableListMenu;
import android.support.v7.widget.ForwardingListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.Toast;
import com.mfc.utils.ViewHolderAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 2017年8月14日00:29:34
* ListView 的滑动监听
* */
public class TouchListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewholder);
listView = (ListView) findViewById(R.id.listView);
List<String> list = new ArrayList<String>();
for (int i = 0; i < 20; i++){
list.add("测试数据"+i);
}
listView.setAdapter(new ViewHolderAdapter(TouchListViewActivity.this,list));
/*listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//触摸时操作
Toast.makeText(TouchListViewActivity.this,"你触摸了屏幕",Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_MOVE:
//移动时操作
Toast.makeText(TouchListViewActivity.this,"你的手指移动了",Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
//离开时操作
Toast.makeText(TouchListViewActivity.this,"你的手指离开了屏幕",Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});*/
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState){
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
//滑动停止时
Toast.makeText(TouchListViewActivity.this,"滑动停止了",Toast.LENGTH_SHORT).show();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//正在滚动时
Toast.makeText(TouchListViewActivity.this,"正在滚动",Toast.LENGTH_SHORT).show();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
//手指抛动时,即手机用力滑动
//在离开ListView由于惯性继续滑动
Toast.makeText(TouchListViewActivity.this,"手指抛动时",Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直调用
Toast.makeText(TouchListViewActivity.this,"滚动时一直调用",Toast.LENGTH_SHORT).show();
}
});
}
}
二、ListView常用扩展
1、具有弹性的ListView:
只需要继承ListView重写以下方法:
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverScrollY, isTouchEvent);
}
具体代码:
package com.mfc.mylistview;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
* 2017年8月14日00:32:14
* 自定义ListView实现具有弹性的ListView
*/
public class ScrollListView extends ListView {
private int mMaxOverScrollY;
public ScrollListView(Context context) {
super(context);
}
public ScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//重写这个方法,将maxOverScrollY改为自己设置的值mMaxOverScrollY,就可以实现具有弹性的ListView了
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverScrollY, isTouchEvent);
}
public void setmMaxOverScrollY(int mMaxOverScrollY) {
this.mMaxOverScrollY = mMaxOverScrollY;
}
}
需要在activity里面调用setmMaxOverScrollY()设置一个弹性的尺度。
2、自动显示、隐藏布局的ListView:
activity代码:
package com.example.administrator.fourlistview;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.mfc.utils.ViewHolderAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 2017年8月14日00:49:40
* 滑动隐藏和显示Actionbar的ListView
* */
public class HideActionBarListViewActivity extends Activity {
private ListView listView;
private Toolbar toolbar;
private int mTouchSlop;
private float mFirstY;
private float mCurrentY;
private int direction;
private ObjectAnimator mAnimator;
private boolean show = true;
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//触摸时操作
mFirstY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
//移动时操作
mCurrentY = event.getY();
if(mCurrentY - mFirstY > mTouchSlop){
direction = 0; //down
} else if (mFirstY - mCurrentY >mTouchSlop){
direction = 1; //up
}
if (direction == 1){
if (show){
toolbarAnim(1); //隐藏
show = !show;
}
}else if (direction == 0){
if (!show) {
toolbarAnim(0);//显示
show = !show;
}
}
break;
case MotionEvent.ACTION_UP:
//离开时操作
break;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hideactionbarlistview);
listView = (ListView) findViewById(R.id.listView);
toolbar = (Toolbar) findViewById(R.id.toolbar);
//获取系统认为的最低滑动距离,即超过这个滑动距离,系统就将其定义为滑动状态了
mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
List<String> list = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
list.add("测试数据"+i);
}
View header = new View(HideActionBarListViewActivity.this);
header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,60));
listView.addHeaderView(header);
listView.setAdapter(new ArrayAdapter<String>(HideActionBarListViewActivity.this,android.R.layout.simple_expandable_list_item_1,list));
listView.setOnTouchListener(onTouchListener);
}
private void toolbarAnim(int flag) {
if (mAnimator != null && mAnimator.isRunning()) {
mAnimator.cancel();
}
if (flag == 0){
mAnimator = ObjectAnimator.ofFloat(toolbar,"translationY",toolbar.getTranslationY(),0);
}else{
mAnimator = ObjectAnimator.ofFloat(toolbar,"translationY",toolbar.getTranslationY(),-toolbar.getHeight());
}
mAnimator.start();
}
}
xml:
<?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="60dp"
app:title="标题"
android:background="@android:color/holo_blue_light" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:headerDividersEnabled="false" />
</LinearLayout>
效果图:
3、qq聊天的ListView:
其实还是在BaseAdapter中操作,判断是对方的消息还是自己的 消息,加载两个类似的xml。
代码:
两个布局文件:
<?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:gravity="right"
android:padding="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/text_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:background="@drawable/otherbg"
android:textSize="20sp"/>
<ImageView
android:id="@+id/icon_other"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/other"/>
</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="match_parent"
android:gravity="center_vertical"
android:padding="10dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon_mine"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/mine"/>
<TextView
android:id="@+id/text_mine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:background="@drawable/minebg"
android:textSize="20sp"/>
</LinearLayout>
实体类,方便设置消息以及图片和判断是对方的消息还是自己的:
package com.mfc.entity;
import android.graphics.Bitmap;
/**
* Created by Administrator on 2017/8/14.
* 聊天状态信息的实体类
*/
public class ChatItemListViewBean {
private int type;
private String text;
private Bitmap icon;
public ChatItemListViewBean(int type, String text, Bitmap icon) {
this.type = type;
this.text = text;
this.icon = icon;
}
public ChatItemListViewBean() {
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Bitmap getIcon() {
return icon;
}
public void setIcon(Bitmap icon) {
this.icon = icon;
}
}
适配器:
package com.mfc.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.administrator.fourlistview.R;
import com.mfc.entity.ChatItemListViewBean;
import java.util.List;
/**
* Created by Administrator on 2017/8/14.
* 实现qq聊天界面的适配器
*/
public class QQListViewAdapter extends BaseAdapter {
private List<ChatItemListViewBean> mData;
private LayoutInflater inflater;
public QQListViewAdapter(Context context,List<ChatItemListViewBean> mData) {
this.mData = mData;
inflater = LayoutInflater.from(context);
}
@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) {
ViewHolder viewHolder = null;
if (convertView == null){
if (getItemViewType(position) == 0){
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.qqlistview_item1,null);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_other);
viewHolder.text = (TextView) convertView.findViewById(R.id.text_other);
}else{
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.qqlistview_item2,null);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_mine);
viewHolder.text = (TextView) convertView.findViewById(R.id.text_mine);
}
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.icon.setImageBitmap(mData.get(position).getIcon());
viewHolder.text.setText(mData.get(position).getText());
return convertView;
}
@Override
public int getItemViewType(int position) {
ChatItemListViewBean chatItemListViewBean = mData.get(position);
return chatItemListViewBean.getType();
}
@Override
public int getViewTypeCount() {
return 2;
}
public final class ViewHolder{
public ImageView icon;
public TextView text;
}
}
activity:
package com.example.administrator.fourlistview;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.mfc.entity.ChatItemListViewBean;
import com.mfc.utils.QQListViewAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 2017年8月14日09:39:22
* 模拟qq聊天界面
* */
public class QQListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qqlistview);
listView = (ListView) findViewById(R.id.listView);
ChatItemListViewBean bean1 = new ChatItemListViewBean();
bean1.setType(0);
bean1.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.mine));
bean1.setText("哈喽,你好吗?");
ChatItemListViewBean bean2 = new ChatItemListViewBean();
bean2.setType(1);
bean2.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.other));
bean2.setText("挺好的,谢谢");
ChatItemListViewBean bean3 = new ChatItemListViewBean();
bean3.setType(0);
bean3.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.mine));
bean3.setText("最近在干嘛?");
ChatItemListViewBean bean4 = new ChatItemListViewBean();
bean4.setType(1);
bean4.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.other));
bean4.setText("工作呢!");
ChatItemListViewBean bean5 = new ChatItemListViewBean();
bean5.setType(0);
bean5.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.mine));
bean5.setText("工作顺心吧");
ChatItemListViewBean bean6 = new ChatItemListViewBean();
bean6.setType(1);
bean6.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.other));
bean6.setText("挺好的");
ChatItemListViewBean bean7 = new ChatItemListViewBean();
bean7.setType(1);
bean7.setIcon(BitmapFactory.decodeResource(getResources(),R.drawable.other));
bean7.setText("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
List<ChatItemListViewBean> list = new ArrayList<ChatItemListViewBean>();
list.add(bean1);
list.add(bean2);
list.add(bean3);
list.add(bean4);
list.add(bean5);
list.add(bean6);
list.add(bean7);
listView.setAdapter(new QQListViewAdapter(QQListViewActivity.this,list));
}
}
qqlistview.xml:
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@null"
android:listSelector="@android:color/transparent"></ListView>
效果图:
4、动态改变ListView布局:
适配器:
package com.mfc.utils;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.administrator.fourlistview.R;
import com.mfc.entity.ChatItemListViewBean;
import java.util.List;
/**
* Created by Administrator on 2017/8/14.
*/
public class ReplacetemAdapter extends BaseAdapter {
private List<String> mData;
private Context context;
private int currentItem = 0;
public ReplacetemAdapter(Context context, List<String> mData) {
this.context = context;
this.mData = mData;
}
@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) {
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
if(currentItem == position){
linearLayout.addView(addFocusView(position));
}else{
linearLayout.addView(addNormalView(position));
}
return linearLayout;
}
private View addFocusView(int i){
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.ic_launcher);
return imageView;
}
private View addNormalView(int i){
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.other);
linearLayout.addView(imageView,new LinearLayout.LayoutParams(50,50));
TextView textView = new TextView(context);
textView.setText(mData.get(i));
linearLayout.addView(textView,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
linearLayout.setGravity(Gravity.CENTER);
return linearLayout;
}
public void setCurrentItem(int currentItem) {
this.currentItem = currentItem;
}
}
activity:
package com.example.administrator.fourlistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.mfc.utils.ReplacetemAdapter;
import java.util.ArrayList;
import java.util.List;
public class ReplaceItemListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qqfriends_list);
ListView listView = (ListView) findViewById(R.id.listView);
List<String> data = new ArrayList<String>();
data.add("I am item 1");
data.add("I am item 2");
data.add("I am item 3");
data.add("I am item 4");
data.add("I am item 5");
final ReplacetemAdapter adapter = new ReplacetemAdapter(this, data);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.setCurrentItem(position);
adapter.notifyDataSetChanged();
}
});
}
}
效果图:
源码下载:http://download.youkuaiyun.com/download/fancheng614/9932633