Android에서 ListView 항목의 배경색 변경
ListView
항목별로 항목의 배경색을 변경하려면 어떻게해야합니까 ? 항목 레이아웃 android:backgroundColor
에서 사용하면이 작업을 수행 ListView
할 수 있지만 목록 선택기가 더 이상 표시되지 않습니다. drawSelectorOnTop
true 로 설정하여 선택기를 다시 표시 할 수 있지만 선택기가 전체 항목을 오버레이합니다.
배경색을 변경하고 선택기를 유지하는 방법에 대한 아이디어가 있습니까?
추신 선택자 자체를 변경하지 않을 것입니다.
편집 : GMail 응용 프로그램의 작성자가 정확히 이것을 달성하여 확실히 가능합니다.
사용하려는 각 색상에 대해 다른 상태 드로어 블을 만들어야합니다.
예 : list_selector_read.xml
및 list_selector_unread.xml
.
android:state_window_focused="false"
항목을 제외한 모든 것을 투명하게 설정하기 만하면됩니다 .
그런 다음 목록을 그릴 때 setBackgroundResource(R.drawable.list_selector_unread/read)
각 행 을 호출 합니다.
ListView에 listSelector를 전혀 설정하지 않았습니다. 그러면 특정 Android 버전에 대한 기본 선택기가 유지됩니다.
이것은 가장 간단한 코드 인 위의 코드를 기반으로 한 수정입니다.
private static int save = -1;
public void onListItemClick(ListView parent, View v, int position, long id) {
parent.getChildAt(position).setBackgroundColor(Color.BLUE);
if (save != -1 && save != position){
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
}
save = position;
}
도움이 되었기를 바랍니다.
인사말!
좋아, 다음과 같이 작동합니다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@color/BackgroundColor" />
<item android:drawable="@color/transparent" />
</selector>
YMMV!
어댑터를 사용하여이 작업을 수행하는 예제를 제공하는 사람은 아무도 없었기 때문에 "curSelected"항목이 다른 배경을 가진 ListViews를 표시하는 코드 조각을 게시 할 것이라고 생각했습니다.
final ListView lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
{
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = new TextView(ListHighlightTestActivity.this);
convertView.setPadding(10, 10, 10, 10);
((TextView)convertView).setTextColor(Color.WHITE);
}
convertView.setBackgroundColor((position == curSelected) ?
Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0));
((TextView)convertView).setText((String)getItem(position));
return convertView;
}
public long getItemId(int position)
{
return position;
}
public Object getItem(int position)
{
return "item " + position;
}
public int getCount()
{
return 20;
}
});
이것은 목록 항목의 모양을 동적으로 변경해야 할 때 항상 유용한 접근 방식이었습니다.
Android 2.2 이메일 앱 의 소스 코드에서 :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" />
<item android:state_selected="false"
android:drawable="@color/message_item_read" />
</selector>
더 이상 말할 게 없다...
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);
for(int i=0; i<parent.getChildCount(); i++)
{
if(i == position)
{
parent.getChildAt(i).setBackgroundColor(Color.BLUE);
}
else
{
parent.getChildAt(i).setBackgroundColor(Color.BLACK);
}
}
가장 쉬운 방법은 이것입니다. ListArrayAdapter 내부에서 다음을 수행하십시오.
if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));
너무 복잡하게 하지마
항목의 레이아웃을 모두 변경하는 간단한 코드 (사용자 정의 목록보기는 baseadapter를 확장 함) :
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
RelativeLayout layout=(RelativeLayout) arg1.findViewById(R.id.rel_cell_left);
layout.setBackgroundColor(Color.YELLOW);
}
});
클릭 할 때 사용자 지정 목록 항목의 배경색을 변경하려고 했습니까?
그렇다면:
xml의 listview 레이아웃에 다음 코드를 추가하기 만하면됩니다.
android : drawSelectorOnTop = "true"android : listSelector = "@ android : drawable / list_selector_background"
여기에서 목록 선택기는 짙은 회색의 기본 선택기를 사용합니다. 자신의 드로어 블을 만들고 위와 같이 목록 선택기에 할당 할 수 있습니다.
이것이 당신이 원했던 것이기를 바랍니다.
매우 천천히 달리기
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);
for(int i=0; i<parent.getChildCount(); i++)
{
if(i == position)
{
parent.getChildAt(i).setBackgroundColor(Color.BLUE);
}
else
{
parent.getChildAt(i).setBackgroundColor(Color.BLACK);
}
}
다음으로 대체
int pos = 0;
int save = -1;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//Always set the item clicked blue background
view.setBackgroundColor(Color.BLUE);
if (pos == 0) {
if (save != -1) {
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
}
save = position;
pos++;
Log.d("Pos = 0", "Running");
} else {
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
save = position;
pos = 0;
Log.d("Pos # 0", "Running");
}
List14 예제를 살펴보십시오 . 에서 getView()
당신을 호출 할 수 있습니다 convertView.setBackgroundDrawable()
각 항목에 대해. 예를 들어 교대 배경을 얻기 위해 호출 할 배경을 결정하는 클래스 멤버 카운터를 가질 수 있습니다.
목록보기에서 원하는 android : listselector = color 이름을 추가 할 수 있습니다.
이것은 내 앱에서 잘 작동합니다.
이것에 대한 최고의 튜토리얼은 여기 에서 찾을 수 있습니다 .
주요 섹션 :
- 확실히 전화
view.setSelected(true)
에onItemClick
, 그렇지 않으면 당신은 선택한 항목의 배경을 볼 수 없습니다 - 선택기의 상태 순서를 유지하십시오. 그렇지 않으면 예측할 수없는 동작이 배경색으로 표시됩니다 (
state_selected
뒤에state_pressed
).
Francisco Cabezas의 코드를 변경하여 다음을 얻었습니다.
private int selectedRow = -1;
...
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getChildAt(position).setBackgroundResource(R.color.orange);
if (selectedRow != -1 && selectedRow != position) {
parent.getChildAt(selectedRow).setBackgroundResource(R.color.black);
}
selectedRow = position;
할 수 있습니다.
final List<String> fruits_list = new ArrayList<String>(Arrays.asList(fruits));
// Create an ArrayAdapter from List
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, fruits_list){
@Override
public View getView(int position, View convertView, ViewGroup parent){
// Get the current item from ListView
View view = super.getView(position,convertView,parent);
if(position %2 == 1)
{
// Set a background color for ListView regular row/item
view.setBackgroundColor(Color.parseColor("#FFB6B546"));
}
else
{
// Set the background color for alternate row/item
view.setBackgroundColor(Color.parseColor("#FFCCCB4C"));
}
return view;
}
};
// DataBind ListView with items from ArrayAdapter
lv.setAdapter(arrayAdapter);
}
}
If the setBackgroundColor
is added for onItemClick event, it will not work unless you can put it after the click event.
Try to add debug code in the adapter's getView
method, you will find that getView will be called again whenever you click on the screen. So, after you set the background color, the system will redraw the screen with original setting. Don't know why it waste resource to rebuild the screen whenever it's being click, there already have other way that we can notify the system to redraw the screen when needed.
Maybe you can add some control flag to determine the background color for individual row, then modify the getView method to set the color according to this control flag. So, the background color will be changed when it redraw the screen.
I'm also looking for an official solution on it.
I tried all answers above .. none worked for me .. this is what worked eventually and is used in my application .. it will provide read/unread list items colors while maintaining listselector styles for both states :
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@drawable/selectable_item_background_general"
android:drawSelectorOnTop="true"
android:fadingEdge="none"
android:scrollbarStyle="outsideOverlay"
android:choiceMode="singleChoice" />
selectable_item_background_general.xml :
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/bg_item_selected_drawable" />
<item android:state_pressed="true" android:drawable="@drawable/bg_item_selected_drawable" />
<item android:drawable="@android:color/transparent" />
</selector>
bg_item_selected_drawable.xml :
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#12000000" />
</shape>
notification_list_itemlayout.xml :
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rowItemContainer"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingRight="16dp"
android:paddingEnd="16dp">
<ImageView
android:id="@+id/imgViewIcon"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/cura_logo_symbol_small"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="8dp"
android:layout_marginEnd="8dp" />
<TextView
android:id="@+id/tvNotificationText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/imgViewIcon"
android:layout_toRightOf="@+id/imgViewIcon"
android:layout_toEndOf="@+id/imgViewIcon"
android:textSize="@dimen/subtitle"
android:textStyle="normal" />
<TextView
android:id="@+id/tvNotificationTime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dip"
android:layout_below="@+id/tvNotificationText"
android:layout_toRightOf="@+id/imgViewIcon"
android:layout_toEndOf="@+id/imgViewIcon"
android:textSize="@dimen/subtitle" />
</RelativeLayout>
</RelativeLayout>
Finally, in your adapter :
if (!Model.Read)
rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color
else
rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color
참고URL : https://stackoverflow.com/questions/2217753/changing-background-color-of-listview-items-on-android
'developer tip' 카테고리의 다른 글
뷰 / 템플릿을 렌더링하기 전에 Angular 2가 모델을로드 / 해결할 때까지 기다립니다. (0) | 2020.11.01 |
---|---|
.NET Core에서 WebUtility.HtmlDecode 대체 (0) | 2020.11.01 |
JAXB를 사용하는 속성 및 컨텐츠가있는 XML 요소 (0) | 2020.11.01 |
R에서 점은 무엇을 의미합니까? 개인 선호도, 명명 규칙 또는 그 이상? (0) | 2020.11.01 |
타임 스탬프 날짜를 MySQL의 날짜 전용 매개 변수와 비교하는 방법은 무엇입니까? (0) | 2020.11.01 |