Java 在listview中隐藏和显示列表项不会';我不能正常工作
我使用了Java 在listview中隐藏和显示列表项不会';我不能正常工作,java,android,listview,Java,Android,Listview,我使用了ListView,其中每个项目都有两个TextView和一个ImageView。我只想在用户单击列表项时显示第二个TextView 我的代码 abc.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView
,其中每个项目都有两个TextView
和一个ImageView
。我只想在用户单击列表项时显示第二个TextView
我的代码
abc.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MyAdapter.ViewHolder holder= (MyAdapter.ViewHolder) view.getTag();
if (holder.txtSecond.getVisibility() == View.VISIBLE) {
holder.txtSecond.setVisibility(View.GONE);
holder.image.setRotation(0);
} else {
holder.txtSecond.setVisibility(View.VISIBLE);
holder.image.setRotation(180);
}
}
});
最初,第二个TextView
可见性是View.GONE
问题是,当我单击ListView
中的项目时,第二个TextView
可见。但与此同时,其他一些第二个TextView
s也可见当列表中的项目数最少时,它就起作用了。我试了5个项目
有人能帮我吗。谢谢 您可以将其用作
abc.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
View sec_tv = view.findViewById(R.id.your_second_tv_id);
View image_view = view.findViewById(R.id.your_img_view);
if (sec_tv.getVisibility() == View.VISIBLE) {
sec_tv.setVisibility(View.GONE);
image_view.setRotation(0);
}
else {
sec_tv.setVisibility(View.VISIBLE);
image_view.setRotation(180);
}
}
});
abc.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
View sec_tv=View.findViewById(R.id.your_second_tv_id);
View image\u View=View.findViewById(R.id.your\u img\u视图);
if(sec_tv.getVisibility()==View.VISIBLE){
sec_tv.setVisibility(视图消失);
图像_视图。设置旋转(0);
}
否则{
sec_tv.setVisibility(视图可见);
图像视图。设置旋转(180);
}
}
});
您可以将其用作
abc.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
View sec_tv = view.findViewById(R.id.your_second_tv_id);
View image_view = view.findViewById(R.id.your_img_view);
if (sec_tv.getVisibility() == View.VISIBLE) {
sec_tv.setVisibility(View.GONE);
image_view.setRotation(0);
}
else {
sec_tv.setVisibility(View.VISIBLE);
image_view.setRotation(180);
}
}
});
abc.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
View sec_tv=View.findViewById(R.id.your_second_tv_id);
View image\u View=View.findViewById(R.id.your\u img\u视图);
if(sec_tv.getVisibility()==View.VISIBLE){
sec_tv.setVisibility(视图消失);
图像_视图。设置旋转(0);
}
否则{
sec_tv.setVisibility(视图可见);
图像视图。设置旋转(180);
}
}
});
这种方法是错误的,您应该保存单击的位置并在适配器上调用notifyDataSetChanged()。之后,在getView中添加代码,如果当前位置等于保存的单击位置,该代码将隐藏/显示一些视图,如下所示:
if (position == clickedPosition) {
holder.txtSecond.setVisibility(View.GONE);
holder.image.setRotation(0);
} else {
holder.txtSecond.setVisibility(View.VISIBLE);
holder.image.setRotation(180);
}
这种方法是错误的,您应该保存单击的位置并在适配器上调用notifyDataSetChanged()。
之后,在getView中添加代码,如果当前位置等于保存的单击位置,该代码将隐藏/显示一些视图,如下所示:
if (position == clickedPosition) {
holder.txtSecond.setVisibility(View.GONE);
holder.image.setRotation(0);
} else {
holder.txtSecond.setVisibility(View.VISIBLE);
holder.image.setRotation(180);
}
发生这种情况是因为您正在使用ViewHolder。不会为列表的每个新项创建新视图,但会回收旧视图。您可能已在列表项布局文件中指定使第二个textview消失,但单击后,您将使其可见。因此,如果您使第二个textview可见的此视图被回收,则默认情况下第二个textview可见 要解决此问题,可以在getView函数中添加以下行: holder.txtSecond.setVisibility(View.GONE)
但是要知道它会做什么,因为它可能会产生一些其他非预期的行为。发生这种情况是因为您正在使用ViewHolder。不会为列表的每个新项创建新视图,但会回收旧视图。您可能已在列表项布局文件中指定使第二个textview消失,但单击后,您将使其可见。因此,如果您使第二个textview可见的此视图被回收,则默认情况下第二个textview可见 要解决此问题,可以在getView函数中添加以下行: holder.txtSecond.setVisibility(View.GONE)
但是你要知道它会做什么,因为它可能会产生一些其他非预期的行为。我不知道从哪里开始。你的适配器有很多问题。让我们稍微重新编码一下
活动
和适配器
因此,据我所知,您试图在列表视图中显示一系列问题,然后在列表视图中单击一个问题时,您希望显示该问题的答案。因此,您将问题和答案保留在同一个映射中,正如我看到您从如下映射中设置TextView
的文本一样。这不是一个很好的设计来满足您的目的
holder.txtFirst.setText(map.get("question").toString());
holder.txtSecond.setText(map.get("answer").toString());
现在,我建议保留一个要显示为列表项的对象数组。让我们先创建一个ListItem
对象
public class ListItem {
public String question;
public String answer;
public boolean showAnswer = false; // Set the default value to false as at the beginning the answers will be hidden.
}
正如您观察到的ListItem
类一样,我保留了一个对象来填充ListView
中的每个列表项。此外,我保留了一个布尔标志showAnswer
,以跟踪您的答案是否显示
现在将ListItem
对象的数组传递给适配器,并像这样实现onClickListener
。您只需将所选项目的showAnswer
标志设置为true
abc.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(listItemArray[position].showAnswer == false) {
listItemArray[position].showAnswer = true;
notifyDataSetChanged();
}
}
});
我不知道从哪里开始。你的适配器有很多问题。让我们稍微重新编码一下活动
和适配器
因此,据我所知,您试图在列表视图中显示一系列问题,然后在列表视图中单击一个问题时,您希望显示该问题的答案。因此,您将问题和答案保留在同一个映射中,正如我看到您从如下映射中设置TextView
的文本一样。这不是一个很好的设计来满足您的目的
holder.txtFirst.setText(map.get("question").toString());
holder.txtSecond.setText(map.get("answer").toString());
现在,我建议保留一个要显示为列表项的对象数组。让我们先创建一个ListItem
对象
public class ListItem {
public String question;
public String answer;
public boolean showAnswer = false; // Set the default value to false as at the beginning the answers will be hidden.
}
正如您观察到的ListItem
类一样,我保留了一个对象来填充ListView
中的每个列表项。此外,我保留了一个布尔标志showAnswer
,以跟踪您的答案是否显示