【问题标题】:How to set focus on button after scrolling list view (Set Visibility)滚动列表视图后如何在按钮上设置焦点(设置可见性)
【发布时间】:2018-10-04 04:36:54
【问题描述】:

我是 android 新手,我正在使用带有一个文本视图和按钮的列表视图。我正在执行一些可见性的东西,在单击 button1 后它将隐藏 button1 并显示 button2。

设置可见性 View.GONEView.VISIBLE 工作正常,但是当我神奇地滚动列表视图时出现问题,它将所有 button1 重置为 View .VISIBLE 状态。

请任何人帮助我解决这个问题。

代码:

 @Override
public View getChildView(final int i, final int i1, boolean b, View 
 view, ViewGroup viewGroup) {

    if(view == null) {
        holder =  new ViewHolder();
        LayoutInflater parentInflater = (LayoutInflater) mctx.getSystemService(mctx.LAYOUT_INFLATER_SERVICE);
        view = parentInflater.inflate(R.layout.itemname_child_layout, null);
    } else {
        holder = (ViewHolder) view.getTag();
    }

   holder.button1 = view.findViewById(R.id.button1);
   holder.button1 = view.findViewById(R.id.button2);

   //initial button state
   holder.button1.setVisibility(View.VISIBLE);
   holder.button1.setVisibility(View.GONE);

   holder.recordBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
         holder.button1.setVisibility(View.GONE);
         holder.button2.setVisibility(View.VISIBLE);
      }
   }

   view.setTag(holder);

 return view;
}

【问题讨论】:

  • 尝试使用recylerview

标签: android listview


【解决方案1】:

您需要记录按钮的点击,因为当您滚动列表视图时,它会刷新到上一阶段。

所以像这样在你的适配器类中通用声明一个变量:

  ArrayList<Integer> count = new ArrayList(); 

现在将列表设置为 0 直到适配器大小

    for(int i=0;i<adapter.size;i++){
     count.add(0);
     }

然后在单击 button1 后,将您的按钮可见性设置如下:

              holder.recordBtn.setTag(position);

     if(count.get(position)==0){
         holder.button1.setVisibility(View.GONE);
         holder.button2.setVisibility(View.VISIBLE);
        }
         else{
         holder.button1.setVisibility(View.VISIBLE);
         holder.button2.setVisibility(View.GONE);
           }

       holder.recordBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
         int pos = (int)view.getTag();
         if(count.get(pos)==0){
         count.set(pos,1);
         holder.button1.setVisibility(View.GONE);
         holder.button2.setVisibility(View.VISIBLE);
        }
         else{
         count.set(pos,0);
         holder.button1.setVisibility(View.VISIBLE);
         holder.button2.setVisibility(View.GONE);
           }
      }
   }

【讨论】:

  • 感谢您的回答,它正在部分工作,当我单击 button1 时,它隐藏并显示 button2 很好。并且由于 button1 点击计数设置为 1。当我点击 下一个系列的 button1 时,它无法隐藏,因为在点击上一个 button1 后,我将计数更新为 1。所以现在我需要点击两次下一个系列的 button1 使其成为 button2。有什么想法吗??
【解决方案2】:

试试这个...我已经编辑了你的代码

 @Override
 public View getChildView(final int i, final int i1, boolean b, View 
 view, ViewGroup viewGroup) {

    if(view == null) {
        holder =  new ViewHolder();
        LayoutInflater parentInflater = (LayoutInflater) mctx.getSystemService(mctx.LAYOUT_INFLATER_SERVICE);
        view = parentInflater.inflate(R.layout.itemname_child_layout, null);
        holder.button1 = view.findViewById(R.id.button1);
        holder.button2 = view.findViewById(R.id.button2);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }


   //initial button state
   holder.button1.setVisibility(View.VISIBLE);
   holder.button2.setVisibility(View.GONE);

   holder.recordBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {

         holder.button1.setVisibility(View.GONE);
         holder.button2.setVisibility(View.VISIBLE);
      }
   }


 return view;
}

【讨论】:

  • 感谢 Pratik 的回答。您能解释一下您在这里使用 button1 和 button2 到底在做什么吗? holder.button1 = view.findViewById(R.id.button1); holder.button1 = view.findViewById(R.id.button2);
  • @MithunWalawalkar 看到我再次编辑了我的答案,你在 setTag() 之前调用 getTag()。每次你必须先 getview 和 setTag() 然后 getTag()
  • 不,我更改了代码,但也面临同样的问题。
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
相关资源
最近更新 更多