我使用了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 :(得分:1)
这种方法有误,您应该保存点击位置并在适配器上调用notifyDataSetChanged()。
之后,在getView中添加代码,如果当前位置等于保存的点击位置,将隐藏/显示一些视图,如下所示:
if (position == clickedPosition) {
holder.txtSecond.setVisibility(View.GONE);
holder.image.setRotation(0);
} else {
holder.txtSecond.setVisibility(View.VISIBLE);
holder.image.setRotation(180);
}
答案 1 :(得分:1)
我不知道从哪里开始。你的适配器有很多问题。让我们重新编码您的>>> import re
>>> text_in = 'I am 25 years old'
>>> ''.join(s if s.isdigit() else s[::-1] for s in reversed(re.split('(\d+)', text_in)))
'dlo sraey 25 ma I'
>>>
>>> text_in = 'Iam25yearsold'
>>> ''.join(s if s.isdigit() else s[::-1] for s in reversed(re.split('(\d+)', text_in)))
'dlosraey25maI'
和Activity
。
因此,根据我的理解,您尝试在Adapter
中展示一系列问题,然后点击ListView
中的问题时,您希望公开该问题的答案。因此,您将问题和答案保存在同一地图中,因为我看到您正在从地图中设置ListView
的文字,如下所示。这不是一个非常好的设计,以满足您的目的。
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
标志设置为true即可。
showAnswer
现在,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
答案 2 :(得分:0)
您可以将其用作..
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);
}
}
});
答案 3 :(得分:0)
这是因为您正在使用ViewHolder。不会为列表中的每个新项目创建新视图,但会回收旧视图。您可能已在列表项目布局文件中指定使第二个textview消失,但在单击时您将使其可见。因此,如果您使第二个文本视图可见的视图已被回收,则默认情况下您的第二个文本视图将可见。
要解决此问题,您可以在getView函数中添加以下行:
holder.txtSecond.setVisibility(View.GONE);
但要知道它会做什么,因为它可能会产生一些其他意外行为。