developer tip

Android에서 ListView 항목의 배경색 변경

copycodes 2020. 11. 1. 18:16
반응형

Android에서 ListView 항목의 배경색 변경


ListView항목별로 항목의 배경색을 변경하려면 어떻게해야합니까 ? 항목 레이아웃 android:backgroundColor에서 사용하면이 작업을 수행 ListView할 수 있지만 목록 선택기가 더 이상 표시되지 않습니다. drawSelectorOnToptrue 로 설정하여 선택기를 다시 표시 할 수 있지만 선택기가 전체 항목을 오버레이합니다.

배경색을 변경하고 선택기를 유지하는 방법에 대한 아이디어가 있습니까?

추신 선택자 자체를 변경하지 않을 것입니다.

편집 : GMail 응용 프로그램의 작성자가 정확히 이것을 달성하여 확실히 가능합니다.


사용하려는 각 색상에 대해 다른 상태 드로어 블을 만들어야합니다.

예 : list_selector_read.xmllist_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 이름을 추가 할 수 있습니다.

이것은 내 앱에서 잘 작동합니다.


이것에 대한 최고의 튜토리얼은 여기 에서 찾을 수 있습니다 .

주요 섹션 :

  1. 확실히 전화 view.setSelected(true)onItemClick, 그렇지 않으면 당신은 선택한 항목의 배경을 볼 수 없습니다
  2. 선택기의 상태 순서를 유지하십시오. 그렇지 않으면 예측할 수없는 동작이 배경색으로 표시됩니다 ( 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

반응형