Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: RecyclerView Adapter

Пример классического создания адаптера RecyclerView
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
public class UserDialogRecyclerAdapter extends RecyclerView.Adapter<UserDialogRecyclerAdapter.ViewHolder> {
 
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView vBodyMSG;
        public ImageView vBodyImageView;
        public ViewHolder(View v) {
            super(v);
            vBodyMSG = (TextView) v.findViewById(R.id.user_dialog_textView);
            vBodyImageView = (ImageView) v.findViewById(R.id.user_dialog_ImageView);        }
}
    public UserDialogRecyclerAdapter(Context context, JSONArray istemsJson) {
        messJson = istemsJson;
        mContext = context;
        count = messJson.length();
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_dialog_user, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        //остальной код создания адаптеров....
Собственно вопрос.
Использую я этот код для диалога. и по классике сообщения от меня по левому краю, сообщения от оппонента по правому краю. То же самое и с аватаркой моей и оппонента (моя слева от текста, оппонента справа).
Пробовал играться с программным изменением Layouta но все превращается в кашу и прыгает в непонятном направлении.
Можно использовать 2 адаптера и если можно то как?


Ниже приведу пример как я "играюсь" с Лайаутом. Может тут что не так.

Java
1
2
3
4
5
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            if(postJson.getString("out").equals("1"))
                lp.gravity = Gravity.RIGHT;
            else {lp.gravity = Gravity.CENTER_VERTICAL;}
            holder.vLinerLayout.setLayoutParams(lp);
Ответ:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        List<Message> messages = new ArrayList<>();
        messages.add(new Message("in", "Что делаешь?"));
        messages.add(new Message("in", "Не молчи!!!"));
        messages.add(new Message("in", "ты где???????"));
        messages.add(new Message("out", "шо надо?"));
 
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv);
        recyclerView.setAdapter(new RvAdapter(messages));
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        recyclerView.setHasFixedSize(true);
    }
}
пример адаптер, минимум кода
Кликните здесь для просмотра всего текста
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
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import java.util.List;
 
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.Holder> {
 
    private final static int TYPE_IN = 42;
    private final static int TYPE_OUT = 43;
    private final List<Message> list;
 
    public RvAdapter(List<Message> list) {
        this.list = list;
    }
 
    @Override
    public int getItemCount() {
        return list == null ? 0 : list.size();
    }
 
    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int type) {
        View v = LayoutInflater.from(parent.getContext()).inflate(type == TYPE_IN ? R.layout.in_item : R.layout.out_item, parent, false);
        return new Holder(v);
    }
 
    @Override
    public void onBindViewHolder(Holder holder, int pos) {
        final Message msg = list.get(pos);
        holder.textView.setText(msg.text);
    }
 
    @Override
    public int getItemViewType(int pos) {
        return list.get(pos).dir.equals("in") ? TYPE_IN : TYPE_OUT;
    }
 
    static class Holder extends RecyclerView.ViewHolder {
 
        TextView textView;
 
        public Holder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.msgTv);
        }
    }
}


разметки для in out айтемов, тоже пример
Кликните здесь для просмотра всего текста
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
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
 
    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        app:cardCornerRadius="16dp">
 
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:padding="8dp">
 
            <ImageView
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:src="@drawable/circle_in" />
 
            <TextView
                android:id="@+id/msgTv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dp"
                android:layout_marginStart="16dp"/>
 
        </LinearLayout>
 
    </android.support.v7.widget.CardView>
 
</FrameLayout>

Кликните здесь для просмотра всего текста
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
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
 
    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_margin="8dp"
        app:cardCornerRadius="16dp">
 
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:padding="8dp">
 
            <TextView
                android:id="@+id/msgTv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dp"
                android:layout_marginStart="16dp"/>
 
            <ImageView
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:src="@drawable/circle_out" />
 
        </LinearLayout>
 
    </android.support.v7.widget.CardView>
 
</FrameLayout>


моделька, пример
Java
1
2
3
4
5
6
7
8
9
10
public class Message {
 
    final String dir;
    final String text;
 
    public Message(String dir, String text) {
        this.dir = dir;
        this.text = text;
    }
}
Вопрос: RecyclerView фиксированый height

Мне кажется много кто встречался с данной проблемой.
у меня есть корзина, в ней RecyclerView с фиксированой высотой. (что бы там 3 карточки масимум вмещались)
под ним находится цена. И вот когда карточек не 3 а одна, из за того что размер RecyclerView фиксированый цена так и висит на том же месте(далеко от карточки,не очень естетично)
- wrap_content решает данную ситуацию, но к сожелению нету такого свойства как maxheight который бы ограчинил высоту(мне же только надо максимум 3 показывать карточки,и включать прокрутку если больше)
на картинке показано как выглядит 1карточка(совсем неочень)
Ответ: господи, та шо там сложного
пример активити
Кликните здесь для просмотра всего текста
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
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
 
public class MainActivity extends AppCompatActivity implements View.OnLayoutChangeListener {
 
    private static final int MAX_ITEMS = 3;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final RecyclerView rv = (RecyclerView) findViewById(R.id.rv);
        rv.setAdapter(new CustomAdapter());
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.addOnLayoutChangeListener(this);
    }
 
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        final RecyclerView rv = (RecyclerView) v;
        if (rv.getChildCount() > 0) {
            final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) rv.getLayoutParams();
            final Rect r = new Rect();
            rv.getDecoratedBoundsWithMargins(rv.getChildAt(0), r);
            lp.height = r.height() * MAX_ITEMS;
        }
    }
}

разметка активити, пример тоже
Кликните здесь для просмотра всего текста
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:subtitle="Subtitle"
        app:title="Title" />
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_below="@+id/rv"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:text="Цена: 100 000$" />
 
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_margin="16dp"
        app:fabSize="auto" />
 
</RelativeLayout>

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

Всем привет. Изучаю Android. Разрабатываю первое приложение. Создал список с помощью Recyclerview. Возникла проблема. После записи данных в БД новый пункт появляется только после перезапуска приложения. Объясните пожалуйста в теории как заставить обновляться этот список.

Код проекта:
Ответ: А можно немного подробнее? Нашел некоторую информацию об использовании этого метода. Попробовал использовать. Планировал что при удалении данных из БД список сразу обновится (метод onOptionsItemSelected). Не работает. Объясните пожалуйста что делаю не так.

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
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
package info.devbanha.smartwallet.activity;
 
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
 
import java.util.ArrayList;
import java.util.List;
 
import info.devbanha.smartwallet.R;
import info.devbanha.smartwallet.adapters.RecyclerViewAdapter;
import info.devbanha.smartwallet.data.ItemData;
import info.devbanha.smartwallet.data.database.DataBaseController;
import info.devbanha.smartwallet.data.database.ItemDB;
import info.devbanha.smartwallet.tag.Tags;
 
public class MainActivity extends AppCompatActivity {
 
    private TextView textView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private DataBaseController db;
    private Tags tag = new Tags();
    private List<ItemData> itemData = new ArrayList<>();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = (TextView) findViewById(R.id.textViewAnim);
 
        db = new DataBaseController(this, tag.NAME_DB(), null, tag.VERSION_DB());
 
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
 
        recyclerViewAdapter = new RecyclerViewAdapter(getItemData());
        recyclerView.setLayoutManager(linearLayoutManager);
 
        List<ItemDB> itemDBs = db.getAllItems();
        for (ItemDB it : itemDBs) {
            addData(it.getDbName(), it.getDbPrice(), it.getDbComment());
        }
 
        recyclerView.setAdapter(recyclerViewAdapter);
 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
 
    private void deleteDB() {
        db.deleteAll();
    }
 
    public void addData(String name, Double price, String category) {
        itemData.add(new ItemData(name, price, category));
    }
 
    public List<ItemData> getItemData() {
        return itemData;
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(tag.MAIN_ACTIVITY_TAG(), "onResume");
        recyclerViewAdapter.notifyDataSetChanged();
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                deleteDB();
                Log.i(tag.MAIN_ACTIVITY_TAG(), "action settings");
                recyclerViewAdapter.notifyDataSetChanged();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
 
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.fab:
                Intent intent = new Intent(this, InputActivity.class);
                startActivity(intent);
                break;
            case R.id.textViewAnim:
                Animation anim;
                anim = AnimationUtils.loadAnimation(this, R.anim.anim_alpha);
                textView.startAnimation(anim);
                break;
        }
    }
}
Вопрос: RecyclerView

Скажите что делаю не так.
Цель: выводить содержимое бд заголовок, текст и т.п.
Как я делал, точнее по гайдам.
Тут из базы передаю данные title
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
public class RemindDTO {
 
    DB db;
 
    private String title;
 
    public RemindDTO(String title) {
        this.title = title;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = String.valueOf(db.getTitleDB());
    }
}
Выборка из бд
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
public Cursor getTitleDB()
    {
        return mDB.query(DB_TABLE, new String[]{COLUMN_TITLE}, null, null, null, null, null);
    }
тут как я понял все заполняем в лист и передаем в RecyclerView. 99% что косяк мой в public List<RemindDTO> RemindListAdapter()
но ругается на getItemCount()

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class RemindListAdapter extends RecyclerView.Adapter<RemindListAdapter.RemindViewHolder> {
 
    DB db;
 
    private List<RemindDTO> data;
 
    public List<RemindDTO> RemindListAdapter()
    {
        List<RemindDTO> data = new ArrayList<>();
 
        data.add((RemindDTO) db.getTitleDB());
 
        this.data = data;
        return data;
    }
 
 
 
    @Override
    public RemindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.remind_item, parent, false);
 
        return new RemindViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(RemindViewHolder holder, int position) {
        RemindDTO item = data.get(position);
        holder.title.setText(item.getTitle());
 
    }
 
    @Override
    public int getItemCount() {
        return data.size();
    }
 
    public static class RemindViewHolder extends RecyclerView.ViewHolder {
 
        private CardView cardView;
        private TextView title;
 
        public RemindViewHolder(View itemView) {
            super(itemView);
 
            cardView = (CardView) itemView.findViewById(R.id.cardView);
            title = (TextView) itemView.findViewById(R.id.title);
        }
    }
 
}
ну и собственно заполнение
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
@Nullable
    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
 
        view = inflater.inflate(LAYOUT,container, false);
        RecyclerView rv = (RecyclerView) view.findViewById(R.id.recycleView);
        rv.setLayoutManager(new LinearLayoutManager(context));
        rv.setAdapter(new RemindListAdapter());
 
        return view;
    }
Если найдет человек которому будет не лень разобрать в это чуде, буду очень благодарен.
Ответ:
Кликните здесь для просмотра всего текста
FATAL EXCEPTION: main
Process: com.diplom.sportclub, PID: 22428
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.diplom.sportclub.adapter.RemindListAdapter.getItemCount(RemindListAdapter.java:52)
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2556)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17430)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1489)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:610)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:677)
at android.view.View.measure(View.java:17430)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:940)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17430)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
at android.view.View.measure(View.java:17430)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Вопрос: Как определить что элемент recyclerview пересекает при перемещении регион кнопки

У меня есть recyclerview а внизу экрана есть кнопка. На recyclerview повешен TouchListener и у него есть метод public boolean onTouch(View v, MotionEvent event) в котором определяются события перетаскивания ну типа как здесь
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
 photoList.setLayoutManager(mLayoutManager);
        photoList.setAdapter(adapter);
       // photoList.setOnDragListener(this);
        adapter.update(photo);
        setRecyclerViewListener();
        final Rect rect;
        final int top = getActivity().findViewById(R.id.trash_can).getTop();
        rect = new Rect(getActivity().findViewById(R.id.trash_can).getLeft(), getActivity().findViewById(R.id.trash_can).getTop(), getActivity().findViewById(R.id.trash_can).getRight(),getActivity().findViewById(R.id.trash_can).getBottom());
        photoList.setOnTouchListener(new View.OnTouchListener() {
 
 
            @Override
            public boolean onTouch(View v, MotionEvent event) {
 
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    
 
                }
                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    
 
                    }
                }
                return false;
            }
        });
и вот я хочу определить момент когда перетаскиваемый элемент списка пересечет границы кнопки, которая внизу экрана и в этот момент например поменять цвет кнопки. Как это сделать? Как здесь расчитать координаты, ну этот момент?

Добавлено через 6 минут
То есть определить когда перетаскиваемый item recyclerview пересечет регион кнопки
Ответ: спасибо

Добавлено через 23 часа 37 минут
Еще такой вопрос. Как показано на скрине выше, картинка, когда мы ее перетаскиваем на кнопку,накладывается на эту кнопку сверху. А у меня в разметке получается, что кнопка накладывается на recyclerview и поэтому картинка при перетаскивании через кнопку проходит как бы под кнопкой, а должна над этой кнопкой. Как такое можно реализовать?
Вопрос: Как развернуть RecyclerView

Делаю свой месседжер и столкнулся с проблемой, как развернуть RecyclerView (на подобии сообщений в ВК)
у меня есть идея, вставлять элементы на 0е место, но не могу найти как это сделать.
Ответ:
Сообщение от kair32
вставлять элементы на 0е место
0-е это сверху) тебе , если я правельно понял нужно снизу/ по этому его нужно развернутЬ это делается так:
XML
1
2
3
4
5
<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView" 
        android.support.v7.recyclerview:stackFromEnd ="true"/>
или так
Java
1
2
3
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
далее, чтоб добавить в нужную позицию, просто делаем так
Java
1
2
mArrayList.add(position, item);
notifyItemInserted(position);
где mArrayList это массив в адаптере

Добавлено через 48 секунд
и да. мысль изложена кривовато
Вопрос: Как настроить RecyclerView ?

При загрузке с сети информации в RecyclerView помещается по 100 элементов, сделал так что при достижении конца списка загружается еще 100 и так далее.

Но при добавлении новых записей список автоматично сбрасывается на начало списка. А мне нужно чтоб он оставался на месте, и записи просто добавлялись, но ничего со списком не происходило!

Вопрос:
Как сделать так, чтоб RecyclerView открывался в заданной позиции (ну или при изменении не бежал в начало )?
Ответ:
Сообщение от prokopov
Как сделать так, чтоб RecyclerView открывался в заданной позиции (ну или при изменении не бежал в начало )?
так он и не бежит в начало, скорее всего вы вместо того что бы добавить данные и обновить адаптер, создаете новый адаптер
Вопрос: Фиксированный Footer внизу экрана в RecyclerView

Как добавить фиксированный Footer в RecyclerView, чтобы скрол списка не влиял на этот Footer(то есть Footer всегда показывается внизу экрана и не скролится вместе со списком). Как такое реализовать?

Добавлено через 43 секунды
Нужен именно вариант с RecyclerView.
Ответ: Просто если добавлять Footer он становится последним элементом recyclerview, а я хочу чтобы он всегда висел в заданной позиции внизу экрана не зависимо от скрола самого списка. Помогите с реализацией.

Добавлено через 28 секунд
Хорошо Паблито, попробую сейчас
Вопрос: Не могу обновить RecyclerView после изменения item

данные для списка берутся из Firebase,

у DatabaseReference//Firebase, есть два метода:

onChildAdd и onChildChanged, первый возвращает все айтемы второй только изменяемый айтем.

и проблема том что после изменения item в RecyclerView появляется еще один, т.е. видны оба и измененный и его старая версия.

в вышеприведенных методах везде стоит Adapter.notifyDataSetChanged()

помогите, как побороть эту проблему?
Ответ: Spelcrawler, да добавляет

Нужно удалять старый перед добавлением или просто изменять его.
так не могу понять как это сделать, если удалять, получается удалять надо именно item в адаптере (ну в базе-то нового объекта не создается, просто меняются значения старого), а изменять тоже не получается организовать т.к.

в диалоге по клику отправляю объекту в базе новые значения:
Java
1
2
SearchList searchList = new SearchList(itemKey, title, number, additions, pincode, comment);
                            mDatabase.child("users").child(mUserId).child("items" + itemKey).setValue(searchList);
, где itemKey это key редактируемого объекта.

далее здесь:
Java
1
2
3
4
5
6
7
8
9
10
@Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
 
                       // stringUpdate = dataSnapshot.getKey().toString();
                    SearchList searchList = dataSnapshot.getValue(SearchList.class);
 
                    data.add(searchList);
                    Log.d("DisLog", "itemKey "+itemKey);
                        mAdapter.notifyDataSetChanged();
                   }
получаем "снимок" базы и отправляем в data, и визуально в списке появляется измененный айтем, но старый остается (оcтается только визуально в RecyclerView, не в базе).

т.е. было:
1
2
редактирую второй, и получается:
1
2
22

но в базе айтема со значением 2 уже нету, есть только 1 и 22.

Вот в чем проблема.

Добавлено через 19 часов 48 минут
Spelcrawler,
Нужно удалять старый перед добавлением
не понимаю почему сам до такого не мог неделю додуматься , просто не подумал что можно добавлять новую запись с сохранением одинакового itemKey.

Все получилось .
Вопрос: Динамическая смена макета RecyclerView

Добрый день!

Есть Activity с ViewPager из 2 страниц (фрагмент один). В фрагмент, в зависимости от номера страницы, вставляется список RecyclerView, в каждом элементе которого есть изображение. Удерживая изображение можно менять порядок расположения элементов.

В меню есть пункт "Delete". Задумка такая: по нажатию Delete из меню, изображения для перетаскивания элементов заменяются изображениями для удаления (крестик, например). С какой стороны подходить к решению данного вопроса пока не очень понимаю.

1) возможно ли динамически менять адаптер? Тогда через него загружать разметку с кнопкой удаления.
2) разместить на макете сразу оба изображения и одно из них изначально скрыть, а потом менять их видимость. Но тут не очень понимаю как ее менять, ведь обработка нажатий на кнопки меню в Activity, а адаптер во фрагменте.

В общем заранее благодарен за возможные идеи
Ответ:

Не по теме:

ну я просто подтвердил слова :)

Сообщение от Hugonavy
Или слишком тупая?
я щас не конкретно про эту тему, но
не буду скрывать, что меня тригерит каждый раз когда приходится людям объяснять что recyclerview чуть ли не самый универсальный виджет
на нем практически все что угодно можно вымостить, надо просто немного времени потратить на изучение