【问题标题】:How to Highlight the [Already Colored] selected ListItem in the ListView如何在 ListView 中突出显示 [Already Colored] 选定的 ListItem
【发布时间】:2015-05-05 19:00:58
【问题描述】:

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

这里应用程序运行的图片: UI Snapshot

【问题讨论】:

  • 如果您使用的是 Material Design,您可以设置更高的 z 轴值以将项目显示在顶部。如果你不是,我会选择相同调色板的另一种色调。
  • 项目在列表中的位置是固定的,我只是想直观地改变颜色以表明该项目被选中。但是选择器无法理解项目的颜色,所以我只剩下一个纯色选择器..
  • 我知道它们在列表中是固定的,z-index 我的意思是:Assign Elevation To Your Views
  • 对不起,我检查了你的链接,似乎海拔可以解决问题。现在我只需要将它与选择器一起使用以提升项目的视图。谢谢

标签: android listview selector highlight android-selector


【解决方案1】:

似乎通过将颜色值(准确地说是 Alpha 值)从 0xFFXXXXXX 更改为 0xAAXXXXXX 或任何较低的 alpha 值,选择器的 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 顶部绘制的,但它仍然可以,因为它显示了选择的项目.. Ofc 这不是一个好的设计,但仍然是完成这项工作的快速快捷方式。

【讨论】:

    【解决方案2】:

    使用 View 的 Elevation 属性使您的项目具有“选定”外观。 更多信息Assign Elevation To Your Views

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2015-09-08
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2012-08-30
      • 2014-12-28
      相关资源
      最近更新 更多