Есть ли способ обновить каждый TextView из каждого RecyclerViewHolder после перемещения? - PullRequest
0 голосов
/ 07 июня 2019

У меня проблемы с моим приложением. У меня есть 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 должны обновляться, чтобы соответствовать их позиции в списке.

...