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
,以跟踪您的答案是否显示