【问题标题】:Android - How to get reference to view in a custom layout?Android - 如何在自定义布局中获取对视图的引用?
【发布时间】:2015-04-22 02:22:51
【问题描述】:

我有一个ListView,它从“rowlayout”中获取每个项目的布局。

我想在我的主要活动中对 rowlayout 中的一个按钮做一些事情,我如何获得对它的引用 findviewbyid 不起作用。

我想我基本上不理解如何在自定义布局中获取对视图的引用的一般概念——除非从 ListView 获取视图是不同的。任何人都可以帮忙吗?谢谢。

【问题讨论】:

    标签: java android layout android-listview


    【解决方案1】:

    ListView 是一个 ViewGroup,所以你可以遍历它的子元素:

    int n = getChildCount();
    for (int i = 0; i < n; i++) {
        doSomethingToView(getChildAt(i));
    }
    

    但是,您必须小心。 ListView 非常特别,只有您可能期望的子集。它只保存(大致)对当前可见的子项的引用,并在它们消失时重用它们。

    您可能会考虑更改底层适配器,而不是通知ListView 其适配器已更改,因此它需要重绘子级。或者,您可以让ListView 的孩子直接侦听应该更改它的事件,然后自行调整。

    【讨论】:

      【解决方案2】:

      如果您在适配器的 getView 方法中扩展自定义布局,您可以获得这样的视图

      LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      
      View rowView = inflater.inflate(R.layout.your_custom_layout, parent, false);
      
      TextView tv = (TextView) rowView.findViewById(R.id.your_tv_id);
      

      【讨论】:

      • 如果我的适配器类是单独的,那么上面的代码可以从我的主要活动中调用吗?
      • 不,这在适配器的 getView 方法中。编辑:抱歉,只是重读了您的问题,没有意识到您想在活动中访问它。请无视
      【解决方案3】:

      如果你以ViewHolder的方式实现ListView,就可以使用partial refresh principle,就像这样:

      private void refreshPartially(int position){
          int firstVisiblePosition = listview.getFirstVisiblePosition();
          int lastVisiblePosition = listview.getLastVisiblePosition();
          if(position>=firstVisiblePosition && position<=lastVisiblePosition){
              View view = listview.getChildAt(position - firstVisiblePosition);
              if(view.getTag() instanceof ViewHolder){
                  ViewHolder vh = (ViewHolder)view.getTag();
                  //holder.play.setBackgroundResource(resId);//Do something here.
                  ...
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可能可以使用此android - listview get item view by position 的答案来获取某个位置的子视图,然后在该子视图上调用findViewById()

        【讨论】:

          猜你喜欢
          • 2015-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-28
          • 1970-01-01
          • 2012-07-16
          相关资源
          最近更新 更多