Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666

Получить id записи в бд при нажатии на пункт списка

25.05.2013, 19:27. Показов 2351. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такой вопрос:

Есть список ListView который заполняется данными из Базы (SQLite). Мне нужно при нажатии на пункт списка получить не просто id-item этой записи, а получить ещё и id этой записи в базе данных. После чего, чтобы я мог использовать полученный id. Подскажите, как поступить? на ум приходит только мысль сделать SetText на item, сделать её невидимой, а после уже получить данные как то так String selection = l.getItemAtPosition(position).toString() ; Но уверен, что это неправильный способ и должен быть другой правильный вариант.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2013, 19:27
Ответы с готовыми решениями:

При нажатии на пункт меню скрыть его, и показать другой пункт меню
Прошу помощи, как можно допустим при нажатии на пункт меню, его скрыть, и показать другой пункт меню? я делаю так : public boolean...

получить data из Списка при нажатии
список из ссылок <a class="selector" data-item="1">1</a> <a class="selector" data-item="2">2</a> <a class="selector"...

Нажатием на пункт списка в ListView получить значение
Как при нажатии на пункт списка в ListView получить то что там написано (написана одна строчка). Пробую так, но выводит адрес ссылки: ...

16
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 19:50
покажите свой код, а мы уже подскажем что куда добавить.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 20:15  [ТС]
Класс(Fragment) расширяющий ListFragment:
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
public class Fragment2 extends ListFragment {
 
    private static final String TABLE_MY_DB_TOP = "myDBTop";
    private static final String KEY_ID = "id_top";
    private static final String KEY_CATEGORY = "category";
    private static final String KEY_TITLE = "title";
    private static final String CATEGORY_CINEMA = "Cinema";
    
    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList<String> values = new ArrayList<String>();
    private ListView mListView;
        
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ListTopImageAdapter mAdapter = new ListTopImageAdapter(getActivity(), values);
        mListView.setAdapter(mAdapter);
        super.onActivityCreated(savedInstanceState);
}
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        View myView = inflater.inflate(R.layout.fragment_screen2,
                container, false);
        mListView = (ListView) myView.findViewById(android.R.id.list);
        return myView;
    }
        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
}
 
    private void fillCinema() {
            DBHelperSqLite dbOpenHelper = new DBHelperSqLite(getActivity());
            database = dbOpenHelper.getReadableDatabase();
            
            values = new ArrayList<String>();
            Cursor valuesCursor = database.query(TABLE_MY_DB_TOP,
                                                 new String[] 
                                                 {KEY_ID, KEY_CATEGORY, KEY_TITLE},
                                                 KEY_CATEGORY + "= ?", new String[] {CATEGORY_CINEMA}, null, null
                                                 , KEY_TITLE);
            
            
            valuesCursor.moveToFirst();
            if(!valuesCursor.isAfterLast()) {
                do {
                    String name = valuesCursor.getString(2);
                    values.add(name);
                } while (valuesCursor.moveToNext());
            }
            valuesCursor.close();
            dbOpenHelper.close();
            database.close();
            
            ListTopImageAdapter mAdapter = new ListTopImageAdapter(getActivity(),
                    values);
            mListView.setAdapter(mAdapter);
            
        }
 
@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        
        String selection = l.getItemAtPosition(position).toString();
        Toast.makeText(getActivity(), selection, Toast.LENGTH_LONG).show();
        }
код adaptera:
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
public class ListTopImageAdapter extends ArrayAdapter<String> {
    private final Context context;
     
    private final ArrayList<String> friends;
    
    public ListTopImageAdapter(Context context, ArrayList<String> friends) {super(context, R.layout.item_fragment2, friends);
    this.context = context;
    this.friends = friends;
}
 
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        View rowView = inflater.inflate(R.layout.item_fragment2, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
 
        textView.setText(friends.get(position) );
 
        String s = friends.get(position);
 
        System.out.println(s);
        
        if (s.equals("About App")) {
            imageView.setImageResource(R.drawable.button_in);
        } else if (s.equals("Tools Tutorial")) {
            imageView.setImageResource(R.drawable.button_on);
        } else if (s.equals("About App Seen")) {
            imageView.setImageResource(android.R.drawable.btn_minus);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(R.drawable.button_in_on);
         }
 
        return rowView;
    }
}
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 20:45
создайте класс с полями которые вам нужны и используйте его вместо String.
вместо ArrayList<String> friends используйте ArrayList<MyClass> friends
в getView
Java
1
2
3
String s = friends.get(position).getS();
int id = friends.get(position).getId();
rowView.setTag(id);
в onListItemClick
Java
1
int id = (Integer)v.getTag();
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 20:51  [ТС]
ооо, спасибо за ответ. А не могли бы привести подробней пример. Просто мне кажется, что я не понимаю, что нужно сделать, хотя вроде необходимо мало что написать.
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 20:53
все что нужно я уже написал, а с созданием дополнительного класса для передачи данных думаю вы справитесь.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 21:23  [ТС]
создал класс модель с полями:

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
public class ModelDBFrag2 {
 
    // private variables
    String id_top;
    String name_category;
 
    // Empty constructor
    public ModelDBFrag2() {
 
    }
 
    // constructor
    public ModelDBFrag2(String id_top, String name_category) {
        this.id_top = id_top;
        this.name_category = name_category;
    }
 
    public String getId_top() {
        return id_top;
    }
 
    public void setId_top(String id_top) {
        this.id_top = id_top;
    }
 
    public String getName_category() {
        return name_category;
    }
 
    public void setName_category(String name_category) {
        this.name_category = name_category;
    }
}
а дальше что делать?

получать данные из таблицы так же нужно?:
Java
1
2
                                        String id = valuesCursor.getString(1);
                    String name = valuesCursor.getString(2);
и добавлять по прежнему так?:
Java
1
2
                    values.add(id);
                    values.add(name);
Меняю ArrayList<String> friends на ArrayList<ModelDBFrag2 > friends , но куче ошибок. Не пойму что в классе адаптере менять нужно, везде ArrayList<String> friends на ArrayList<ModelDBFrag2 > friends ?? если да, то не получается, как надо?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 21:28
да, вы все правильно поняли. что именно не получается?
кстати нумерация начинается с 0, судя по коду который вы выложили нужно писать
Java
1
 String id = valuesCursor.getString(0);
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 21:47  [ТС]
Цитата Сообщение от V0v1k Посмотреть сообщение
кстати нумерация начинается с 0, судя по коду который вы выложили нужно писать
да. я знаю, что с нуля. Мне просто нужно получить не Id записи, а ID записи который я ей сам присвоил. и это как раз вторая колонка.

изменил код адаптера так:
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
public class ListTopImageAdapter extends ArrayAdapter<ModelDBFrag2> {
    private final Context context;
   // private final String[] values;
    
    private final ArrayList<ModelDBFrag2> friends;
    
    public ListTopImageAdapter(Context context, ArrayList<ModelDBFrag2> friends) {super(context, R.layout.item_fragment2, friends);
    this.context = context;
    this.friends = friends;
}
    
    
//    public ListTopImageAdapter(Context context, String[] values) {super(context, R.layout.item_fragment2, values);
//        this.context = context;
//        this.values = values;
//    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        View rowView = inflater.inflate(R.layout.item_fragment2, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
  
        
       textView.setText((CharSequence) friends.get(position) ); // было так textView.setText(friends.get(position) );, а стало так
 
        
       String s = friends.get(position).getName_category();
       String id = friends.get(position).getId_top();
       rowView.setTag(id);
               
        System.out.println(s);
        
        if (s.equals("About App")) {
            imageView.setImageResource(R.drawable.button_in);
        } else if (s.equals("Tools Tutorial")) {
            imageView.setImageResource(R.drawable.button_on);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(android.R.drawable.btn_minus);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(R.drawable.button_on);
         }
 
        return rowView;
    }
}
но подчёркивает в методе извлечения элементов из базы данных fillCinema() :

values.add(id);
values.add(name);

и пишет The method add(ModelDBFrag2) in the type ArrayList<ModelDBFrag2> is not applicable for the arguments (String)
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 21:56
примерно так
Java
1
2
ModelDBFrag2 value = new ModelDBFrag2(id, name);
values.add(value);
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:02  [ТС]
а так можно?:
Java
1
2
3
String id = valuesCursor.getString(1);
String name = valuesCursor.getString(2);
ModelDBFrag2 model = new ModelDBFrag2(id, name);
или нужно так:

Java
1
2
3
4
5
String id = valuesCursor.getString(1);
String name = valuesCursor.getString(2);
ModelDBFrag2 model = new ModelDBFrag2();
model.setId_top(id);
model.setName_category(name);
или нужно как вы написали?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:06
здесь без разницы.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:31  [ТС]
почему то сыпятся ошибки:

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
05-25 18:27:47.891: E/AndroidRuntime(23232): FATAL EXCEPTION: main
05-25 18:27:47.891: E/AndroidRuntime(23232): java.lang.ClassCastException: by.my.project.ModelDBFrag2
05-25 18:27:47.891: E/AndroidRuntime(23232):    at by.appetitsoft.mevolution.ListTopImageAdapter.getView(ListTopImageAdapter.java:39)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.AbsListView.obtainView(AbsListView.java:1315)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.ListView.onMeasure(ListView.java:1109)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:563)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:378)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1249)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.os.Looper.loop(Looper.java:123)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.app.ActivityThread.main(ActivityThread.java:4627)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at java.lang.reflect.Method.invokeNative(Native Method)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at java.lang.reflect.Method.invoke(Method.java:521)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at dalvik.system.NativeStart.main(Native Method)
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:33
Цитата Сообщение от Stylish2013 Посмотреть сообщение
ListTopImageAdapter.java:39
что в этой строчке?
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:39  [ТС]
в этой строчке
Java
1
textView.setText((CharSequence) friends.get(position));
а до того как внедрили класс Model, было так
Java
1
textView.setText(friends.get(position));
оно высветило ошибку и я нажал исправить и оно исправило на то как есть сейчас.

к тому же я подебажил и да, на этом месте вываливается.
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:41
Java
1
textView.setText(friends.get(position).getNameCategory());
советую вам почитать книгу по основам Java.
1
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
26.05.2013, 03:43  [ТС]
Надо сделать так?
Java
1
 textView.setText(friends.get(position).getName_category());
только так сделал и вы написали.

Цитата Сообщение от V0v1k Посмотреть сообщение
советую вам почитать книгу по основам Java.
это не помешает, но не углядел этот момент.

Добавлено через 5 часов 0 минут
V0v1k, Спасибо Вам, всё получилось, помогли решить данную задачу!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2013, 03:43
Помогаю со студенческими работами здесь

Ошибка при запуске AsyncTask при нажатии на пункт ActionBar
Здравствуйте, почему при нажатии на пункт Action Bar'а вылетает ошибка? @Override public boolean onCreateOptionsMenu(Menu menu)...

Действие при нажатии на пункт TTreeView
Здравствуйте, на форме есть компонент TreeView и как пример записанные разделы: Десерт первый второй третий Напитки

Загрузить текст при нажатии на пункт меню
Подскажите пожалуйста саму идею реализации. Есть БД из одной таблицы (id, parent_id, name, text). Одному id соответствует уникальный текст....

При нажатии на пункт меню пропадает лого
вот картинка до нажатия вот после нажатия влот мой header.php &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; ...

Нарисовать фигуру при нажатии на пункт меню
Вот смотрите, используя switch(messg){case WM_PAINT:.....} мы рисуемо, а вот у меня такая проблема помимо switch(massg) я ещё использую...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru