ListView 使 textview 在超出屏幕可见性时可见

Posted

技术标签:

【中文标题】ListView 使 textview 在超出屏幕可见性时可见【英文标题】:ListView making textview visible on going out of screen visibility 【发布时间】:2014-09-25 00:19:35 【问题描述】:

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

另一个问题是我有 2 个按钮可以隐藏和显示哪些不在列表视图中。我想用它们来隐藏或显示列表视图中存在的所有文本视图(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;
        

    

Activity Main.xml:

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

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

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

    <ListView
        android:id="@+id/listView1"
        android:layout_
        android:layout_
        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_
    android:layout_
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

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

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

</LinearLayout>

这是我的问题的截图:

这是我运行项目时的初始状态:

现在我已经通过 show/hide details 按钮在列表视图中单击隐藏了 aa 和 bb 的 TV2:

这是向下滚动的部分:

当我滚动回顶部时,分别对应于 aa 和 bb 的 textviews(TV2) 再次可见,而之前给出的是 GONE。

【问题讨论】:

【参考方案1】:

您的适配器不知道视图是可见的还是不可见的,因为该行在离开屏幕时被破坏,并在再次进入屏幕时重新创建。我建议你像这样创建一个新的容器类:

public class MyContainer 

    public boolean visible = true;
    public String text;

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

然后向适配器传递 MyContainer 实例的 ArrayList 并重写您的 getView() 以根据来自 MyContainer 实例的布尔值 visible 和基于字符串 text 的 TextView 的文本设置可见性。

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

这样适配器会记住哪个视图是可见的。

注意

为适配器全局声明一个数组列表不是一个好习惯,而是在构造函数中传递一个数组列表。

【讨论】:

【参考方案2】:

你可以试试:

全局声明一个TextView数组,

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

然后在 onCreate 方法中使用您的“详细信息”TextView 初始化此数组。

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

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

【讨论】:

以上是关于ListView 使 textview 在超出屏幕可见性时可见的主要内容,如果未能解决你的问题,请参考以下文章

如何调整textview的大小以不超出屏幕

如何使最后一个页脚固定(ListView)

如何同时使navigationdrawer选框的listview中的所有textView?

单击时如何使 TextView 闪烁其背景?

为 ListView 的每一行添加一个按钮和一个 TextView

在 ListView 适配器的 getView(...) 中更改 TextView 颜色和文本