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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
#1

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

24.06.2014, 04:51. Просмотров 1271. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток!
Понимаю, вопрос нубский, но никак не получается сделать 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 подсветка выделенного пункта
Посмотрите здесь:

Добавление пункта в ListView - Программирование Android
Всем привет,подскажите пожалуйста, есть два активити с Listview в одном актививи список ListView с заполниным списком и мне нужно ,если...

ListView: подсветка выбранного элемента - Программирование Android
В активити есть несколько списков со своей разметкой. Пересмотрел кучу примеров, но у самого что-то не получается оставить после нажатия...

Анимация одного пункта в ListView - Программирование Android
Собственно, есть у меня список контактов в ListView, заполняемом моим адаптером. При движении справа-налево по контакту а меня происходит...

Выпадающее меню для каждого пункта ListView - Программирование Android
Здравствуйте! Как реализовать подобное меню в списке? Я придумал только с использованием spinner-а в каждом item's view-е, но...

ListView и простой пример определения нажатого пункта - Программирование Android
Здравствуйте! Брошу на лайоут ListView и Button Набью на listView две строчки - &quot;Москва&quot;, &quot;Питер&quot;. Как определить какая из них...

Загрузка данных из SQLite для каждого пункта ListView - Программирование Android
Здравствуйте, у меня такая проблема, не могу сделать так что бы для каждого пункта списка выводилась соответствующая строка в БД в новой...

Как обратиться к элементу (button) внутри пункта списка (ListView) - Программирование Android
Здравствуйте! Помогите, пожалуйста Есть активити с ListView. В каждом пункте списка есть пару TextView и один Button. Как и где ...

Изменил фон для Custom ListView не работает подсветка при нажатии - Программирование Android
Для каждого четного Custom ListView устанавливаю цвет фона : if ((position % 2)!=0) ...

подсветка - Программирование Android
Имеется множество EditText, нужно както красиво выделить один(цветом или чем нибудь), и с возможностью возвращения к исходному) есть...

Синтаксис и его подсветка - Программирование Android
Товарищи, подскажите пожалуйста какую-нибудь неплохую библиотеку для подсветки синтаксиса в TextView, или вообще варианты подсветки...

Подсветка кнопок actionbar андроид - Программирование Android
Здравствуйте. Не могу найти как изменить цвет подсветки кнопок на actionbar и внутри searchview при нажатии. Использую support actionbar....

Подсветка дисплея android studio - Программирование Android
как сделать чтоб экран не тух когда мое приложение открыто?


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

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

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