java在listview中隐藏和显示列表项无法正常工作
我使用了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个项目
有人能帮我吗。谢谢
# 1 楼答案
你可以把它当作
# 2 楼答案
我不知道从哪里开始。你的适配器有很多问题。让我们重新编码一下
Activity
和Adapter
因此,据我所知,你试图在
ListView
中显示一系列问题,然后当点击你的ListView
中的一个问题时,你想显示该问题的答案。因此,您将问题和答案保留在同一个映射中,就像我看到您从如下映射中设置TextView
的文本一样。这不是一个很好的设计来满足您的目的现在,我建议保留一个要显示为列表项的对象数组。让我们先做一个
ListItem
对象正如您观察到的
ListItem
类一样,我保留了一个对象来填充ListView
中的每个列表项。此外,我保留了一个布尔标志showAnswer
,以跟踪您的答案是否显示现在将
ListItem
对象的数组传递给适配器,并像这样实现onClickListener
。您只需将所选项目的showAnswer
标志设置为true现在
getView
函数的实现相当简单# 3 楼答案
发生这种情况是因为您正在使用ViewHolder。不会为列表的每个新项创建新视图,但会回收旧视图。您可能已在列表项布局文件中指定使第二个textview消失,但单击后,您将使其可见。因此,如果您使第二个textview可见的此视图被回收,则默认情况下第二个textview可见
要解决此问题,可以在getView函数中添加以下行:
但是你要知道它会做什么,因为它可能会产生一些其他非预期的行为
# 4 楼答案
这种方法是错误的,您应该保存单击的位置并在适配器上调用notifyDataSetChanged()
之后,在getView中添加代码,如果当前位置等于保存的单击位置,该代码将隐藏/显示一些视图,如下所示: