Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как отделить группу элементов в recycler view?

например:
===================
new---
d f g h
--------//как сделать такой разделитель(как divideitemdecoration, но только для 1-го ряда)
d d d d
s s y e
e f g h
===================
буквы d s y и т.д. здесь - это элементы recycleview
Ответ: по уму надо делать так
сделать отдельную вью для этого элемента.
по простому можно в имеющемся вью внизу создать разделитель . и в онбаинд спрашивать, если позиция 0, покажи разделитель, иначе не показывать
Вопрос: Как сохранить фокус в пределах одной View

Требуется сделать управление компонентом с помощью стрелок клавиатуры или D-Pad джойстиком, подключенным к устройству.
Управляться будет компонент, написанный на Canvas. Проблема в том, что при нажатии на стрелки клавиатуры моя View теряет фокус и перескакивает на другие элементы интерфейса. Как можно запретить изменять фокус по нажатию на стрелки?

p.s. вариант сделать всем другим View focusable=false не подходит, навигация по ним тоже нужна
Ответ: Нет, мне нужно сделать навигацию внутри моей кастомной View, которую я рисую на Canvas. И это отдельно от навигации по остальному приложению.
Собственно, оказалось достаточным переопределить два метода

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return true;
    }
 
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return true;
    }
Вопрос: Как создать spinner внутри recycler view?

необходимо реализовать выпадающий список внутри recycler view. может, кто сталкивался с подобным или есть идеи, как это можно сделать, буду благодарен за помощь)
Ответ:
Вопрос: Рамки вокруг view

Можно ли сделать рамки вокруг view или imageView ? Подобно методу setBorder в swing или еще что-нибудь.
Ответ: можно просто ставить нужную картинку на background ImageView
типа такой, это будет рамка в 2dp толщиной
XML
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <stroke
        android:width="2dp"
        android:color="@color/colorAccent" />
</shape>
а вообще лучше писать что надо конкретно сделать, вопрос слишком абстрактный
Вопрос: Передать dialogInterface во View

В AlertDialog через setView устанавливаю форму с полями. Нужно по нажатию кнопки при правильно заполненной форме закрыть диалог, а при ошибке сообщить об ошибке, не закрывая диалог. Проблема в том, что стандартные setPositiveButton и др. кнопки закрывают диалог в любом случае, даже если у них в onClick не прописано ни cancel(), ни dismiss(). Я поставил кнопку на view, но не знаю, как передать в неё dialogInterface, чтобы закрыть диалог по её нажатии
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
//View, передаваемый в диалог
final View adView = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.house_info, null);
//кнопка проверки и сохранения данных
Button btnApplyHouse = (Button) adView.findViewById(R.id.btn_house_apply);
btnApplyHouse.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      //
      //Проверка текстовых полей формы, при ошибке выводится Toast и вызывается return
      //Если всё заполнено правильно, данные сохраняются, после чего нужно закрыть диалог
      //Для закрывания диалога сюда нужно передать dialogInterface
      //
   }
});
new AlertDialog.Builder(context)
.setCancelable(true)
.setIcon(R.mipmap.house)
.setTitle("Добавить дом")
.setNegativeButton("Закрыть", new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialogInterface, int i) {
      dialogInterface.cancel();//Даже без этой строки кнопка закрывает диалог
   }
})
.setView(adView)
.create().show();
Ответ: Я сделал с тремя EditText, думаю остальные добавить не будет проблема.
Если мне не изменяет память, то такое решение poup window подсказал Паблито.
П.С. Для TextInputLayout нужно в gradle добавить compile 'com.android.support:design:24.2.0'

Popup Window:
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
public class PopupWindow {
 
    private static AlertDialog dialog;
    private static EditText edt_name;
    private static EditText edt_price;
    private static EditText edt_paid;
    private static ICommunicator listiner;
 
 
    public static AlertDialog create(final Context context) {
        final View view = View.inflate(context, R.layout.popup_window, null);
        dialog = new AlertDialog.Builder(context).setView(view).create();
        dialog.setCancelable(false);//Если не нужно модальное поведение диалога, удалить эту строку
        listiner =(ICommunicator) context;
        edt_name=(EditText)view.findViewById(R.id.edt_name);
        edt_price=(EditText)view.findViewById(R.id.edt_price);
        edt_paid=(EditText)view.findViewById(R.id.edt_paid);
        Button btn_add_house=(Button)view.findViewById(R.id.btn_add_house);
        Button btn_dismiss=(Button)view.findViewById(R.id.btn_dismiss);
 
        btn_dismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
 
        btn_add_house.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name=edt_name.getText().toString();
                String price=edt_price.getText().toString();
                String paid=edt_paid.getText().toString();
                if(TextUtils.isEmpty(name)||TextUtils.isEmpty(price)||TextUtils.isEmpty(paid)){
                    Toast.makeText(context, "Отсутствует один из параметров", Toast.LENGTH_SHORT).show();
                }
                else{
                    if(listiner !=null)
                        listiner.onResult(name,price,paid);
                    dialog.dismiss();
                }
            }
        });
        setStyle(dialog);
        return dialog;
    }
 
    private static void setStyle(AlertDialog dialog) {
        Window window = dialog.getWindow();
        WindowManager.LayoutParams wlp = window.getAttributes();
        wlp.gravity = Gravity.CENTER;
        window.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        window.setAttributes(wlp);
    }
 
    public interface ICommunicator {
        void onResult(String name, String price, String paid);
    }
}
Main activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MainActivity extends AppCompatActivity implements PopupWindow.ICommunicator {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn=(Button)findViewById(R.id.btn);
 
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                PopupWindow.create(MainActivity.this).show();
            }
        });
    }
 
    @Override
    public void onResult(String name, String price, String paid) {
        Toast.makeText(MainActivity.this, "Name:"+name+"\nPrice: "+price+"\nPaid:"+paid, Toast.LENGTH_SHORT).show();
    }
}
popup_window.xml

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rounded_popup_window"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:gravity="center"
        android:text="Добавить дом"/>
 
    <android.support.design.widget.TextInputLayout
        android:id="@+id/til_name"
        android:hint="Название"
        style="@style/MyTextInputLayout">
 
        <android.support.design.widget.TextInputEditText
            android:id="@+id/edt_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.design.widget.TextInputLayout>
 
    <android.support.design.widget.TextInputLayout
        android:id="@+id/til_price"
        android:hint="Цена"
        style="@style/MyTextInputLayout">
 
        <android.support.design.widget.TextInputEditText
            android:id="@+id/edt_price"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.design.widget.TextInputLayout>
 
    <android.support.design.widget.TextInputLayout
        android:id="@+id/til_paid"
        android:hint="Оплачено"
        style="@style/MyTextInputLayout">
 
        <android.support.design.widget.TextInputEditText
            android:id="@+id/edt_paid"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.design.widget.TextInputLayout>
 
    <Button
        android:id="@+id/btn_add_house"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Добавить дом"/>
    <Button
        android:id="@+id/btn_dismiss"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Закрыть"/>
</LinearLayout>
rounded_popup_window.xml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:bottomRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp" />
    <solid android:color="@color/colorPrimary" />
    <stroke
        android:width="1dp"
        android:color="#EEEEEE"/>
    <padding
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp" />
</shape>
Вопрос: Отображение View по условиям

Здравствуйте, вопрос такой, можно ли при разных условиях отображать или не отображать разные view с настройками в activity? Поясню, например с сервера пришла информация о том, что поле не заполнено и отображается (картинка или текст) что нет, а если все в порядке, то галочка или да? ну так с простого если начать.... ) может коряво написала, не ругайтесь
Или сделать checkbox или radiobuttom?
Ответ:
Сообщение от Zul-ya
например с сервера пришла информация о том, что поле не заполнено и отображается (картинка или текст) что нет, а если все в порядке, то галочка или да?
Вы вот вообще сами понимаете, что тут написано ?
Сообщение от Zul-ya
можно ли при разных условиях отображать или не отображать разные view с настройками в activity?
В activity только один view, речь идет наверно о его компонентах, типа кнопок, списков, картинок ? Если так, то да, можно.
Вопрос: Как создать список (ListView) с динамическим количеством передаваемых View?

Доброго времени суток!
Такая проблема:
Требуется создать список к примеру через SimpleAdapter в котором неизвестно сколько будет View:
т.к. view будут создаваться программно и их неизвестно сколько я не знаю как их определить в адаптере, там требуется массив id указывающих на view (new int[])
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
      SimpleAdapter adapter = new SimpleAdapter(activity, mCatList,
                R.id.listView, new String[]{Name1,Name2,Name3....},
                new int[]{R.id.view1, R.id.view2.....}); //(Как сюда передать View созданные программно или нужно использовать какие то другие конструкторы списков? )
Ответ: Да sqlite.
Имееться таблица :
id type
1 text
2 Image
3 button
4 text
...
Это вьюхи одного элемента списка.
Далее цикл for (по этим записям БД)
Java(TM) 2 Platform Standard Edition 5.0
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
{switch (type){
case "image":
ImageView iv =new ImageView(this);
//Что то типо list.add(iv);
break;
case "text":
TextView tv =new TextView(this);
//Что то типо list.add(tv);
break;
case "button":
Button bt =new Button(this);
//Что то типо list.add(bt);
break;
}
}
В итоге получаем к примеру список:
---------------------------------------------------------------------------------------
 
TextView(id=1)
                                        Button(id=3)                 ImageView(id=2)
TextView(id=4)
---------------------------------------------------------------------------------------
 
TextView(id=1)
                                        Button(id=3)                 ImageView(id=2)
TextView(id=4)
---------------------------------------------------------------------------------------
 
TextView(id=1)
                                        Button(id=3)                 ImageView(id=2)
TextView(id=4)
---------------------------------------------------------------------------------------
Естественно с разными значениями(Для этого есть другая таблица)

Добавлено через 14 минут
Из ссылки что ты мне кинул
Есть что то по этой части :
No xml version
If You choose to create view in Java instead of defining it in xml Your newView method will be a bit more complex, but You don't need inflater instance.
For example if Your list will have only one text value to display it could look like this.

public class CustomCursorAdapter extends CursorAdapter {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
TextView content = new TextView(context);
content.setTag("content");
return content;
}
Вопрос: Скопировать view

Привет.

Как скопировать view(любой компонент от view) с одного layuot на другой без удаления, тоесть хочу создать клона только сменив ему id и расположение на экране, а всё остальное оставить от исходного, например scr у imageView?

Спасибо.
Ответ: создать новый, и переложить в него атрибуты.
Вопрос: Как сделать последний пустой элемент в RecyclerView для прокрутки

Доброго дня.
Необходимо сделать сделать следующее поведение прокручиваемого списка. Описать словами и представить это можно следующим образом: есть прокручиваемый список Recycler View (на самом деле его модификация но надеюсь это будет не принципиально). По клику на какой-нибудь элементу списка в нижней части должно появляться прозрачная View с парой кнопок, такой свой маленький кастомный тулбар. Всё вышеописанное реализовано, но последний элемент списка становится недоступен для нажатия, тулбар полностью закрывает его. Сразу приходят на помощь два варианта из тех что понятно как реализовать, но один из них не подходит если делать всё со 100% дизайна а другой - костыль.

1. При появлении нижнего тулбара программно перестраивать расположение RecyclerView выше над тулбаром. Но в таком случае элементы списка вообще не прокручиваются под тулбаром.

2. Добавлять пустой прозрачный последний элемент в список равный высоте тулбара, но это кажется каким-то костылём.

Есть ли какой-нибудь способ сделать так что бы:
  • тулбар остался поверх списка
  • при достижении последнего элемента он прокручивался выше тулбара
  • не добавлять костыль - последний пустой элемент
Ответ: Разместить тулбар в верхней части списка при клике на последние элементы.
Вопрос: Grid Recycler view скачет

При открытии экрана с ресайклер вью с грид лейаут менеджер, ресайклер вью появляется не плавно а скачками, как будто притормаживает. Почему это происходит? и как от этого избавиться? (перестать програмировать не вариант)
Ответ: Не думаю, что еще актуально, но может кому пригодится Попробуйте использовать уникальные id предметов: в конструктор адаптера добавить
Java
1
setHasStableIds(true);
а также переопределить метод
Java
1
getItemId(int position)
Важно, чтобы возвращаемый методом id был уникальным для каждого объекта данных, то есть это может быть, например, id объекта или хэш ключа.
Как-то так:
Java
1
2
3
4
@Override
    public long getItemId(int position) {
        return mItems.get(position).getName().hashCode();
    }