ListView在走出屏幕可见性时可以看到textview

时间:2014-08-01 18:15:35

标签: java android listview visibility

我有一个列表视图,其中包含具有2个文本视图(TV1和TV2)和1个按钮的自定义布局。该按钮用于将textview(TV2)的可见性设置为VISIBLE或GONE。按钮工作正常。但是问题是假设如果我滚动列表视图,那么离开屏幕的文本视图(TV2)再次将文本显示为可见,即使它是之前通过按钮点击已经GONE。我想在listview的scoll上保留状态。也就是说,如果状态为GONE,它在滚动时应该保持相同。

另一个问题是我有2个按钮来隐藏和显示哪些不在listview中。我想用它们隐藏或显示列表视图中的所有文本视图(TV2)。也就是说,当我点击全部隐藏按钮时,所有TV2的可见性应为GONE,并且在Show All按钮上相同。

这是我的代码:

MainActivity.java

public class MainActivity extends Activity {
    Button show, hide;
    ListView lv;
    ArrayList<String> al1;
    MyAdapter ma;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show=(Button) findViewById(R.id.button1);
        hide=(Button) findViewById(R.id.button2);
        lv=(ListView) findViewById(R.id.listView1);
        al1=new ArrayList<String>();
        al1.add("aa");
        al1.add("bb");
        al1.add("cc");
        al1.add("dd");
        al1.add("ee");
        al1.add("ff");
        al1.add("gg");
        al1.add("hh");
        al1.add("ii");
        al1.add("jj");
        al1.add("kk");
        al1.add("ll");
        al1.add("mm");
        al1.add("nn");
        al1.add("oo");

        ma=new MyAdapter();

        lv.setAdapter(ma);

        show.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });

        hide.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });


    }

    class MyAdapter extends BaseAdapter
    {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return al1.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return al1.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            LinearLayout ll=(LinearLayout) getLayoutInflater().inflate(R.layout.custom,parent,false);
            TextView tv1=(TextView) ll.findViewById(R.id.textView1);
            Button b=(Button) ll.findViewById(R.id.get_details);
            TextView tv2=(TextView) findViewById(R.id.textView2);

            tv1.setText(al1.get(position));
            b.setTag(position);

            b.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    int pos=(Integer) v.getTag();
                    LinearLayout linear=(LinearLayout) v.getParent();
                    TextView details=(TextView) linear.findViewById(R.id.textView2);
                    if(details.getVisibility()==View.GONE)
                    {
                        details.setVisibility(View.VISIBLE);
                    }
                    else
                    {
                        details.setVisibility(View.GONE);
                    }

                }
            });

            return ll;
        }

    }
}

活动Main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Show All Details" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Hide all details" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/button1" >

    </ListView>

</RelativeLayout>

Custom.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"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Button
        android:id="@+id/get_details"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show/Hide Details"
        android:textSize="12sp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="No details available right now"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

以下是我的问题的屏幕截图:

这是我运行项目时的初始状态: enter image description here

现在我通过显示/隐藏详细信息按钮点击内部列表视图隐藏了TV2 for aa和bb: enter image description here

这是向下滚动的部分: enter image description here

当我滚动回到顶部时,对应于aa和bb的textviews(TV2)再次可见,而它早先被给予了GONE。 enter image description here

2 个答案:

答案 0 :(得分:0)

如果视图是可见的或不可见的,那么你的适配器就没有线索,因为当它离开屏幕时会被销毁,并且当它再次进入屏幕时会重新创建。我建议你创建一个像这样的新容器类:

public class MyContainer {

    public boolean visible = true;
    public String text;

    public MyContainer(String text) {
         this.text = text;
    }
}

然后将适配器传递给MyContainer实例的ArrayList,并重写getView()以根据MyContainer实例中的布尔visible和基于字符串{{1的TextView的文本 - 设置可见性。 }}。

要设置View的可见性,请创建一个方法text,更改给定索引的MyContainers数组列表中的布尔值(调用setvisible(int index)以重绘litview。

这样适配器就会记住可见的视图。

注意

为适配器全局声明一个arraylist是不好的做法,而是在构造函数中传递一个araylist。

答案 1 :(得分:0)

你可以试试的东西:

全局声明TextView数组

Button show, hide;
ListView lv;
ArrayList<String> al1;
MyAdapter ma;
TextView[] tva;

然后使用onCreate方法中的'详细信息'TextViews初始化此数组。

然后在onclicklister中更改这些全局实例的可见性。

实例仅存在于按钮的onClicklistener方法范围内的事实可能是它们的效果不持久的原因?