ListView之ViewHolder&下拉加载&item点击保存状态

在main_activity.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="www.zhang.com.listviewdemo.MainActivity">

    <ListView
        android:id="@+id/main_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />
</RelativeLayout>

在MainActivity中代码

public class MainActivity extends Activity {

    private ListView mListView;
    private MyAdapter adapter;
    private List<News> mData = new ArrayList();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        initListener();
        initData();


    }

    private void initView() {

        mListView = (ListView) findViewById(R.id.main_lv);

    }

    private void initListener() {
        if (adapter == null && mData != null) {
            adapter = new MyAdapter(this, mData);
        }

        mListView.setAdapter(adapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //点击后将bean对象isClick属性改为true
                mData.get(position).setIsClick(true);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);

            }
        });

        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                int lastVisiblePosition = mListView.getLastVisiblePosition();

                if (lastVisiblePosition == mData.size()-1) {
                    for (int i = 0; i < 10; i++) {
                        mData.add(new News("http://p4.so.qhimg.com/t01415e897b7f352944.jpg", "下拉刷新加载", i % 3, false));
                    }
                    adapter.notifyDataSetChanged();
                }
            }

        //这个方会在界面刚开始显示的时候调用一次(尽量不要用)
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

    }

    private void initData() {

        for (int i = 0; i < 10; i++) {
            mData.add(new News("http://imgapp.yeyou.com/app/uploads/images/game/2014/07/14062798208660.jpg",
                    "秦时明月", i % 3,false));
        }

        if (adapter != null) {
            adapter.notifyDataSetChanged();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        adapter.notifyDataSetChanged();
    }
}

在MyAdapter.java文件中,代码如下:

public class MyAdapter extends BaseAdapter {

    private List<News> mData;
    private Context mContext;

    private final int NO_IMAGE = 0;
    private final int IMAGE_LEFT = 1;
    private final int IMAGE_RIGHT = 2;

    private boolean isClick = false;
    public int clickPosition=-1;



    public MyAdapter(Context c, List<News> data) {
        mContext = c;
        mData = data;
    }

    /**
     * 获取item的类型--一般在bean对象中不会直接给出item的类型,但一定会给出标记值,做if判断
     */
    @Override
    public int getItemViewType(int position) {

        return getItem(position).getType_item();
    }

    /**
     * 获取View的item类型的数量
     */
    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getCount() {
        if (mData != null) {
            return mData.size();
        } else {
            return 0;
        }
    }

    @Override
    public News 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) {

        View view = null;

        ViewHolder holder;

        if (convertView == null) {

            holder = new ViewHolder();

            view = View.inflate(mContext, R.layout.lv_item, null);
            holder.iv_left = (ImageView) view.findViewById(R.id.lv_left_image);
            holder.iv_right = (ImageView) view.findViewById(R.id.lv_right_image);
            holder.tv = (TextView) view.findViewById(R.id.lv_title);

            view.setTag(holder);

        } else {

            view = convertView;

            holder = (ViewHolder) view.getTag();
        }
        News news = mData.get(position);

        switch (getItemViewType(position)) {
            case NO_IMAGE:

                break;
            case IMAGE_LEFT:
                holder.iv_left.setVisibility(View.VISIBLE);
                //这里使用了Glide图片加载框架
                Glide.with(mContext).load(news.getImageUrl()).error(R.drawable.ic_launcher).diskCacheStrategy(DiskCacheStrategy.ALL).into(holder.iv_left);
                break;
            case IMAGE_RIGHT:
                holder.iv_right.setVisibility(View.VISIBLE);
                Glide.with(mContext).load(news.getImageUrl()).error(R.drawable.ic_launcher).diskCacheStrategy(DiskCacheStrategy.ALL).into(holder.iv_right);
                break;
        }

        holder.tv.setText(news.getTitle());

        //判断点击已否,设置不同颜色
        if (news.isClick()){
            holder.tv.setTextColor(Color.RED);
        }else {
            //这行代码不能省略(省略会导致复用View是保留设置字体颜色的属性,这里需要根据判断值重新设置回来)
            holder.tv.setTextColor(Color.BLACK);
        }

        return view;
    }


    private static class ViewHolder {
        ImageView iv_left, iv_right;
        TextView tv;
    }
}

这是News.class的Bean对象代码:

public class News {

    private String imageUrl;
    private int type_item;//判断多条目的类型
    private String mTitle;
    private boolean isClick;//判断条目是否被点击

    public News(String url, String title, int type, boolean b) {
        type_item = type;
        imageUrl = url;
        mTitle = title;
        isClick = b;

    }
......setter,getter方法省略
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值