有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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个项目

有人能帮我吗。谢谢


共 (4) 个答案

  1. # 1 楼答案

    你可以把它当作

    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);
                  }
              }
          });
    
  2. # 2 楼答案

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

    因此,据我所知,你试图在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。您只需将所选项目的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;
    }
    
  3. # 3 楼答案

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

    要解决此问题,可以在getView函数中添加以下行:

    holder.txtSecond.setVisibility(View.GONE);

    但是你要知道它会做什么,因为它可能会产生一些其他非预期的行为

  4. # 4 楼答案

    这种方法是错误的,您应该保存单击的位置并在适配器上调用notifyDataSetChanged()
    之后,在getView中添加代码,如果当前位置等于保存的单击位置,该代码将隐藏/显示一些视图,如下所示:

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