Страницы

Поиск по вопросам

вторник, 28 мая 2019 г.

Как получить младшие 8 бит числа?

Есть число типа int <= 65545. Необходимо получить младшие и старшие 8 бит. Со "старшими 8-ю битами разобрался, достаточно сдвинуть вправо с заполнением нулями (>>>8). А вот с младшими никак не пойму.
 старшие   младшие
|-----------||-----------|
1111111100000000


Ответ

Достаточно обнулить старшие биты
int a = 0x1234; int bigA = a >>> 8; int lowA = a & 0xff;

Как мне правильно с JSON перевести поле цвета в int-значение?

Я получаю поле в таком формате:
"percent_home_color":"#65ff65"
Мне нужно поменять цвет фона view, но setBackground хочет int.
Вопрос: Есть функция для этого или в ручную писать для перевода в десятичную систему?


Ответ

int color = Color.parseColor(String color);
Ссылка на оф. документацию
П. С, вам надо не из JSON, а из строки, т. к. надо сначала достать строку "percent_home_color":"#65ff65" из JSON

Создание адаптера для ListView

Здравствуйте. Зашел в тупик при создании адаптера для ListView. Если начинать с начала, то есть ArrayList, содержащий список объектов Week. Каждый объект Week, в свою очередь, содержит список объектов Day с 2 полями: header и список объектов Subject. Ну и каждый Subject, соответственно, тоже имеет список полей. Вывод данных в ListView должен быть следующим: идет вывод данных из конкретного объекта Week так, что сначала идет header объекта Day, а после него - данные из каждого Subject этого Day. При этом данные из Subject и header имею разные Layout'ы. Это очень трудно описать, поэтому сделал примитивную зарисовку.

Может кто-нибудь подсказать по этому поводу? Заранее благодарю за ответ.


Ответ

Создаем layout-файлы:
activity_main.xml



item_header.xml



item_content.xml





Создаем классы модели данных:
Subject
public class Subject { private String mFirstField; private String mSecondField; private String mThirdField;
public Subject(String firstField, String secondField, String thirdField) { mFirstField = firstField; mSecondField = secondField; mThirdField = thirdField; }
public String getFirstField() { return mFirstField; }
public void setFirstField(String firstField) { mFirstField = firstField; }
public String getSecondField() { return mSecondField; }
public void setSecondField(String secondField) { mSecondField = secondField; }
public String getThirdField() { return mThirdField; }
public void setThirdField(String thirdField) { mThirdField = thirdField; } }
Day
public class Day { private String mHeader; private ArrayList mSubjects;
public Day(String header, ArrayList subjects) { mHeader = header; mSubjects = new ArrayList<>(subjects); }
public String getHeader() { return mHeader; }
public void setHeader(String header) { mHeader = header; }
public ArrayList getSubjects() { return mSubjects; }
public void setSubjects(ArrayList subjects) { mSubjects = new ArrayList<>(subjects); } }
Week
public class Week { private ArrayList mDays;
public Week(ArrayList days) { mDays = new ArrayList<>(days); }
public ArrayList getDays() { return mDays; }
public void setDays(ArrayList days) { mDays = new ArrayList<>(days); } }
Создаем адаптер для ListView
public class CustomAdapter extends BaseAdapter {
private static final int TYPE_CONTENT = 0; private static final int TYPE_HEADER = 1;
private ArrayList mData;
private LayoutInflater mInflater;
public CustomAdapter(Context context, ArrayList data) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mData = new ArrayList<>(data); }
@Override public int getItemViewType(int position) { return position % 4 == 0 ? TYPE_HEADER : TYPE_CONTENT; }
@Override public int getViewTypeCount() { return 2; }
@Override public int getCount() { return mData.size()*4; }
@Override public Object getItem(int position) { return mData.get(position); }
@Override public long getItemId(int position) { return position; }
public View getView(int position, View convertView, ViewGroup parent) { int viewType = getItemViewType(position); View v = convertView;
switch (viewType) { case TYPE_CONTENT: ContentViewHolder contentViewHolder; if (v == null) { v = mInflater.inflate(R.layout.item_content, null);
contentViewHolder = new ContentViewHolder(); contentViewHolder.itemContentFirstSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_first_field_text_view); contentViewHolder.itemContentSecondSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_second_field_text_view); contentViewHolder.itemContentThirdSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_third_field_text_view); v.setTag(contentViewHolder); } else { contentViewHolder = (ContentViewHolder) v.getTag(); } contentViewHolder.itemContentFirstSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getFirstField()); contentViewHolder.itemContentSecondSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getSecondField()); contentViewHolder.itemContentThirdSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getThirdField());
break; case TYPE_HEADER: HeaderViewHolder headerViewHolder; if (v == null) { v = mInflater.inflate(R.layout.item_header, null);
headerViewHolder = new HeaderViewHolder(); headerViewHolder.itemHeaderTextView = (TextView) v.findViewById(R.id.item_header_text_view); v.setTag(headerViewHolder); } else { headerViewHolder = (HeaderViewHolder) v.getTag(); }
headerViewHolder.itemHeaderTextView.setText(mData.get(position / 4).getHeader());
break; } return v; }
public static class HeaderViewHolder { public TextView itemHeaderTextView; }
public static class ContentViewHolder { public TextView itemContentFirstSubjectTextView; public TextView itemContentSecondSubjectTextView; public TextView itemContentThirdSubjectTextView; } }
Создаем MainActivity
public class MainActivity extends AppCompatActivity { private ArrayList mWeeks;
private CustomAdapter mCustomAdapter; private ListView mListView;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list_view);
ArrayList days = new ArrayList<>();
for(int i=0; i<5; i++) { ArrayList subjects = new ArrayList<>(); for(int j=0; j<4; j++) { subjects.add(new Subject("Header #" + i + ", subject #" + j + ", field #0", "Header #" + i + ", subject #" + j + ", field #1", "Header #" + i + ", subject #" + j + ", field #2")); } days.add(new Day("Header #" + i, subjects)); }
mWeeks = new ArrayList<>(); mWeeks.add(new Week(days));
mCustomAdapter = new CustomAdapter(this, mWeeks.get(0).getDays());
mListView.setAdapter(mCustomAdapter); mCustomAdapter.notifyDataSetChanged(); } }
В итоге получаем такое:

EditText как в vk

Как сделать такую же полосу с кнопками, как в приложении vk при создании поста? Эта панелька еще должна подниматься, когда выдвигается клавиатура, чтобы всегда быть видимой.


Ответ

EditText растянем по ширине и длине экрана, ниже будет синяя панель с 5-ю ImageViewкак на скриншоте. Поменяете картинки, замените на ImageButton и вот вам счастье. Тэг Space должен быть размещен между всеми view, которые нужно выровнить.














Ну и в тэг вашей Activity в AndroidManifest
android:windowSoftInputMode="adjustResize"

Запрос к двум таблицам MySQL

Есть две таблиц.
В одной рубрике объявлений: board_cats со структурой: |cat_id|cat_title|...|
В другой сами объявления: board_items со структурой |item_id|item_title|...|item_cat_id|
выбираю список рубрик по алфавиту
$sql = "SELECT * FROM board_cats ORDER BY cat_title ASC"; $result = $inDB->query($sql) ; if ($inDB->num_rows($result)){ while($item = $inDB->fetch_assoc($result)){ $massiv[] = $item; } }
всё работает, это просто.
Теперь надо к каждой выведенной рубрике добавить счётчик, сколько там объявлений. А вот тут уже я так понимаю нужны JOIN-ы, в которых я пока ни бум-бум, хотя пытался разобраться на примерах.
То есть, логика такая - в board_items ищем объявления, у которых item_cat_id = cat_id, считаем их, и сумму пишем в массив. А вот как это сделать?
Заранее спасибо.


Ответ

Да, всё верно, для этого вам нужно соединение таблиц. Так как не у всех категорий могут быть объявления, рекомендую использовать left join вместо обычного join (почитать про типы соединений можете тут и ещё тут):
select bc.cat_title, count(bi.item_id) from board_cats bc left join board_items bi on bc.cat_id = bi.item_cat_id group by bc.cat_title
Здесь дополнительно идёт группировка по полю bc.cat_title, чтобы можно было использовать агрегатную функцию count
Пример на sqlfiddle

Как проверить “составной” объект на уникальность?

Стоит задача организовать создание и хранение уникальных сборок инструментов. Под сборкой инструмента подразумевается набор уникальных инструментов(фрезы, сверла и т.п.).
Структуру бд я представляю как то так:
Справочник Инструментов; Справочник Сборок; Таблица для связи двух вышеуказанных справочников(многие ко многим: ToolId & AssemblyId)
Сборка считается уникальной на основании инструментов в неё входящих, т.е. не должно быть несколько сборок состоящих из одинаковых позиций.
Например, сборка №1 состоит из следующих позиций, Патрон №1, Фреза №5. Необходимо запретить создание сборок состоящих только из Патрон №1 и Фреза №5 при наличии существующей сборки, но можно создать сборку №2 состоящую из Патрон №1, Фреза №5, Удлинитель №2
Можно ли как то это сделать на стороне бд?


Ответ

Сборки можно хранить в виде дерева, где у каждой сборки будет указан последний инструмент и ссылка на сборку без этого инструмента:
Сборка1 = Сборка2 + Инструмент
Если нет двух одинаковых пар (Сборка, Инструмент) в БД - то все сборки будут уникальными.
create table assemblies ( id bigint identity(0,1) primary key, tool bigint not null foreign key references tools(id), parent bigint null foreign key references assemblies(id),
unique (parent, tool) )
Но тут есть проблема - данное представление будет считать сборки "Инструмент1 + Инструмент2" и "Инструмент2 + Инструмент1" различными. Для того, чтобы проверялась уникальность без учета порядка - надо принудительно упорядочить инструменты внутри сборки по номеру.
Для того, чтобы не пропустить неверно упорядоченные сборки - скопируем поле tool родительской сборки в дочернюю, проверив корректность при помощи составного внешнего ключа:
create table assemblies ( id bigint identity(0,1) primary key, tool bigint not null foreign key references tools(id),
parent bigint null, parenttool bigint null,
-- Две строки ниже нужны чтобы нельзя было установить некорректное значение parenttool foreign key (parent, parenttool) references assemblies(id, tool), check (parent is null and parenttool is null or parent is not null and parenttool is not null),
-- Собственно, проверка уникальности сборок check (tool > parenttool or parenttool is null), unique (parent, tool) )

Не могу разобраться с записью и чтением XML

Есть документ следующего вида:

value value value

value value value

Стоит задача записывать в определенную категорию пару key-value, и также читать из определенной категории такую пару. Я запутался в бесконечных XmlDocument, XPathNavigator и прочем, помогите пожалуйста разобраться.Язык С#.


Ответ

Если не хотите мучиться со всеми особенностями XML-DOM, то попробуйте использовать LiNQtoXML. Пространство имен System.Xml.Linq, Основной рабочий класс - XElement
Загрузка исходного Xml:
var myDoc = XElement.Load("myFile.xml");
Также можно использовать статический метод XElement.Parse(string), если в качестве источника используется строка.
Ищем нужный элемент:
var element = myDoc.Descendants("elementName").FirstOrDefault();
Читаем и пишем значение элемента:
var elValue = element?.Value; element.Value = "newValue";//элемент должен существовать
Читаем и пишем атрибут:
var attrValue = element?.Attribute("attrName")?.Value; element.Attribute("attrName").Value = "newAttrValue";
Добавим вложенный элемент c текстовым значением и атрибутом
element.Add(new XElement("subElement", "value", new XAttribute("attrName","AttrValue"));
Сохраним результат на диск
myDoc.Save("fileName")
Как видите все довольно прозрачно и понятно. XMLtoLiNQ полностью поддерживает классическую XML-DOM, но делает это изящнее чем более старый подход, реализованный в XmlDocument и сопутствующих классах.
Документация по ссылкам ниже содержит примеры в достаточном количестве чтобы разобраться и ссылки на описание сопутствующих классов. Класс XDocument Класс XElement