Android--ListView

一:布局文件

<?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:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>

二:创建数据源 并提供user对象

public class User {
private String name;
private int age;
private String sex;
private String address;
private String details;
private String phoneNumber;

public String getName() {
return name;
    }

public void setName(String name) {
this.name = name;
    }

public int getAge() {
return age;
    }

public void setAge(int age) {
this.age = age;
    }

public String getSex() {
return sex;
    }

public void setSex(String sex) {
this.sex = sex;
    }

public String getAddress() {
return address;
    }

public void setAddress(String address) {
this.address = address;
    }

public String getDetails() {
return details;
    }

public void setDetails(String details) {
this.details = details;
    }

public String getPhoneNumber() {
return phoneNumber;
    }

public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
    }
}

三:Activity使用ListView,初始化数据源,设置适配器

public class MainActivity extends AppCompatActivity {
    ListView listView;
    List<User> users;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new UserAdapter(users,MainActivity.this));
    }

private void initData() {
users = new ArrayList<User>();
for (int i = 0; i < 20; i++) {
            User user = new User();
            user.setAddress("地址信息为" + i);
            user.setAge(i);
            user.setDetails("具体信息为" + i);
            user.setName("姓名" + i);
            user.setPhoneNumber("1234567890");
if (i % 2 == 0) {
                user.setSex("男");
            } else {
                user.setSex("女");
            }
users.add(user);
        }
    }
}

四:设置数据源,使用viewHolder来缓存数据

public class UserAdapter extends BaseAdapter {
    List<User> users = new ArrayList<User>();
    Context context;
    LayoutInflater inflater;

public UserAdapter(List<User> users, Context context) {
this.users = users;
this.context = context;
this.inflater = LayoutInflater.from(context);
    }

@Override
public int getCount() {
return users.size();
    }

@Override
public Object getItem(int position) {
return users.get(position);
    }

@Override
public long getItemId(int position) {
return position;
    }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
if (convertView == null) {
            convertView = inflater.inflate(R.layout.listview_item, null);
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.age = (TextView) convertView.findViewById(R.id.age);
            holder.sex = (TextView) convertView.findViewById(R.id.sex);
            holder.address = (TextView) convertView.findViewById(R.id.address);
            holder.details = (TextView) convertView.findViewById(R.id.details);
            holder.phoneNumber = (TextView) convertView.findViewById(R.id.phoneNumber);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        User user = users.get(position);
        holder.name.setText(user.getName());
        holder.age.setText(user.getAge()+"");
        holder.sex.setText(user.getSex());
        holder.address.setText(user.getAddress());
        holder.details.setText(user.getDetails());
        holder.phoneNumber.setText(user.getPhoneNumber());
return convertView;
    }

class ViewHolder {
        TextView name;
        TextView age;
        TextView sex;
        TextView address;
        TextView details;
        TextView phoneNumber;
    }
}

以上:是一个使用完整使用ListView的完整例子;

六:添加针对item的点击事件监听:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取控件数据源        
TextView name = (TextView) view.findViewById(R.id.name);
        Toast.makeText(MainActivity.this, name.getText().toString(), Toast.LENGTH_LONG).show();
//或者item的数据源
        User user = users.get(position);
        Toast.makeText(MainActivity.this, user.getName(), Toast.LENGTH_LONG).show();
    }
});

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(MainActivity.this, "longClick", Toast.LENGTH_LONG).show();
return false;
    }
});

事件监听,都可以操作item数据,比如,可以获取item控件的单一值,也可以或者整个数据源的item的整体值

当设置长按与点击事件时,长按事件执行之后,也会响应点击事件,此刻,只需要把setOnItemLongClickListener()的事件监听,返回为true就可以了!

七:添加头部尾部View

LayoutInflaterinflater;
View headView;
View footVeiw;
addHeadView();
addFootView();
listView.addHeaderView(headView);
listView.setAdapter(new UserAdapter(users, MainActivity.this));
listView.addFooterView(footVeiw);
private void addHeadView() {
headView = inflater.inflate(R.layout.head_view, null);
    TextView tvString = (TextView) headView.findViewById(R.id.tvString);
    tvString.setText("addHeadView");
}

private void addFootView() {
footVeiw = inflater.inflate(R.layout.head_view, null);
    TextView tvString = (TextView) footVeiw.findViewById(R.id.tvString);
    tvString.setText("addFootView");
}

添加的View必须都为View,并且可以对View进行操作,控件响应事件,添加addHeaderView()需要放到设置适配器前面,添加addFooterView()需要放到设置适配器后面,当无法显示添加的头部view时,可以先listView.setAdapter(null);

八:listview多布局
  1)重写 getViewTypeCount() – 该方法返回多少个不同的布局
  2)重写 getItemViewType(int) – 根据position返回相应的Item
  3)根据view item的类型,在getView中创建正确的convertView

final int type_1 = 0;
final int type_2 = 1;
final int type_3 = 2;
@Override
public int getViewTypeCount() {
return 3;
}

@Override
public int getItemViewType(int position) {
int p = position % 3;
if (p == 0) {
return 0;
    } else if (p == 1) {
return 1;
    } else {
return 2;
    }
}
int type = getItemViewType(position);
if (convertView == null) {
switch (type) {
case type_1:
            convertView = inflater.inflate(R.layout.listview_item, parent, false);
break;
case type_2:
            convertView = inflater.inflate(R.layout.listview_item_one, parent, false);
break;
case type_3:
            convertView = inflater.inflate(R.layout.listview_item_two, parent, false);
break;
    }

根据返回的type,加载不同的布局文件形成多布局!

九:ListView不可滑动

public class NoScrollListView extends ListView {
public NoScrollListView(Context context) {
super(context);
    }

public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
    }

public NoScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
    }

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

使用时,要想ListView滑动,则外面加一层ScrollView布局

10:监听ListView的滑动事件

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                Toast.makeText(MainActivity.this, "滑动结束", Toast.LENGTH_LONG).show();
break;

case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                Toast.makeText(MainActivity.this, "滑动中", Toast.LENGTH_LONG).show();
break;

case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                Toast.makeText(MainActivity.this, "完成一段滑动", Toast.LENGTH_LONG).show();
break;

        }
    }

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        Toast.makeText(MainActivity.this, "firstVisibleItem" + firstVisibleItem + "       visibleItemCount" +
                visibleItemCount + "       totalItemCount" + totalItemCount, Toast.LENGTH_LONG).show();

    }
});

监听Listview的滑动事件,注意:当你对listview添加Header或者FooterView的时候,totalItemCount的总数算自动加上所添加的条目,也就是说算一个Item!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值