Прежде всего, я увидел этот вопрос: Добавление цветного фона с текстом/значком в строке подкачки при использовании утилиты Android RecyclerView
Однако, хотя заголовок содержит "текст/значок", ответ покрывает только объект Canvas
для рисования прямоугольника.
Теперь я рисую зеленый прямоугольник; однако я хочу сделать более очевидным, что произойдет, добавив кнопку "done", как на следующем снимке экрана.
Я создал пользовательский вид:
public class ChoosePlanView extends LinearLayout{
public ChoosePlanView(Context context) {
super(context);
init();
}
public ChoosePlanView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ChoosePlanView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init(){
View v = inflate(getContext(), R.layout.choose_plan_view, null);
addView(v);
}
}
И макет очень прост, состоящий из зеленого фона и значка:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/choose_green">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/doneIcon"
android:layout_gravity="center_horizontal|right"
android:src="@mipmap/done"/>
</LinearLayout>
Я попробовал переопределить метод OnChildDraw
:
// ChoosePlanView choosePlanView; <- that was declared and initialized earlier, so I don't have to create a new ChoosePlanView everytime in OnChildDraw();
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
/*
onMove, onSwiped omitted
*/
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View itemView = viewHolder.itemView;
if(dX < 0){
choosePlanView.invalidate();
//choosePlanView.setBackgroundResource(R.color.delete_red);
choosePlanView.measure(itemView.getWidth(), itemView.getHeight());
choosePlanView.layout(itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom());
c.save();
c.translate(choosePlanView.getRight() + (int) dX, viewHolder.getAdapterPosition()*itemView.getHeight());
choosePlanView.draw(c);
c.restore();
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
И это работает (рисует мой ChoosePlanView
), но есть две проблемы.
Прежде всего, он рисует только маленькую зеленую квадрат, обертывая мою "сделанную" иконку (красная часть вида, изображенная на скриншоте ниже, взята из прокомментированной строки choosePlanView.setBackgroundResource(R.color.delete_red);
). Представление имеет правильную ширину, хотя при проверке в отладчике.
Во-вторых, там, где находится значок. Я указал, что хочу, чтобы он был центрирован по горизонтали и всегда "прилипал" к правой стороне представления. Однако он перемещается, когда элемент RecyclerView
прокручивается, а с красным фоном показывает, что он также не помещается в центр.
Я попытался добавить строку choosePlanView.invalidate()
, потому что я думал, что это происходит, потому что представление было создано ранее, но, похоже, перерисовывание ничего не меняет.