在android中单击listview适配器时如何展开和折叠视图

在android中单击listview适配器时如何展开和折叠视图,android,listview,textview,Android,Listview,Textview,我正在开发android应用程序,我想向用户展示一些优惠券,为此我使用了自定义列表视图,并为其设置自定义布局。在自定义布局中,我想在单击文本视图时展开和折叠相对布局,下面是我的代码: 优惠券_Layout.xml: 优惠券适配器.java 公共类优惠券\u适配器扩展了BaseAdapter{ 私人活动; 私人充气机; 私有列表耦合列表; 私有文本查看优惠券描述、优惠券百分比、优惠券代码、详细信息、限制; 私人优惠券列表优惠券列表; 私人关系详细信息\u布局; 私有布尔值isexpand=fa

我正在开发android应用程序,我想向用户展示一些优惠券,为此我使用了自定义
列表视图
,并为其设置自定义布局。在自定义布局中,我想在单击
文本视图
时展开和折叠相对布局,下面是我的代码:

优惠券_Layout.xml:


优惠券适配器.java

公共类优惠券\u适配器扩展了BaseAdapter{
私人活动;
私人充气机;
私有列表耦合列表;
私有文本查看优惠券描述、优惠券百分比、优惠券代码、详细信息、限制;
私人优惠券列表优惠券列表;
私人关系详细信息\u布局;
私有布尔值isexpand=false;
公共优惠券适配器(活动、列表耦合列表){
这个。活动=活动;
this.couponList=couponList;
}
@凌驾
public int getCount(){
返回couponList.size();
}
@凌驾
公共对象getItem(int i){
返回couponList.get(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
如果(充气器==null){
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
如果(视图==null){
视图=充气机。充气(右布局。优惠券布局,空);
}
优惠券代码=view.findViewById(R.id.优惠券代码);
优惠券描述=view.findViewById(R.id.优惠券详细信息);
息票百分比=view.findViewById(R.id.息票百分比);
限制=view.findviewbyd(R.id.tv\u限制);
详细信息=view.findviewbyd(R.id.tv\u详细信息);
details\u layout=view.findviewbyd(R.id.details\u layout);
折叠(细节和布局);
details.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(!isexpand){
Log.d(“texview onclick listner”,“true”);
展开(详细信息和布局);
}否则{
折叠(细节和布局);
}
}
});
优惠券列表=couponList.get(i);
优惠券代码.setText(优惠券列表.get优惠券代码());
Log.d(“优惠券列表”,优惠券列表.get优惠券代码());
优惠券百分比.setText(优惠券列表.get优惠券百分比());
//Log.d(“优惠券列表”,优惠券列表.get优惠券描述());
优惠券\说明.setText(优惠券\列表.get优惠券\详细信息\信息());
Log.d(“优惠券列表”,优惠券列表.get优惠券限制());
限制.setText(优惠券列表.get优惠券详情信息());
返回视图;
}
公共空间展开(最终视图v){
v、 度量(RelativeLayout.LayoutParams.MATCH_父项,RelativeLayout.LayoutParams.WRAP_内容);
最终int targetHeight=v.getMeasuredHeight();
//旧版本的android(API 21之前)取消高度为0的视图的动画。
v、 getLayoutParams().height=1;
v、 设置可见性(View.VISIBLE);
动画a=新动画()
{
@凌驾
受保护的无效应用转换(浮点插值时间,转换t){
v、 getLayoutParams().height=InterpolateTime==1
?RelativeLayout.LayoutParams.WRAP_内容
:(int)(targetLight*插值时间);
v、 requestLayout();
}
@凌驾
公共布尔值willChangeBounds(){
返回true;
}
};
//1dp/ms
a、 setDuration((int)(targetLight/v.getContext().getResources().getDisplayMetrics().density));
v、 startAnimation(a);
isexpand=true;
}
公共空间塌陷(最终视图v){
最终int initialHeight=v.getMeasuredHeight();
动画a=新动画()
{
@凌驾
受保护的无效应用转换(浮点插值时间,转换t){
如果(插值时间==1){
v、 设置可见性(View.GONE);
}否则{
v、 getLayoutParams().height=initialHeight-(int)(initialHeight*interpolatedTime);
v、 requestLayout();
}
}
@凌驾
公共布尔值willChangeBounds(){
返回true;
}
};
//1dp/ms
a、 setDuration((int)(initialHeight/v.getContext().getResources().getDisplayMetrics().density));
v、 startAnimation(a);
isexpand=false;
}
}

我使用该方法展开和折叠视图,它在其他活动中工作,我调试代码,当我单击
textview
时,它将进入
setOnClickListener
,但不展开或折叠我的视图。请帮我解决这个问题。

有太多的内容需要更改。在文本中添加可绘制和颜色,因为我在测试时删除了它们,这里我修改了您的代码和xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:animateLayoutChanges="true"
    android:animationCache="true"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/coupon_code"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginBottom="20dp"
            android:layout_marginStart="20dp"
            android:layout_marginTop="10dp"
            android:padding="15dp"
            android:text="FIRST10"
            android:textSize="16.5sp" />

        <TextView
            android:id="@+id/coupon_percentage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/coupon_code"
            android:layout_alignBottom="@+id/coupon_code"
            android:layout_marginStart="10dp"
            android:layout_toEndOf="@+id/coupon_code"
            android:maxLines="2"
            android:text="Get 10₹/- off on your 1st ride*."

            android:textSize="16sp" />

        <TextView
            android:id="@+id/coupon_details"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/coupon_code"
            android:layout_below="@+id/coupon_percentage"
            android:layout_marginTop="24dp"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="*Only for new user."
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_details"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/coupon_details"
            android:layout_marginStart="5dp"
            android:layout_toEndOf="@+id/coupon_details"
            android:background="@null"
            android:text="Details"
            android:textAllCaps="false"
            android:textSize="16sp" />

        <RelativeLayout
            android:id="@+id/details_layout"
            android:layout_width="wrap_content"
            android:background="@color/colorAccent"
            android:layout_height="wrap_content"

            android:layout_below="@+id/coupon_details"
            android:layout_marginTop="10dp">

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginStart="16dp"
                android:background="#0000" />

            <TextView
                android:id="@+id/tv_limitation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginStart="19dp"
                android:layout_toEndOf="@+id/imageView2"
                android:text="You can avail this offer on your 1st ride"
                android:textSize="15sp" />

        </RelativeLayout>
    </RelativeLayout>
</LinearLayout>
更改onView并添加代码,我还提供了一种更简单的显示隐藏视图的方法

@Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        final Holder listViewHolder;
        if (view == null) {
            listViewHolder = new Holder();
            view = inflater.inflate(R.layout.coupon_layout,viewGroup,false);

            listViewHolder.coupon_code = view.findViewById(R.id.coupon_code);
            listViewHolder.coupon_description =view.findViewById(R.id.coupon_details);
            listViewHolder.coupon_percentage = view.findViewById(R.id.coupon_percentage);
            listViewHolder.limitations = view.findViewById(R.id.tv_limitation);
            listViewHolder.details = view.findViewById(R.id.tv_details);
            listViewHolder.details_layout = view.findViewById(R.id.details_layout);

            view.setTag(listViewHolder);
        } else {
            listViewHolder = (Holder) view.getTag();
        }

        collapse(listViewHolder.details_layout);

        listViewHolder.coupon_code.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!isexpand) {
                    Log.d("texview onclick listner","true");
                    expand(listViewHolder.details_layout);

                }else {
                    collapse(listViewHolder.details_layout);

                }

                /*if(listViewHolder.details_layout.getVisibility() == View.VISIBLE)
                    listViewHolder.details_layout.setVisibility(View.GONE);
                else listViewHolder.details_layout.setVisibility(View.VISIBLE);*/
            }
        });


        listViewHolder.coupon_code.setText(couponList.get(i));

        return view;
    }
最后在适配器类中创建一个holder类

public class Holder{
        TextView coupon_description,coupon_percentage,coupon_code,details,limitations;
        RelativeLayout details_layout;
    }

阅读listview和adapter的一些概念。适配器是如何工作的。

试试这个,你能解释一下吗,“它在其他活动中工作,我调试代码”@NikhilBorad感谢您的回复,这正是我所寻找的..很高兴帮助您:)@asish我在我的其他活动中使用了扩展和折叠代码来隐藏和显示视图及其工作。为了确保我进入
setOnClickListener
我将日志放入其中,
log
打印在
logcat
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        final Holder listViewHolder;
        if (view == null) {
            listViewHolder = new Holder();
            view = inflater.inflate(R.layout.coupon_layout,viewGroup,false);

            listViewHolder.coupon_code = view.findViewById(R.id.coupon_code);
            listViewHolder.coupon_description =view.findViewById(R.id.coupon_details);
            listViewHolder.coupon_percentage = view.findViewById(R.id.coupon_percentage);
            listViewHolder.limitations = view.findViewById(R.id.tv_limitation);
            listViewHolder.details = view.findViewById(R.id.tv_details);
            listViewHolder.details_layout = view.findViewById(R.id.details_layout);

            view.setTag(listViewHolder);
        } else {
            listViewHolder = (Holder) view.getTag();
        }

        collapse(listViewHolder.details_layout);

        listViewHolder.coupon_code.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!isexpand) {
                    Log.d("texview onclick listner","true");
                    expand(listViewHolder.details_layout);

                }else {
                    collapse(listViewHolder.details_layout);

                }

                /*if(listViewHolder.details_layout.getVisibility() == View.VISIBLE)
                    listViewHolder.details_layout.setVisibility(View.GONE);
                else listViewHolder.details_layout.setVisibility(View.VISIBLE);*/
            }
        });


        listViewHolder.coupon_code.setText(couponList.get(i));

        return view;
    }
public class Holder{
        TextView coupon_description,coupon_percentage,coupon_code,details,limitations;
        RelativeLayout details_layout;
    }