ListView使用技巧

本文详细介绍ListView的优化技巧,包括ViewHolder模式、属性优化及动态更新;并扩展介绍了多种ListView的应用场景,如具有弹性的ListView、自动隐藏布局的ListView、模拟QQ聊天界面及动态改变布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值