Как выделить [Уже Цветной] выбранный ListItem в ListView

У меня два ListFragment + Один фрагмент все в одном Activity, Первый список показывает список уроков, в которых после выбора урока отображается второй список, содержащий темы, и после выбора редактора тем пользователи открывают уроки и темы, нажимая на них (Через ColorChooserDialog)..

package com.fins.newyeartable;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class LessonListFragment extends ListFragment {

    private static final int REQUEST_COLOR = 0;
    private static final String DIALOG_COLOR = "color";
    private static final String DIALOG_SETTING = "setting";

    private ArrayList<Lesson> mLessons;
    private Callbacks mCallbacks;

    public interface Callbacks{
        void onLessonSelected(int lessonId);
        void onTableChange();
    }

    @Override 
    public void onAttach(Activity activity){
        super.onAttach(activity);
        mCallbacks = (Callbacks)activity;
    }

    @Override 
    public void onDetach(){
        super.onDetach();
        mCallbacks = null;
    }

    @Override 
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        setHasOptionsMenu(true);

        mLessons = MyTable.get(getActivity(), AppSetting.getTableType()).getLessons();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_lessonlist, parent, false);

        LessonAdapter adapter = new LessonAdapter(mLessons);
        setListAdapter(adapter);


        ListView listView = (ListView)v.findViewById(android.R.id.list);
        listView.setLongClickable(true);
        listView.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                Lesson lesson = ((LessonAdapter)getListAdapter()).getItem(position);
                FragmentManager fm = getActivity().getSupportFragmentManager();
                ColorChooserDialog dialog = ColorChooserDialog.newInstance(lesson.getId(), -1);
                dialog.setTargetFragment(LessonListFragment.this, REQUEST_COLOR);
                dialog.show(fm, DIALOG_COLOR);
                return true;
            }
        });
        //listView.setSelector(android.R.color.darker_gray);

        return v;
    }

    private class LessonAdapter extends ArrayAdapter<Lesson>{

        public LessonAdapter(ArrayList<Lesson> lessons){
            super(getActivity(), 0, lessons);
        }

        public View getView(int position, View convertView, ViewGroup parent){
            if(convertView == null)
                convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_lesson, null);

            //Link Data to View
            final Lesson lesson = getItem(position);
            TextView titleTextView =  (TextView)convertView.findViewById(R.id.list_item_textView);
            titleTextView.setText(lesson.getTitle());

            switch(lesson.getColor()){
            case Lesson.NO_COLOR:
                titleTextView.setBackgroundColor(0x00000000);
                break;
            case Lesson.COLOR_BLUE:
                titleTextView.setBackgroundColor(0xFF0099CC);
                break;
            case Lesson.COLOR_GREEN:
                titleTextView.setBackgroundColor(0xFF99CC00);
                break;
            case Lesson.COLOR_YELLOW:
                titleTextView.setBackgroundColor(0xFFFFFF44);
                break;
            case Lesson.COLOR_RED:
                titleTextView.setBackgroundColor(0xFFFF4444);
                break;
            }

            return convertView;
        }

    }


    @Override
    public void onListItemClick(ListView l, View v, int position, long id){
        Lesson lesson = ((LessonAdapter)getListAdapter()).getItem(position);
        mCallbacks.onLessonSelected(lesson.getId());
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(requestCode == REQUEST_COLOR){
            ((LessonAdapter)getListAdapter()).notifyDataSetChanged();
        }
    }
}

Что я хочу: показать пользователям выбранные урок и тему, чтобы они не запутались, когда редактируют детали во фрагменте редактора. Я не могу использовать селекторы, такие как:

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

Потому что я уже должен цвет ListItem по цвету, выбранному пользователями, цвет селектора не будет отображаться в цветном списке элементов, так какой селектор можно использовать здесь? Могу ли я просто изменить альфа выбранного ListItem? Или я могу добавить цвет элемента над селектором?

Вот изображение запущенного приложения: UI Snapshot

2 ответа

Похоже, что при изменении значения цвета (точнее значения альфа) с 0xFFXXXXXX на 0xAAXXXXXX или любого более низкого значения для альфа цвет селектора darker_gray будет виден через фон TextView:

switch(lesson.getColor()){
        case Lesson.NO_COLOR:
            titleTextView.setBackgroundColor(0x00000000);
            break;
        case Lesson.COLOR_BLUE:
            titleTextView.setBackgroundColor(0xAA0099CC);
            break;
        case Lesson.COLOR_GREEN:
            titleTextView.setBackgroundColor(0xAA99CC00);
            break;
        case Lesson.COLOR_YELLOW:
            titleTextView.setBackgroundColor(0xAAFFFF44);
            break;
        case Lesson.COLOR_RED:
            titleTextView.setBackgroundColor(0xAAFF4444);
            break;
        }

        return convertView;
    }

Прямо сейчас, цвета кажутся нарисованными поверх ListSelector, но это все еще нормально, так как показывает, какой элемент выбран. Конечно, это не хороший дизайн, но быстрый ярлык для выполнения работы.

Использование Viewсвойство Elevation для придания вашим элементам "выбранного" вида. Дополнительная информация в разделе "Назначить высоту для просмотра"

Другие вопросы по тегам