在列表视图中隐藏和显示列表项无法正常工作
我已经使用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个项目。
任何人都可以帮助我。谢谢!
这种做法是不对的,你应该保存位置点击,你的适配器上调用notifyDataSetChanged()。
后,在getView添加代码,这将隐藏/如果当前位置等于保存的点击位置,像这样显示的一些看法:
if (position == clickedPosition) {
holder.txtSecond.setVisibility(View.GONE);
holder.image.setRotation(0);
} else {
holder.txtSecond.setVisibility(View.VISIBLE);
holder.image.setRotation(180);
}
非常感谢,它是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);
}
}
});
我试过你的答案。但没有改变:( – Developer
这是发生,因为你使用的是ViewHolder。不会为列表中的每个新项目创建新视图,但会回收旧视图。你可能已经在你的列表项目布局文件中指定了第二个textview消失了,但点击后你可以看到它。因此,如果您已使第二个文本视图可见的此视图被回收,则默认情况下,您的第二个文本视图将可见。
为了解决这个问题,你可以添加下面一行到你的getView功能:
holder.txtSecond.setVisibility(View.GONE);
但确实知道它会做什么,因为它可能会产生一些其他意想不到的行为。
我不知道从哪里开始。你的适配器有很多问题。让我们重新编码你的Activity
和Adapter
。
因此,从我的理解中,您试图在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;
}
请使用位置,同时点击项目隐藏和显示第二个textview,你可以请张贴你的适配器类吗? –
在这种情况下代码正在执行..?如果还是 – gStephin
我已编辑我的问题,请现在参考。第一次,其他人显然会执行 – Developer