У меня проблемы с моим приложением. У меня есть TextView, который должен обновлять свой текст в соответствии с положением в списке, я использую RecyclerView с ItemMoveCallback для хранения списка, поддерживающего перетаскивание.
Я не мог понять, как обновить все мои текстовые представления после того, как пользователь заканчивает перетаскивать элементы. Я не знаком с разработкой Android, так что это может быть проще, чем я думал.
Кстати, "Casa" - это название моих объектов.
MainActivity.java
private static final String TAG = "MainActivity";
private android.support.v7.widget.Toolbar toolbar;
private LinearLayoutManager layoutManager;
private ArrayList<Casa> casaArray;
private CasaAdapter adapter;
private RecyclerView recyclerView;
private ItemTouchHelper.Callback callback;
private ItemTouchHelper touchHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate: started.");
initLandscapeLayout();
initToolbar();
initCasaArray();
initRecyclerView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.opcoes_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i;
switch(item.getItemId()) {
case R.id.itemDica:
return true;
case R.id.item2:
return true;
case R.id.item3:
return true;
case R.id.item4:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void initLandscapeLayout(){
Log.d(TAG, "initLandscapeLayout: preparing layout.");
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
private void initToolbar(){
Log.d(TAG, "initToolbar: initiating.");
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
private void initCasaArray(){
Log.d(TAG, "initCasaArray: preparing casaArray.");
casaArray = new ArrayList<Casa>();
for(int i=0; i<5; i++){
casaArray.add(new Casa(i));
Log.d(TAG, "initCasaArray: added casaArray(" + i + ").");
}
Log.d(TAG, "initCasaArray: casaArray initiated.");
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: preparing recyclerview.");
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
adapter = new CasaAdapter(this,casaArray);
callback = new ItemMoveCallback(adapter);
touchHelper = new ItemTouchHelper(callback);
layoutManager = new LinearLayoutManager(this){
@Override
public boolean canScrollHorizontally() {
return false;
}
};
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
touchHelper.attachToRecyclerView(recyclerView);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
Log.d(TAG, "initRecyclerView: chields from recyclerview count: " + recyclerView.getChildCount());
}
}
Casa.java
int pos;
String cor;
String nacionalidade;
String bebida;
String cigarro;
String animal;
public Casa(int pos) {
this.pos = pos;
cor=nacionalidade=bebida=cigarro=animal=null;
}
public Casa(int pos, String cor, String nacionalidade, String bebida, String cigarro, String animal) {
this.pos = pos;
this.cor = cor;
this.nacionalidade = nacionalidade;
this.bebida = bebida;
this.cigarro = cigarro;
this.animal = animal;
}
}
CasaAdapter.java
private static final String TAG = "Adapter";
private Context context;
private ArrayList<Casa> casaArray;
private int viewWidth;
public CasaAdapter(@NonNull Context context, @NonNull ArrayList<Casa> casaArray){
this.context = context;
this.casaArray = casaArray;
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
Log.d(TAG, "CasaAdapter: displayMetrics.widthPixels = " + displayMetrics.widthPixels);
float logicalDensity = displayMetrics.density;
viewWidth = (int) Math.floor((displayMetrics.widthPixels-36*logicalDensity) / 5);
Log.d(TAG, "CasaAdapter: viewWidth has been set to: " + viewWidth);
}
@Override @NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_itemlist,parent,false);
ViewGroup.LayoutParams params = view.getLayoutParams();
Log.d(TAG, "onCreateViewHolder: Parent width is " + params.width);
params.width = viewWidth;
view.setLayoutParams(params);
Log.d(TAG, "onCreateViewHolder: Param width is " + view.getLayoutParams().width);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder: called.");
holder.cor.setSelection(0);
holder.nacionalidade.setSelection(0);
holder.bebida.setSelection(0);
holder.cigarro.setSelection(0);
holder.animal.setSelection(0);
}
@Override
public int getItemCount() {
return casaArray.size();
}
@Override
public void onRowMoved(int fromPosition, int toPosition) {
Log.d(TAG, "onRowMoved: item moved from " + fromPosition + " to " + toPosition + ".");
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(casaArray, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(casaArray, i, i - 1);
}
}
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onRowSelected(ViewHolder ViewHolder) {
}
@Override
public void onRowClear(ViewHolder ViewHolder) {
}
public class ViewHolder extends RecyclerView.ViewHolder{
LinearLayout layout;
TextView casa;
Spinner cor;
Spinner nacionalidade;
Spinner bebida;
Spinner cigarro;
Spinner animal;
AdapterView.OnItemSelectedListener click = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch(position){
case 0:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_grey));
break;
case 1:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_yellow));
break;
case 2:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_blue));
break;
case 3:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_snowwhite));
break;
case 4:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_green));
break;
case 5:
layout.setBackground(ContextCompat.getDrawable(context,R.drawable.border_red));
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
};
public ViewHolder(View itemView) {
super(itemView);
layout =(LinearLayout) itemView.findViewById(R.id.parent_layout);
casa=(TextView) itemView.findViewById(R.id.tvCasa);
cor =(Spinner) itemView.findViewById(R.id.spinnerCor);
nacionalidade =(Spinner) itemView.findViewById(R.id.spinnerNacio);
bebida =(Spinner) itemView.findViewById(R.id.spinnerBebida);
cigarro =(Spinner) itemView.findViewById(R.id.spinnerCigarro);
animal =(Spinner) itemView.findViewById(R.id.spinnerAnimal);
cor.setOnItemSelectedListener(click);
}
public void updateTextView(int pos){
casa.setText(String.format("%s %s",context.getResources().getString(R.string.casa),pos));
}
}
}
ItemMoveCallback.java
private final ItemTouchHelperContract mAdapter;
public ItemMoveCallback(ItemTouchHelperContract adapter) {
mAdapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, 0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
mAdapter.onRowMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof CasaAdapter.ViewHolder) {
CasaAdapter.ViewHolder ViewHolder =(CasaAdapter.ViewHolder) viewHolder;
mAdapter.onRowSelected(ViewHolder);
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (viewHolder instanceof CasaAdapter.ViewHolder) {
CasaAdapter.ViewHolder ViewHolder=
(CasaAdapter.ViewHolder) viewHolder;
mAdapter.onRowClear(ViewHolder);
}
}
public interface ItemTouchHelperContract {
void onRowMoved(int fromPosition, int toPosition);
void onRowSelected(CasaAdapter.ViewHolder ViewHolder);
void onRowClear(CasaAdapter.ViewHolder ViewHolder);
}
}
Я ожидал узнать, куда поместить свой код для обновления TextView из держателя, как я делал это при использовании ListView, но метод onMove просто дает мне начальную и конечную позиции, а не фактические ViewHolders, поэтому я могу изменить визуальные элементы, такие как TextView, используя этот метод, или я могу?
Начальный список
Позиция 1, Позиция 2, Позиция 3
пункт 3 перемещается в позицию элемента 1
Позиция 3, Позиция 1, Позиция 2
Затем обновите TextViews следующим образом:
пункт 1, пункт 2, пункт 3
Элементам в моем списке необходимо динамически изменять их положение, а TextViews должны обновляться, чтобы соответствовать их позиции в списке.