2015-03-04 2 views
0

У меня есть два ListFragment + Отдельный фрагмент всего в одном Activity. Первый список показать список уроков, которые при выборе урока вы показаны второй список, который содержит темы и после выбора темы редактора открывает, уроки и темы окрашиваются пользователями, LongClicking их (Via ColorChooserDialog) ..Как выделить [Уже окрашенный] выбран ListItem в ListView

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

+0

Если вы используете Material Design, вы можете установить более высокое значение оси z для отображения элемента сверху. Если вы этого не сделаете, я бы выбрал еще один оттенок той же цветовой палитры. –

+0

Позиция элементов фиксируется в списке, я просто хочу изменить цвет, чтобы показать, что элемент выбран. Но Селекторы не могут понять цвет элементов, поэтому я остался с единственным селектором цвета. – Darky

+0

Я знаю, что они зафиксированы в списке, по z-index Я имел в виду это: [Назначить возвышение к вашим представлениям] (https: //developer.android.com/training/material/shadows-clipping.html#Elevation) –

ответ

0

Elevation свойство Использование View «s, чтобы дать свои элементы, которые "выбран" вид. Более подробная информация в Assign Elevation To Your Views

0

Кажется, изменяя цвет (значение альфа, чтобы быть точными) от 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, но все еще в порядке, поскольку он показывает, какой элемент выбран. Ofc это не хороший дизайн, но все же быстрый ярлык для выполнения задания.

Смежные вопросы