android - 更改 listView 的可见性

Posted

技术标签:

【中文标题】android - 更改 listView 的可见性【英文标题】:android - change visibility of listView 【发布时间】:2017-07-25 19:34:36 【问题描述】:

我有一个列表视图,其中国家/地区为字符串。

lv = (ListView)findViewById(R.id.listViewCountry);
        ArrayList<String> arrayCountry = new ArrayList<>();
        arrayCountry.addAll(Arrays.asList(getResources().getStringArray(R.array.array_country)));

        adapter = new ArrayAdapter<>(
                MainActivity.this,
                android.R.layout.simple_list_item_1,
                arrayCountry);
        lv.setAdapter(adapter);

我在工具栏上有一个 searchView。

@Override
    public boolean onCreateOptionsMenu(Menu menu) 
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        MenuItem item = menu.findItem(menuSearch);
        SearchView searchView = (SearchView)item.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() 
            @Override
            public boolean onQueryTextSubmit(String query) 
                return false;
            

            @Override
            public boolean onQueryTextChange(String newText) 
                adapter.getFilter().filter(newText);
                return false;
            
        );


        return super.onCreateOptionsMenu(menu);
    

当应用程序启动时,我需要我的 listView GONE 的可见性,当我在工具栏中按搜索时,listView 应该是可见的。

我必须对onOptionsItemSelected 做任何事情吗,

@Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == menuSearch) 
            lv.setVisibility(View.VISIBLE);

            return true;
        

        return super.onOptionsItemSelected(item);
    

但我的代码不起作用...

main.xml...

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menuSearch"
        android:title="Search"
        android:icon="@android:drawable/ic_menu_search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="always">
    </item>
</menu>

【问题讨论】:

在列表视图中设置空文本视图,如果列表为空,它将显示空消息或无消息 我认为你应该把代码让列表视图在onOptionsItemSelected中可见? @nabillondon,是的,我认为这对..但是我所做的没有工作.. @Simon 可能没有调用 onOptionsItemSelected,您的 searchview xml 定义中有 app:showAsAction="always|collapseActionView" 吗? 做到了,但结果为负.. listview 仍然消失了... 【参考方案1】:

setOnSearchClickListener 用作您的SearchView

@Override
public void onCreate() 
     ...
     yourListView.setVisibility(View.GONE); // or use View.INVISIBLE 

...
@Override
public boolean onCreateOptionsMenu(Menu menu) 
     SearchView searchView = (SearchView)item.getActionView();
     searchView.setOnSearchClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            lv.setVisibility(View.VISIBLE);
        
    );

【讨论】:

@Simon 你能解释更多关于not working 的信息吗?我认为它应该工作 @Simon 我仍然不知道为什么会这样。尝试setOnTouchListener 而不是setOnClickListener @Simon 你有演示项目吗?你能分享给我吗?我会尝试检查您的代码 让我们continue this discussion in chat. @Simon 我已经更新了我的答案,它可以在你的演示项目中使用,请检查一下【参考方案2】:

如果您想将视图设置为不可见,您可以尝试:

lv.setVisibility(View.INVISIBLE);

lv.setVisibility(View.GONE);

在您的情况下,您可以在 onCreate 中将 lv 设置为不可见, 并将 listview 设置为在 onQueryTextSubmit 中可见。

  @Override
  public void onCreate() 
     //... others
     lv.setVisibility(View.INVISIBLE);
  


  @Override
  public boolean onQueryTextSubmit(String query) 
       lv.setVisibility(View.VISIBLE);
       return false;
  

设置关闭监听器:

searchView.setOnCloseListener(new SearchView.OnCloseListener() 
            @Override
            public boolean onClose() 
                lv.setVisibility(View.GONE);
                return false;
            
        );

【讨论】:

先生,当我输入单词并按下搜索按钮时,此代码使 listView 可见。但我真正需要的是,当我在工具栏中按下搜索时,listView 应该是可见的。 当我关闭 searchView 时,listView 是可见的......当我关闭 searchVierw 时,我怎样才能让它消失...... @Simon 你的问题解决了吗?如果您需要任何帮助,请告诉我。 您可以考虑存储一个ArrayList,用于存储最近搜索的项目。当用户单击“搜索”时,搜索它 -> 当结果返回时添加到数组列表中。当然,您可以通过检查 arraylist.size() 来限制最近搜索的项目数 当我按下返回按钮时,我需要关闭 searchView...我尝试了很多概念,但似乎不起作用...请帮助我...【参考方案3】:

试试这个 listview.visible = false; 或者您可以更改列表视图属性.. 发现可见并设置为false

【讨论】:

【参考方案4】:

添加:

item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()

    @Override 
    public boolean onMenuItemClick(MenuItem menuItem)  
         Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
         lv.setVisibility(View.VISIBLE); return false;
    
);

在 onCreateOptionsMenu 中

【讨论】:

我无法将 toast 添加到 onClickListner 方法...它显示 `cannot reslove method makeText'... item .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() @Override public boolean onMenuItemClick(MenuItem menuItem) Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show(); lv. setVisibility(View.VISIBLE); return false; );

以上是关于android - 更改 listView 的可见性的主要内容,如果未能解决你的问题,请参考以下文章

如何在listview android中仅更改第二个单元格的背景颜色

根据可见属性更改 ListView 的高度

更改 ListView 中当前顶部可见项的颜色 - Flutter

Android ListView:获取可见项的数据索引

在活动中更改列表视图的按钮可见性

FliCard 和 ListView Android 中一个奇怪的可见性错误