Изменение видимости элементов в RecyclerView Row OnClick - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующее приложение, над которым я работаю, и которое я пытаюсь сделать так, чтобы при каждом нажатии на изображение в RecyclerView его две соответствующие кнопки из строки xml становились видимыми (по умолчанию они невидимы).

Вот мой код ...

MainAcitivity.Java

    package com.mdadi.animals2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

import static android.view.View.VISIBLE;


public class MainActivity extends AppCompatActivity implements MyAdapter.OnImageListener {

    private RecyclerView list; //RecyclerView instance
    private RecyclerView.Adapter mAdapter; //Adapter
    private RecyclerView.LayoutManager mLayoutManager;
    private ArrayList<ListData> data = new ArrayList<>();
    ListData lastPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Initialize data
        data = ListData.initData();

        final EditText editText = findViewById(R.id.editTxt);

        list = findViewById(R.id.recyclerView); //Lookup RecyclerView in activity layout
        list.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        list.setLayoutManager(mLayoutManager); //Set layout manager to position items/rows

        //Attach adapter to RecyclerView to pop items
        mAdapter = new MyAdapter(data, this);
        list.setAdapter(mAdapter);


/*        findViewById(R.id.delBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String newFact = editText.getText().toString();
                mAdapter.notifyItemInserted(listData.size() - 1);
            }
        });*/
    }

    @Override
    public void onImageClick(int position) {
        int lastPos = position;
        Button delBtn = findViewById(R.id.delBtn);
        Button nextBtn = findViewById(R.id.nextBtn);

        data.remove(R.id.delBtn);
        delBtn.setVisibility(VISIBLE);
        mAdapter.notifyItemChanged(R.id.delBtn);
        nextBtn.setVisibility(VISIBLE);
        mAdapter.notifyItemChanged(R.id.nextBtn);

        Log.d("MyActivity", position + " clicked");
    }
}

MyAdapter.Java

    package com.mdadi.animals2;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    //ViewHolder defined above
    private ArrayList<ListData> data; //ArrayList member var for ListData
    private OnImageListener mOnImageListener;
    //Pass in data array for constructor
    public MyAdapter(ArrayList<ListData> data, OnImageListener onImageListener) {
        this.data = data;
        this.mOnImageListener = onImageListener;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //Inflate custom layout
        View rootView = LayoutInflater.from(parent.getContext()).inflate
                (R.layout.recycler_view_item, parent, false);
        //Return new holder instance
        return new MyViewHolder(rootView, mOnImageListener);
    }
    //Pop data into item through holder
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        //Get data model based on position
        ListData listData = data.get(position);

        //String message = data.get(position).getDesc();
        //holder.textView.setText(message);

        //Set item views based on created views and data
        holder.textView.setText(listData.getDesc());
        holder.img.setImageResource(listData.getImgURL());
    }
    //Return total item count of list
    @Override
    public int getItemCount() {
        if (data != null)
            return data.size();
        else
            return 0;
    }
    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView textView;
        private ImageView img;
        private Button next;
        private Button delete;
        OnImageListener onImageListener;

        public MyViewHolder(View v, OnImageListener onImageListener) {
            super(v);
            textView = v.findViewById(R.id.fact);
            img = v.findViewById(R.id.image);
            next = v.findViewById(R.id.nextBtn);
            delete = v.findViewById(R.id.delBtn);
            this.onImageListener = onImageListener;

            v.setOnClickListener(this);
        }
        public void onClick(View view) {
            onImageListener.onImageClick(getAdapterPosition());
        }
    }

    public interface OnImageListener {
        void onImageClick(int position);
    }
}

ListData.Java

    package com.mdadi.animals2;

import java.util.ArrayList;

public class ListData {
    private String desc;
    private int imgURL;

    public ListData(String desc, int imgURL) {
        this.desc = desc;
        this.imgURL = imgURL;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    public int getImgURL() {
        return imgURL;
    }
    public static ArrayList<ListData> initData() {
        ArrayList<ListData> list = new ArrayList<>();

        list.add(new ListData("bird\n",R.drawable.bird)); //1
        list.add(new ListData("cat\n",R.drawable.cat)); //2
        list.add(new ListData("dog\n",R.drawable.dog)); //3
        list.add(new ListData("fish\n",R.drawable.fish)); //4
        list.add(new ListData("kangaroo\n",R.drawable.kangaroo)); //5
        list.add(new ListData("monkey\n",R.drawable.monkey)); //6
        list.add(new ListData("turtle\n",R.drawable.turtle)); //7
        list.add(new ListData("horse\n",R.drawable.horse)); //8
        list.add(new ListData("elephant\n",R.drawable.elephant)); //9
        list.add(new ListData("turkey\n",R.drawable.turkey)); //10

        return list;
    }
}

Проблема здесь в том, что, хотя он возвращает правильную позицию изображения, по которому щелкнули, в logd, кнопки часто отображаются для неправильной строки.

1 Ответ

0 голосов
/ 01 марта 2019

Вы не опубликовали XML для каждого элемента RecyclerView, но я предполагаю, что у каждой строки будут свои собственные кнопки delBtn и nextBtn, и именно для них вы хотите установить видимость.

Проблема в том, как вы смотрите на эти кнопки.Когда вы делаете следующее в обработчике кликов:

Button delBtn = findViewById(R.id.delBtn);
Button nextBtn = findViewById(R.id.nextBtn);

Вы ищете эти идентификаторы в верхней части иерархии представления и вне границ элемента, по которому щелкнули.Вы действительно хотите выполнить поиск внутри элемента, по которому щелкаете.

Button delBtn = itemView.findViewById(R.id.delBtn);
Button nextBtn = itemView.findViewById(R.id.nextBtn);

Здесь itemView - это макет представления строки, которую можно передать в onImageClick() из onClick().(На самом деле, посмотрите на ваш ViewHolder конструктор, как это сделать.)

Есть несколько других вещей, которые выглядят необычно в вашем коде, например

mAdapter.notifyItemChanged(R.id.delBtn);

аргумент должен быть позицией в массиве data.

...