使用自定义ListView时的SetVisibility

时间:2015-10-16 14:11:31

标签: android

我已经制作了一个列表视图。 列表视图正常工作。 但是视图列表项是一个xml文件。 其中包含一个imagView和一个图层。 我希望当用户点击要显示的图层ImagView时。 问题是,当用户点击ImagView时 显示项目图层3和13(两次)。 我不知道问题是什么? 有人帮忙吗?

custom_item.xml

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

<ImagView
    android:id="@+id/imagView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#0f0" />


   <LinearLayout
    android:id="@+id/linear"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#00f" />

</LinearLayout>

的.java

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder Holder;

    if (convertView == null) {
        Holder = new ViewHolder();
        convertView = myInflater.inflate(R.layout.cystom_item, null);

        Holder.my_image= (ImageView) convertView.findViewById(R.id.imagView);

        Holder.linear = (LinearLayout) convertView.findViewById(R.id.linear2);

    } else
        Holder = (ViewHolder) convertView.getTag();

    Holder.my_image.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            if (lastView == Holder.linear);
            else {

                if (lastView != null)
                    lastView.setVisibility(View.GONE);

                    Holder.linear.startAnimation(anim);
                    Holder.linear.setVisibility(View.VISIBLE);
                    lastView = Holder.linear;
                }
        }
    });

    return convertView;
}

@Override
public Filter getFilter() {
    // TODO Auto-generated method stub
    return null;
}


public class ViewHolder
{

ImageView my_image;
LinearLayout linear;

}

2 个答案:

答案 0 :(得分:0)

您多次连接onClickListener:

Holder.linear1.setOnClickListener(new OnClickListener()...

仅当clickListener是新的Holder而不是循环的Holder时才设置它。

你应该注意到你没有花括号:

else
   Holder = (ViewHolder) convertView.getTag();

所以此行之后的所有内容都在执行。

试试这个:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder Holder;

if (convertView == null) {
    Holder = new ViewHolder();
    convertView = myInflater.inflate(R.layout.cystom_item, null);

    Holder.my_image= (ImageView) convertView.findViewById(R.id.imagView);

    Holder.linear = (LinearLayout) convertView.findViewById(R.id.linear2);

} else
{
    Holder = (ViewHolder) convertView.getTag();
    Holder.my_image.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {

        if (lastView == Holder.linear);
        else {

            if (lastView != null)
                lastView.setVisibility(View.GONE);

                Holder.linear.startAnimation(anim);
                Holder.linear.setVisibility(View.VISIBLE);
                lastView = Holder.linear;
            }
    }
  });
 }

  return convertView;
 }

答案 1 :(得分:0)

实际上,我认为您已经在代码中两次放置了以下if语句,第一次是使用if语句完成的,第二次是在else语句中进行了初始化。我认为这导致listitem视图加倍。

if (lastView == Holder.linear);

您应该尝试以下操作:

{

                if (lastView != null)
                    lastView.setVisibility(View.GONE);

                else {

                    Holder.linear.startAnimation(anim);
                    Holder.linear.setVisibility(View.VISIBLE);
                    lastView = Holder.linear;
                }
            }

代替此:

{

                if (lastView == Holder.linear);
                else {

                    if (lastView != null)
                        lastView.setVisibility(View.GONE);

                    Holder.linear.startAnimation(anim);
                    Holder.linear.setVisibility(View.VISIBLE);
                    lastView = Holder.linear;
                }
            }