【问题标题】:Android Listview onclick random selectionAndroid Listview onclick 随机选择
【发布时间】:2019-02-06 10:27:12
【问题描述】:

我有常见问题作为列表视图,它将包含一个问题、一个答案和一个图像视图。我附上下面的屏幕截图。当单击第一项时,它将使第一行的答案可见(最初可见性消失)。问题是它也会使第十个项目可见。同样的情况一直发生到第四个项目

       @Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.faq_listitem, parent,false);

        holder.mQuestionnoTextView= convertView.findViewById(R.id.question_no);
        holder.mQuestionTextView =  convertView.findViewById(R.id.question);
        holder.mAnswerTextView =  convertView.findViewById(R.id.answer);
        holder.viewMore=convertView.findViewById(R.id.show_more) ;

        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    int number=position+1;

    holder.mQuestionnoTextView.setText(MessageFormat.format("{0})", number));
    holder.mQuestionTextView.setText(MessageFormat.format("{0}", getItem(position).getQuestion()));
    holder.mAnswerTextView.setText(getItem(position).getAnswer());
    final TextView answers=holder.mAnswerTextView;
    final ImageView arrow=holder.viewMore;

    convertView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

                if (answers.isShown()) {
                    answers.setVisibility(View.GONE);
                    arrow.setRotation(0);
                } else {
                    answers.setVisibility(View.VISIBLE);
                    arrow.setRotation(180);
                }
                //mAdapter.notifyDataSetChanged();

            }

    });

    return convertView;
}

【问题讨论】:

  • 使用视图支架,您需要手动保存可见位置并显示/隐藏它们
  • 能否给个示例代码
  • 能否添加完整的适配器代码
  • 请检查我是否添加了
  • 我在下面发布了答案检查

标签: android listview


【解决方案1】:

这就是你需要做的。

创建一个全局变量List<Integer> savedPositions = new ArrayList<>();

if(savedPositions.contains(position)){
        answers.setVisibility(View.VISIBLE);
        arrow.setRotation(180);
 }else{
      answers.setVisibility(View.GONE);
      arrow.setRotation(0);
  }

 convertView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

                if (savedPositions.contains(position)) {
                    savedPositions.remove((Integer) position);
                    answers.setVisibility(View.GONE);
                    arrow.setRotation(0);

                } else {
                    savedPositions.add(position);
                    answers.setVisibility(View.VISIBLE);
                    arrow.setRotation(180);
                }
               notifyDataSetChanged();

            }

    });

【讨论】:

    【解决方案2】:

    使用

    answers.getVisibility()==View.VISIBLE 
    

    代替

     answers.isShown()
    

    试试这个

        convertView.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
    
                if (answers.getVisibility()==View.VISIBLE) {
                    answers.setVisibility(View.GONE);
                    arrow.setRotation(0);
                } else {
                    answers.setVisibility(View.VISIBLE);
                    arrow.setRotation(180);
                }
                //mAdapter.notifyDataSetChanged();
            }
    
        });
    

    如果您想在 recyclerview 或 listview 中进行可见维护,请查看此处https://stackoverflow.com/a/51744548/7666442

    【讨论】:

    • 另一个很好的答案 +1
    • 我认为这不会起作用,因为视图将被回收并且可见性不可信。
    • @Redman 是的,这就是为什么我添加链接 stackoverflow.com/a/51744548/7666442
    【解决方案3】:
    if (arrow.getRotation()==0) {
             answers.setVisibility(View.GONE);
     } else {
             answers.setVisibility(View.VISIBLE);
     }
    

    如果您没有添加,请在适配器中的 onClickListener 之外添加此条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多