有啥方法可以在 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 中获取特定视图?的主要内容,如果未能解决你的问题,请参考以下文章
有啥既定的方法可以在 JS 中获取页面视图的 kwargs 吗?