如何在ListView中突出显示[已经着色]选定的ListItem

时间:2015-03-04 17:00:45

标签: android listview selector highlight android-selector

我在一个ListFragment中有两个Activity +单个片段。第一个列表显示了一个课程列表,在选择课程时,您将看到第二个包含主题的列表,并在选择主题编辑器时打开,用户通过LongClicking(通过ColorChooserDialog)为课程和主题着色。 / p>

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的alpha吗?或者我可以在选择器drawable上添加项目颜色吗?

这里运行app的图片: UI Snapshot

2 个答案:

答案 0 :(得分:0)

使用View的“提升”属性为您的商品选择&#34;选择&#34;看。 Assign Elevation To Your Views

中的更多信息

答案 1 :(得分:0)

似乎通过将颜色值(精确的Alpha值)从0xFFXXXXXX更改为0xAAXXXXXX或任何更低的alpha值,通过TextView背景可以看到选择器的darker_gray颜色:

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的顶部绘制的,但它仍然可以,因为它显示了选择的项目.Of它不是一个好的设计,但仍然是一个快速的快捷方式来完成这项工作。