0

假设我认为我将其用作切换按钮。当用户点击它时,我通过setBackgroundResource(). 列表的数量约为 15 项ListView,屏幕上只能显示约 7 项。

起初,我尝试使用ListView.getChildAt(position),但当位置超过 7 时,它会返回NullPointer. 即使ListView.getCount()返回 15。但这是有道理的,因为它只显示可见的孩子。

然后我通过循环遍历绑定到 this 的所有数据来解决它Adapter,更改布尔值,然后调用notifyDataSetChange()

因此更新数据的循环数为 15 + 7 显示可见视图。

最好的方法应该是 15 并且已经完成。有没有办法做到这一点?

谢谢

4

1 回答 1

1

忘记你的孩子索引。您应该只在适配器中切换某种类型的标志。

然后,当您的 getView 方法再次被调用时,它将重绘您的列表。

IE:

public class YourAdapter extends BaseAdapter {

   private boolean useBackgroundTwo = false;

   .. constructor ..

   @Override
   public View getView (int position, View convertView, ViewGroup parent) {

       ...


       ...


       View background = findViewById(...);

       int backgroundResource = R.drawable.one;
       if(useBackgroundTwo){
            backgroundResource = R.drawable.two;
       }
       background.setBackgroundResource(backgroundResource);



       ....
   }

    public void useNewBackground(){
       this.useBackgroundTwo = true;
       notifyDataSetChanged();
    }

    public void useOldBackground(){
       this.useBackgroundTwo = false;
       notifyDataSetChanged();
    }

}

然后在您的活动代码中:

((YourAdapter) listview.getAdapter()).useNewBackground();

更进一步,您可以使用枚举而不是布尔值并具有多种方法setBackgroundGreen()setBackgroundRed()或者您可以传入要使用的可绘制setItemBackground(R.drawable.one);对象,选择权在您手中。

API:适配器

于 2012-12-28T10:29:53.940 回答