Форум программистов, компьютерный форум CyberForum.ru

ListView подсветка выделенного пункта - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
24.06.2014, 04:51     ListView подсветка выделенного пункта #1
Всем доброго времени суток!
Понимаю, вопрос нубский, но никак не получается сделать navigation drawer с listview, в котором подсвечивается выбранный пункт... То есть подсветка выбранного пункта работает, но это происходит при нажатии, а не отрыва пальца от дисплея...
Вот код адаптера:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.contedevel.timetable.helpers;
 
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.contedevel.timetable.R;
 
import java.util.List;
 
/**
 * Created by ConteDevel on 19.06.2014.
 */
public class DrawerAdapter extends BaseAdapter {
    private static final int DEFAULT_LAYOUT_ITEM_ID = R.layout.drawer_item;
    private static final int DEFAULT_LAYOUT_CATEGORY_ID = R.layout.drawer_category;
    private static final int DEFAULT_TEXT_ID = R.id.tvDrawerItemText;
    private static final int DEFAULT_ICON_ID = R.id.ivDrawerItemIcon;
 
    List<DrawerItem> items;
    Context context;
    int layoutItemId;
    int layoutCategoryId;
    int textId;
    int iconId;
 
    /**
     * Constructor #1
     * @param context - Context
     * @param items - Drawer list items
     * @param layoutItemId - Layout ID of drawer item
     * @param layoutCategoryId - Layout ID of drawer category
     * @param textId - TextView ID
     * @param iconId - ImageView ID
     */
    public DrawerAdapter(Context context, List<DrawerItem> items, int layoutItemId,
                         int layoutCategoryId, int textId, int iconId) {
        this.context = context;
        this.items = items;
        this.layoutItemId = layoutItemId;
        this.layoutCategoryId = layoutCategoryId;
        this.textId = textId;
        this.iconId = iconId;
    }
 
    /**
     * Constructor #2
     * @param context - Context
     * @param items - Drawer list items
     * @param layoutItemId - Layout ID of drawer item
     * @param layoutCategoryId - Layout ID of drawer category
     */
    public DrawerAdapter(Context context, List<DrawerItem> items, int layoutItemId,
                         int layoutCategoryId) {
        this(context, items, layoutItemId, layoutCategoryId, DEFAULT_TEXT_ID,
                DEFAULT_ICON_ID);
    }
 
    /**
     * Constructor #3
     * @param context - Context
     * @param items - Drawer list items
     */
    public DrawerAdapter(Context context, List<DrawerItem> items) {
        this(context, items, DEFAULT_LAYOUT_ITEM_ID, DEFAULT_LAYOUT_CATEGORY_ID);
    }
 
    /**
     * Get all drawer items
     * @return - List of drawer items
     */
    public List<DrawerItem> getItems() {
        return items;
    }
 
    @Override
    public int getCount() {
        return items.size();
    }
 
    @Override
    public Object getItem(int position) {
        return items.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        DrawerItem item = items.get(position);
        ViewHolder holder;
        if(convertView == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            //Check item type
            if(item.getType() == DrawerItem.ITEM) {
                convertView = inflater.inflate(layoutItemId, parent, false);
            }
            else {
                convertView = inflater.inflate(layoutCategoryId, parent, false);
            }
            holder = new ViewHolder();
            holder.textView = (TextView) convertView.findViewById(textId);
            if(item.getType() == DrawerItem.ITEM) {
                holder.imageView = (ImageView) convertView.findViewById(iconId);
            }
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.textView.setText(item.getText());
        if(item.getType() == DrawerItem.ITEM && item.getIconId() != -1) {
            holder.imageView.setImageResource(item.getIconId());
        }
        return convertView;
    }
 
    private static class ViewHolder {
        public TextView textView;
        public ImageView imageView;
    }
}


Код активити:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.contedevel.timetable.tests;
 
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
import com.contedevel.timetable.R;
import com.contedevel.timetable.helpers.DrawerAdapter;
import com.contedevel.timetable.helpers.DrawerItem;
 
import java.util.ArrayList;
import java.util.List;
 
public class TestActivity extends ActionBarActivity {
    DrawerLayout mDrawerLayout;
    ActionBarDrawerToggle mDrawerToggle;
    ListView listView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        getSupportActionBar().setTitle(R.string.test_drawer_closed);
        drawerBuilder(); //Build navigation drawer
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_timetable);
    }
 
    /**
     * OnItemClickListener for NavigationDrawer ListView
     */
    private AdapterView.OnItemClickListener drawerListListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //((ListView) parent).setSelection(position);
        }
    };
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.test, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * Drawer list builder
     * @param stringItems - String array of drawer items
     * @param iconId - Drawer icon resource ID
     * @return - DrawerItem list for DrawerAdapter
     */
    private List<DrawerItem> drawerListBuilder(String[] stringItems, int iconId) {
        List<DrawerItem> items = new ArrayList<DrawerItem>();
        for(int i = 0; i < stringItems.length; i++) {
            items.add(new DrawerItem(stringItems[i], iconId));
        }
        return items;
    }
 
    /**
     * Navigation drawer builder
     */
    private void drawerBuilder() {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_test);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                             /* host Activity */
                mDrawerLayout,                    /* DrawerLayout object */
                R.drawable.ic_navigation_drawer,  /* nav drawer icon to replace 'Up' caret */
                R.string.test_drawer_opened,      /* "open drawer" description */
                R.string.test_drawer_closed       /* "close drawer" description */
        ) {
 
            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getSupportActionBar().setTitle(R.string.test_drawer_closed);
            }
 
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getSupportActionBar().setTitle(R.string.test_drawer_opened);
            }
        };
        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        //Build drawer list
        listView = (ListView) findViewById(R.id.list_test);
        final String[] categories = getResources().getStringArray(R.array.drawer_test_items);
        DrawerAdapter adapter = new DrawerAdapter(this,
                drawerListBuilder(categories, R.drawable.ic_drawer_item_test));
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(drawerListListener);
        listView.setSelection(0);
 
    }
}


И разметка:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_test"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/metro_light_grey">
 
    <!-- The main content view -->
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
 
        <FrameLayout
            android:id="@+id/content_test"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
 
        </FrameLayout>
    </LinearLayout>
    <!-- The navigation drawer -->
 
    <ListView
        android:id="@+id/list_test"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/metro_dark_blue"
        android:choiceMode="singleChoice"
        android:divider="@color/metro_dark_dark_blue"
        android:dividerHeight="1dp"
        android:fastScrollEnabled="false"
        android:focusable="false"
        android:listSelector="@color/metro_dark_dark_blue" />
 
</android.support.v4.widget.DrawerLayout>


В чем ошибка?
Уже второй день не могу разобраться, буду очень признателен за помощь(

Добавлено через 4 минуты
Да, еще один баг нашел: при скроллинге selector пункта доходит до верхней или нижней грани видимой части listview и останавливается, а при обратном скроллинге начинает двигаться только когда доходит выбранный итем. То есть чувство как будто он увлекается за позицией выбранного пункта, но сам селектор не прокручивается за пределы видимой области, а просто останавливается и приходит в движение только при возврате выбранного пункта в видимую зону

Добавлено через 2 минуты
Этих строк нет в разметке ListView:
XML
1
2
android:fastScrollEnabled="false"
android:focusable="false"
Случайно с ошибкой кинул
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 04:51     ListView подсветка выделенного пункта
Посмотрите здесь:

Android Из пункта меню в диалоговое окно
Android подсветка
Android Анимация одного пункта в ListView
Android ListView: подсветка выбранного элемента
Android Выпадающее меню для каждого пункта ListView
Добавление пункта в ListView Android
Android Как обратиться к элементу (button) внутри пункта списка (ListView)
Изменил фон для Custom ListView не работает подсветка при нажатии Android
Подсветка кнопок actionbar андроид Android
Android Подсветка R и layout красным цветом
Подсветка дисплея android studio Android
Загрузка данных из SQLite для каждого пункта ListView Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
24.06.2014, 05:01  [ТС]     ListView подсветка выделенного пункта #2
Вот: ListView подсветка выделенного пункта
Это не тень ActionBar-а, она гораздо тоньше и прозрачнее
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
25.06.2014, 02:58  [ТС]     ListView подсветка выделенного пункта #3
Пожалуйста, выложите, кто-нибудь пример проекта с моим адаптером, чтобы работал селектор пунктов... Я уже себя почувствовал полным чайником в Android, никогда не думал, что такая мелочь вызовет столько проблем... Неважно, как именно, это будет реализовано, главное, использование данного адаптера и выделение пунктов. Буду очень благодарен за помощь, так как уже третий день не получается доделать интерфейс проекта.
P.S. В адаптер можно внести правки, главное, чтобы осталась поддержка пунктов и категорий
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
25.06.2014, 08:08     ListView подсветка выделенного пункта #4
contedevel, да разбери какое нибудь похожее приложение и посмотри как там сделано.
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
25.06.2014, 13:09  [ТС]     ListView подсветка выделенного пункта #5
Rube, везде стандартные адаптеры используются, с ними всё работает, но мне очень важно разбить список на категории.
Yandex
Объявления
25.06.2014, 13:09     ListView подсветка выделенного пункта
Ответ Создать тему
Опции темы

Текущее время: 05:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru