listview条目点击可展开(初级)

本文介绍了如何在Android中实现ListView的条目点击后展开内容的功能。通过监听ListView的点击事件,记录点击位置,并在Bean对象中设置标记来控制Item布局的显示与隐藏。在Adapter中根据Bean的标记状态决定内容是否显示,提供了一种简单实现此功能的方法。

先是项目中经常用到点击listview,然后展开Item的内容。我将这种需求分为两种:

  • Item的内容是一个布局(不是listview)
  • Item的内容是一个listview(或者listview类似能够滑动的控件

今天先介绍一下listview的Item内容是一个布局,第二种后期我在写文章介绍。好了,进入正题。先看下我的思路:我们可以监听一下listview的点击事件,然后记录下position,然后在该数据的Bean中设置一个flug(1:展开?2:不展开),然后刷新adapter。在adapter中,我们根据Bean中的flug,判断Item的布局是否显示。

接下来这个例子是这样的:有一个Person对象,有name,age属性,点击name,显示age,然后再点击name,age不显示。

不多说,先附上效果图。
这里写图片描述
直接上代码。

首先是XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/one_click_listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>
</LinearLayout>

这是listview Item 的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/text_one_name"
        android:layout_width="match_parent"
        android:layout_height="30dp" />
    <TextView
        android:id="@+id/text_one_age"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
</LinearLayout>

这是Bean对象:

class  Person{
    private String name;
    private  String age;
    private  String flug;

    public String getFlug() {
        return flug;
    }

    public void setFlug(String flug) {
        this.flug = flug;
    }

    public Person(){}

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

上面的Bean对象里的flug也就是标记,在adapter中需要该字段的。1:显示 2:不显示

下面是adapter:

class OneClickAdapter  extends BaseAdapter{

    private  List<Person> personList;
    public OneClickAdapter(){}

    public List<Person> getPersonList() {
        return personList;
    }

    public void setPersonList(List<Person> personList) {
        this.personList = personList;
    }

    public OneClickAdapter(List<Person> personList) {
        this.personList = personList;
    }

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

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final MyViewHoder myViewHoder;
        if(convertView == null){
            convertView = View.inflate(parent.getContext(), R.layout.one_click_item, null);
            myViewHoder = new MyViewHoder();
            myViewHoder.text_name = (TextView)convertView.findViewById(R.id.text_one_name);
            myViewHoder.text_age = (TextView)convertView.findViewById(R.id.text_one_age);
            convertView.setTag(myViewHoder);
        }else{
            myViewHoder = (MyViewHoder)convertView.getTag();
        }
        if("1".equals(personList.get(position).getFlug())){
            myViewHoder.text_age.setVisibility(View.VISIBLE);
            myViewHoder.text_age.setText(personList.get(position).getAge());
        }else{
            myViewHoder.text_age.setVisibility(View.GONE);
            myViewHoder.text_age.setText(personList.get(position).getAge());
        }
        myViewHoder.text_name.setText(personList.get(position).getName());
//        myViewHoder.text_name.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                personList.get(position).setFlug("1");
//            }
//        });
        return convertView;
    }
    class MyViewHoder{
        public TextView text_name;
        public TextView text_age;
    }
}

接下来是重点:

private void setListener() {
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if( list.get(position).getFlug() == null || list.get(position).getFlug().equals("2")){
                    list.get(position).setFlug("1");
                }else{
                    list.get(position).setFlug("2");
                }
                adapter.notifyDataSetChanged();
            }
        });
    }

上述代码是给listview设置一个监听,维护Bean中的flug字段;每一个点击更新listview之后,都更新adapter。

好了,大功告成!是不是不难呢?! 后期我再把可折叠的listview的写一下。也就是网上的expandablelistview。不过自定义listview而已。对了,文章如果有错误,记得指正…….! Thank you!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值