单击android

时间:2017-12-28 09:40:22

标签: android listview textview

我正在开发Android应用程序,其中我想向用户显示一些优惠券,为此我使用自定义ListView并为其设置自定义布局。在自定义布局中,我想在点击时展开并折叠相对布局textview,下面是我的代码:

Coupon_Layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<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_marginStart="20dp"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="20dp"
    android:background="@drawable/dash_rectangular_background"
    android:padding="15dp"
    android:text="FIRST10"
    android:textColor="@color/input_login"
    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:textColor="@color/input_login"
    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:textColor="@color/input_login"
    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:textSize="16sp"
    android:textColor="@color/bg_main"
    android:textAllCaps="false"/>

<RelativeLayout
    android:id="@+id/details_layout"
    android:layout_width="wrap_content"
    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"
        android:src="@drawable/ic_dot_bullet" />

    <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>

<View
    android:id="@+id/v_seprator_coupon_2"
    style="@style/Divider_History"
    android:layout_below="@+id/details_layout"
    android:layout_alignParentStart="true"
    android:layout_marginTop="15dp" />
</RelativeLayout>

Coupon_Adapter.java

public class Coupon_Adapter extends BaseAdapter{

private Activity activity;
private LayoutInflater inflater;
private List<Coupon_List> couponList;
private TextView coupon_description,coupon_percentage,coupon_code,details,limitations;
private Coupon_List coupon_list;
private RelativeLayout details_layout;
private boolean isexpand = false;

public Coupon_Adapter(Activity activity, List<Coupon_List> couponList) {
    this.activity = activity;
    this.couponList = couponList;
}

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

@Override
public Object getItem(int i) {
    return couponList.get(i);
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if(inflater == null){
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    if(view == null){
        view = inflater.inflate(R.layout.coupon_layout,null);
    }
    coupon_code = view.findViewById(R.id.coupon_code);
    coupon_description =view.findViewById(R.id.coupon_details);
    coupon_percentage = view.findViewById(R.id.coupon_percentage);
    limitations = view.findViewById(R.id.tv_limitation);
    details = view.findViewById(R.id.tv_details);
    details_layout = view.findViewById(R.id.details_layout);

    collapse(details_layout);

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

            }else {
                collapse(details_layout);

            }
        }
    });

    coupon_list = couponList.get(i);
    coupon_code.setText(coupon_list.getCoupon_code());
    Log.d("coupon list",coupon_list.getCoupon_code());
    coupon_percentage.setText(coupon_list.getCoupon_percentage());
   // Log.d("coupon list",coupon_list.getCoupon_description());
    coupon_description.setText(coupon_list.getCoupon_detail_info());
    Log.d("coupon list",coupon_list.getCoupon_limitation());
    limitations.setText(coupon_list.getCoupon_detail_info());

    return view;
}

public void expand(final View v) {
    v.measure(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    final int targetHeight = v.getMeasuredHeight();

    // Older versions of android (pre API 21) cancel animations for views with a height of 0.
    v.getLayoutParams().height = 1;
    v.setVisibility(View.VISIBLE);
    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            v.getLayoutParams().height = interpolatedTime == 1
                    ? RelativeLayout.LayoutParams.WRAP_CONTENT
                    : (int)(targetHeight * interpolatedTime);
            v.requestLayout();
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
    isexpand = true;
}

public void collapse(final View v) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 1){
                v.setVisibility(View.GONE);
            }else{
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
    isexpand = false;
}
}

我使用该方法展开和折叠视图,并在其他活动中工作,我调试代码,当我点击textview进入setOnClickListener但未展开或我的观点崩溃了。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

改变太多了。将您的drawable和颜色添加到文本中,因为我在测试时删除了它们,这里我修改了你的代码和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>

在适配器类中进行更改 Coupon_Adapter

//在适配器类的构造函数中添加此行。

inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

更改你的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和适配器的一些概念。适配器如何工作。