10

我知道这听起来很简单,并且对此存在疑问。但没有一个能解决我的问题。所以我们开始:

我想ListActivity在用户单击时更改列表项的背景颜色,并在用户再次单击时将其更改回原始颜色(即选择/取消选择项目的外观)

我尝试使用 getChildAt,如果我在一个屏幕上显示所有项目而无需滚动,它就可以完美运行。

代码:

getListView().getChildAt(position).setBackgroundColor(Color.CYAN);

当我在列表中有更多项目并且用户必须滚动浏览它们时,问题就开始了。更改项目的背景后,当我滚动时,背景颜色会显示在新可见的项目上。此外,再次单击该项目时getChildAt(position)返回null(以及因此 a )。NullPointerException

谁能帮我一个简单的代码来帮助我更改列表项的背景颜色?

提前致谢!

4

6 回答 6

5

肯定的事。我会在getView()自定义的方法中做到这一点ListAdapter

MyAdapter extends SimpleAdapter {
    private ArrayList<Integer> coloredItems = new ArrayList<Integer>();

    public MyAdapter(...) {
        super(...);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        if (coloredItems.contains(position)) {
            v.setBackgroundColor(Color.CYAN);
        } else {
            v.setBackgroundColor(Color.BLACK); //or whatever was original
        }

        return v;
    }
}

coloredItems单击列表项时更新。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    if (coloredItems.contains(position)) {
        //remove position from coloredItems
        v.setBackgroundColor(Color.BLACK); //or whatever was original
    } else {
        //add position to coloredItems
        v.setBackgroundColor(Color.CYAN);
    }
}
于 2012-09-26T21:36:43.790 回答
2

如果您正在处理,ListFragment那么此代码将很有帮助,

  @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (view != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            getListView().setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
            catagoryValueListView=getListView();
            catagoryValueListView.setOnItemClickListener(new OnItemClickListener() {

             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 if (ColoredView != null)
                     ColoredView.setBackgroundColor(Color.WHITE); //original color

                 view.setBackgroundColor(Color.BLUE); //selected color
                 ColoredView = view;
                                  }
        });
    }

}
于 2013-10-29T05:28:55.310 回答
1

我所做的是创建一个名为 ie list_background 的 xml 文件并将其放入可绘制文件夹中。

xml 看起来像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@color/list_selected" android:state_pressed="true" />
   <item android:drawable="@android:color/white" />
</selector>

在 ListView 项目的 xml 代码中,我将此 xml 作为项目背景,即

项目.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          style="@style/Fill"
          android:background="@drawable/list_background">

     <!-- Your layout here -->
</RelativeLayout>

style=@style/Fill 只是我为 android:layout_height="match_parent" 和 android:layout_width="match_parent

然后在 onListItemCLick 中:

public void onListItemClick(ListView l, View v, int position, long id) {
    v.setPressed( !v.isPressed ) //Toggle between colors of the view
}
于 2012-09-26T21:39:24.310 回答
1

onListItemClick只需您可以在方法中这样做

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    for (int a = 0; a < l.getChildCount(); a++) {
        l.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
    }

    ColorDrawable colorDrawable1 = new ColorDrawable(
            Color.parseColor("#A0A3A0"));
    v.setBackgroundDrawable(colorDrawable1);   

    if (position == 0) {
        Intent i = new Intent(MainActivity.this, NewActivity.class);

        startActivity(i);
    }

}
于 2014-12-18T10:17:45.420 回答
0

我就是这样做的:

创建一个全局变量View ColoredView;然后当你setOnItemClickListener为你的时ListView,这样做:

MenuList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (ColoredView != null)
                    ColoredView.setBackgroundColor(Color.WHITE); //original color

                view.setBackgroundColor(Color.BLUE); //selected color
                ColoredView = view;
            }
        });

这是我认为最简单的方法。

于 2013-04-02T05:30:13.283 回答
0

谢谢嘿宇宙。你的解决方案解决了我的问题。

不知道为什么我们应该在两个地方设置背景。

1.Adapter的getView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ....
     ....
     ....
        if(arrayBools[position]) {
            view.setBackgroundColor(Common.colorBkgroundSelected);
        }
        else{
            view.setBackgroundColor(Common.colorBkgroundNormal);            
        } 
     ....
     ....
     ....
}

2.ListActivity的onListItemClick()。

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
      super.onListItemClick(l, v, position, id);       
      arrayBools[position] = ( arrayBools[position] ? false : true );

     if(arrayBools[position]) {
         v.setBackgroundColor(colorBkgroundSelected);
     }
     else{
        v.setBackgroundColor(colorBkgroundNormal);          
     }    
}
于 2013-12-20T10:04:59.543 回答