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

时间:2017-11-11 07:27:23

标签: java android 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个项目。

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

4 个答案:

答案 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);

但要知道它会做什么,因为它可能会产生一些其他意外行为。