Как .RequestFocus на последний добавленный элемент EditView в просмотре карты в обзоре recyler? - PullRequest
0 голосов
/ 30 января 2020

enter image description here

Я прочитал многочисленные темы и документацию по моей проблеме с различными решениями и перепробовал множество их безрезультатно.

У меня есть просмотр карты в обзоре переработчика. Cardview содержит EditView и 1 изображение. За пределами обзора переработчика у меня есть кнопка «Добавить игроков».

ЦЕЛЬ: Нажмите кнопку «Добавить игроков». Добавьте просмотр карты в просмотр рециркулятора, который имеет EditView и 1 Image, и ЗАПРОСИТЕ ФОКУС на EDITVIEW недавно добавленной карты в обзоре реселлера.

Пока что код, который я написал, работает до тех пор, пока вы не добавите 4-ую карту. После добавления 4-го вида карты FOCUS переходит в CardView 1, а не 4-й.

Кнопка Добавить код игрока

    btnAddPlayer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


               RecyclerData mLog = new RecyclerData();
                mLog.setPlayerName(playerName);

                playerListArray.add(mLog);
                mRecyclerAdapter.notifyData(playerListArray);


//                mRecyclerView.scrollToPosition(playerListArray.size()-1);
//                mRecyclerView.smoothScrollToPosition(playerListArray.size()-1);


            }
        });
    }

Код адаптера для добавления нового игрока CardView

public class PlayerListAdapter extends RecyclerView.ViewHolder {



        private final EditText playerNameEditText;
        private LinearLayout mainLayout;
        public ImageView deleteImage;
        public PlayerListAdapter(@NonNull View itemView) {
            super(itemView);


            playerNameEditText = itemView.findViewById(R.id.txtPlayersName);
            //playerNameEditText.requestFocus(getAdapterPosition());
            playerNameEditText.requestFocus(mLastPosition);



            playerNameEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    playerListArray.get(getAdapterPosition()).setPlayerName(playerNameEditText.getText().toString());
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });

Как вы можете видеть в приведенных выше 2 фрагментах кода, я пробовал другие варианты, и ни один из них не работает.

Как я уже говорил, мое решение работает, но только для первых 3, после этого оно бесполезно, и как только вы go пропустите 4-й пункт, тогда возникает спораци c относительно того, кто действительно получит фокус .

ПОЛНЫЙ КОД АДАПТЕРА

public class Adapter extends RecyclerView.Adapter<Adapter.PlayerListAdapter> {

    private static final String LOG_TAG = Adapter.class.getSimpleName() ;
    private ArrayList<RecyclerData> playerListArray;
    int mLastPosition = 0;

    private RemoveClickListner mListner;



    public Adapter(ArrayList<RecyclerData> playerListArray, RemoveClickListner mListner) {
        this.playerListArray = playerListArray;
        this.mListner = mListner;
    }

    @NonNull
    @Override
    public PlayerListAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item,
                    parent,
                false);

        PlayerListAdapter viewHolder = new PlayerListAdapter(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull PlayerListAdapter holder, int position) {

        Log.d("His problem here is:  ", playerListArray.size() + "");
        RecyclerData playerData = playerListArray.get(position);
        Log.d("Title is:  ", playerData.playerName + "");
        mLastPosition = position;

        holder.playerNameEditText.setText(playerData.playerName);
        holder.playerNameEditText.setHint("Player: " + (position + 1));
        holder.deleteImage.setImageResource(R.drawable.delete);





    }

    public void notifyData(ArrayList<RecyclerData> playerListArray) {

        this.playerListArray = playerListArray;
        Log.d("notifyData ", playerListArray.size() + "");
        notifyDataSetChanged();
    }


    @Override
    public int getItemCount() {

          return(null != playerListArray?playerListArray.size():0);
        }

    public class PlayerListAdapter extends RecyclerView.ViewHolder {



        private final EditText playerNameEditText;
        private LinearLayout mainLayout;
        public ImageView deleteImage;
        public PlayerListAdapter(@NonNull View itemView) {
            super(itemView);


            playerNameEditText = itemView.findViewById(R.id.txtPlayersName);
            //playerNameEditText.requestFocus(getAdapterPosition());
            //playerNameEditText.requestFocus(mLastPosition);



            playerNameEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    playerListArray.get(getAdapterPosition()).setPlayerName(playerNameEditText.getText().toString());
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });





            deleteImage = (ImageView) itemView.findViewById(R.id.deleteimage);


            deleteImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mListner.OnRemoveClick(getAdapterPosition());
                }
            });
        }
    }


}

ПОЛНЫЙ КОД ОСНОВНОЙ АКТИВНОСТИ

public class MainActivity extends AppCompatActivity implements RemoveClickListner{

    private RecyclerView mRecyclerView;
    private Adapter mRecyclerAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    Button btnAddPlayer;
    ArrayList<RecyclerData> playerListArray = new ArrayList<>();

    String playerName = "";
    ImageView deleteImage;






    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = findViewById(R.id.recyclerView);
        mRecyclerAdapter = new Adapter(playerListArray,this);



        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(), 2);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mRecyclerAdapter);



               if (mRecyclerAdapter.getItemCount() == 0 || mRecyclerAdapter.getItemCount() == NULL){
            Toast.makeText(getApplicationContext(),"ZERO ITEMS LISTED",Toast.LENGTH_SHORT).show();
        }

        btnAddPlayer = (Button) findViewById(R.id.btnAddPlayer);

        btnAddPlayer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


               RecyclerData mLog = new RecyclerData();
                mLog.setPlayerName(playerName);

                playerListArray.add(mLog);
                mRecyclerAdapter.notifyData(playerListArray);


//                mRecyclerView.scrollToPosition(playerListArray.size()-1);
//                mRecyclerView.smoothScrollToPosition(playerListArray.size()-1);


            }
        });
    }


    @Override
    public void OnRemoveClick(int index) {
        playerListArray.remove(index);
        mRecyclerAdapter.notifyData(playerListArray);
    }


}

1 Ответ

0 голосов
/ 30 января 2020

in OnBindViewHolder метод RecyclerView.Adapter , вы не должны немедленно вызывать фокус запроса, потому что происходит, когда вы вызываете requestFocus для edittext , он не закончил рисование, поэтому игнорирует, поэтому вы можете разместить код requestFocus в обработчике mainThread, как это

@Override
public void onBindViewHolder(@NonNull PlayerListAdapter holder, int position) {

    Log.d("His problem here is:  ", playerListArray.size() + "");
    RecyclerData playerData = playerListArray.get(position);
    Log.d("Title is:  ", playerData.playerName + "");
    mLastPosition = position;

    holder.playerNameEditText.setText(playerData.playerName);
    holder.playerNameEditText.setHint("Player: " + (position + 1));
    holder.deleteImage.setImageResource(R.drawable.delete);

    if(position == this.getItemCount() - 1) {
        holder.playerNameEditText.post(new Runnable() {
            @Override
            public void run() {
                //do check some condition for which item it has to be shown.
                playerNameEditText.requestFocus()
            }
        });
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...