有啥方法可以在 listView 中获取特定视图?

Posted

技术标签:

【中文标题】有啥方法可以在 listView 中获取特定视图?【英文标题】:Is there any way to get a specific view in the listView?有什么方法可以在 listView 中获取特定视图? 【发布时间】:2020-05-11 13:39:22 【问题描述】:

我只是想用一个简单的 listView 制作一个基本的应用程序,如果我们单击此视图的项目,它会消失,并且在视图中的所有项目都处于不可见位置之后,我们应该让所有项目恢复可见。

我已经编写了一个代码来在单击时消失项目,但在将这些项目反转回可见时卡住了,因为 我没有找到在 listView 中获取特定项目的方法进行设置使用循环可见的每个视图 ---

我的活动主 XML 文件 --

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/myListView"
        android:layout_
        android:layout_ />
</androidx.constraintlayout.widget.ConstraintLayout>

我的主要活动 java 文件 ---

package com.example.listviewdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Timer;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ListView myListView = findViewById(R.id.myListView);

        ArrayList<String> members = new ArrayList<String>();

        members.add("Iron Man");
        members.add("Captain America");
        members.add("Thor");
        members.add("Hulk");
        members.add("Captain Marvel");

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, members);

        myListView.setAdapter(arrayAdapter);

        final int[] actionPosition = 4, 4, 4, 4, 4;

        final int[] actualPosition = 0, 0, 0, 0, 0;

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 



            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) 
                view.setVisibility(View.INVISIBLE);

                int visibility = view.getVisibility();
                int viewItem = adapterView.getPositionForView(view);

                Log.i("Visibility", ""+ visibility +" of item "+ viewItem);

                actualPosition[viewItem] = visibility;

                Log.i("actualPositionArray", Arrays.toString(actualPosition));




                if (Arrays.equals(actionPosition, actualPosition)) 

                    Toast.makeText(MainActivity.this, "matched!", Toast.LENGTH_SHORT).show();

                    for (int index = 0; index<actionPosition.length; index++)

                        try 
                            TimeUnit.SECONDS.sleep(1);
                         catch (Exception e) 
                            e.printStackTrace();
                        

                        View counter = (View) myListView.getChildAt(index);

                        counter.setVisibility(View.VISIBLE);

                    

                    // reverting actualPosition array!--

                    for (int ind = 0; ind<actualPosition.length; ind++) 

                        actualPosition[ind] = 0;

                    

                

            
        );

    

简而言之,我试图在 listView 中获取特定视图以使其可见,这就是我所需要的!

请帮忙!

【问题讨论】:

【参考方案1】:

我希望这是您正在寻找的解决方案。

您需要的是getChildAt 方法。

因此,请尝试使用下面的代码 sn-p 更改单击侦听器中的 if 语句。

if (Arrays.equals(actionPosition, actualPosition)) 

    Toast.makeText(MainActivity.this, "matched!", Toast.LENGTH_SHORT).show();
    for (int index = 0; index<actionPosition.length; index++)
         // use the getChildAt(index) to get the views in a ListView
         View counter = (View) myListView.getChildAt(index);
         counter.setVisibility(View.VISIBLE);
    


此外,如果您希望重复执行该操作,请考虑重置 actualPosition 数组。

编辑

在 cmets 部分中,您要求修改动画,以便每个视图以 1 秒的延迟出现。将for 循环更改为以下循环,并在您的Activity 类中添加helperFunction

 for (int index = 0; index<actionPosition.length; index++)
                        helperFunction(index);
                    
private void helperFunction(final int index)
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() 
            @Override
            public void run() 
                View counter = (View) myListView.getChildAt(index);
                counter.setVisibility(View.VISIBLE);
            
        , (index * 1000) + 1000);
    

【讨论】:

谢谢,我已经在代码中注释了用于重置actualPosition 数组的循环! 嘿,我更新了我的代码,并在循环中添加了 1 秒的时间睡眠,我让视图可见,以便它获得 1 的平滑过渡在这之间等待第二秒,但是 它的行为就像所有视图在 5 秒(时间总和)同时返回到可见位置我希望它来以适当的方式返回可见,例如在使下一个视图可见之前等待 1 秒,请帮助!

以上是关于有啥方法可以在 listView 中获取特定视图?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以知道哪个集合视图单元位于特定点?

如何在android中获取特定列表视图项目的ID?

有啥既定的方法可以在 JS 中获取页面视图的 kwargs 吗?

有啥方法可以滚动到 Flutter 列表视图中的某个位置

有啥方法可以在不使用访问令牌/客户端 ID 的情况下获取特定主题标签的 Instagram 图像?

如何从QML中的GridView或ListView获取实例化的委托组件