在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方法省略