在列表视图中隐藏和显示列表项无法正常工作

问题描述:

我已经使用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); 
     } 
    } 
}); 

而且getView功能看起来是这样的。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.info_listview_items, null); 
     holder = new ViewHolder(); 
     holder.txtFirst = (TextView) convertView.findViewById(R.id.heading); 
     holder.txtSecond = (TextView) convertView.findViewById(R.id.description); 
     holder.image=(ImageView)convertView.findViewById(R.id.arrow); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    HashMap map = list.get(position); 
    holder.txtFirst.setText(map.get("question").toString()); 
    holder.txtSecond.setText(map.get("answer").toString()); 
    return convertView; 
} 

最初第二TextView能见度View.GONE

问题是,当我点击ListView中的项目时,第二个TextView可见。但同时其他一些第二个TextView也是可见的。 它在列表中有最小数量的项目时起作用。我尝试了5个项目。

任何人都可以帮助我。谢谢!

+0

请使用位置,同时点击项目隐藏和显示第二个textview,你可以请张贴你的适配器类吗? –

+0

在这种情况下代码正在执行..?如果还是 – gStephin

+0

我已编辑我的问题,请现在参考。第一次,其他人显然会执行 – Developer

这种做法是不对的,你应该保存位置点击,你的适配器上调用notifyDataSetChanged()。
后,在getView添加代码,这将隐藏/如果当前位置等于保存的点击位置,像这样显示的一些看法:

if (position == clickedPosition) { 
       holder.txtSecond.setVisibility(View.GONE); 
       holder.image.setRotation(0); 
} else { 
       holder.txtSecond.setVisibility(View.VISIBLE); 
       holder.image.setRotation(180); 
} 
+0

非常感谢,它是working.and另一个条件需要是** holder.txtSecond.getVisibility()== View.GONE ** if()。 – Developer

你可以使用它作为..

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); 
       } 
      } 
     }); 
+0

我试过你的答案。但没有改变:( – Developer

这是发生,因为你使用的是ViewHolder。不会为列表中的每个新项目创建新视图,但会回收旧视图。你可能已经在你的列表项目布局文件中指定了第二个textview消失了,但点击后你可以看到它。因此,如果您已使第二个文本视图可见的此视图被回收,则默认情况下,您的第二个文本视图将可见。

为了解决这个问题,你可以添加下面一行到你的getView功能:

holder.txtSecond.setVisibility(View.GONE);

但确实知道它会做什么,因为它可能会产生一些其他意想不到的行为。

我不知道从哪里开始。你的适配器有很多问题。让我们重新编码你的ActivityAdapter

因此,从我的理解中,您试图在ListView中显示一堆问题,然后点击ListView中的问题时,您想揭示该问题的答案。因此,您将问题和答案保留在同一张地图上,因为我看到您正在使用以下地图设置TextView的文字。这不是一个很好的设计来满足你的目的。

holder.txtFirst.setText(map.get("question").toString()); 
holder.txtSecond.setText(map.get("answer").toString()); 

现在,我想建议保留一个对象数组,你想显示为你的列表项目。首先让我们先制作一个ListItem对象。正如您所观察到的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. 
} 

所以,我保持一个对象来填充你的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(); 
     } 
    } 
}); 

现在您的getView函数的实现相当简单。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = activity.getLayoutInflater(); 
    // .. Other code 

    // HashMap map = list.get(position); 
    // holder.txtFirst.setText(map.get("question").toString()); 
    // holder.txtSecond.setText(map.get("answer").toString()); 

    ListItem listItem = list[position]; 
    holder.txtFirst.setText(listItem.question); 
    holder.txtSecond.setText(listItem.answer); 

    if (listItem.showAnswer == true) holder.txtSecond.setVisibility(View.VISIBLE); 
    else holder.txtSecond.setVisibility(View.GONE); 
    return convertView; 
}