Android - приложение вылетает, если элементов не много - PullRequest
0 голосов
/ 03 мая 2020

Я показываю комментарии к сообщению, используя адаптер утилизатора. Код установлен для прокрутки представления переработчика вниз, когда щелкается текст редактирования, и когда текущий пользователь публикует новый комментарий.

Если отображается клавиатура, а представление переработчика по-прежнему не касается клавиатура (отображается от 2 до 4 комментариев), приложение вылетает при публикации комментария. Если есть много элементов (достаточно до go под клавиатурой), просмотрщик перемотки прокручивается и ничего не вылетает.

Это мой код:

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // some code
            scrollToBottom = true; // this is initially false
            loadComments();

        }
    });

    private void loadComments () {

        Query query = firebaseFirestore.collection...;

        FirestoreRecyclerOptions<Model> options = new FirestoreRecyclerOptions.Builder<Model>()
                .setLifecycleOwner(this)
                .setQuery(query, Model.class)
                .build();

        adapter = new Adapter(options, this);

        recyclerview.setHasFixedSize(true);
        recyclerview.setLayoutManager(new LinearLayoutManager(this));
        recyclerview.setAdapter(adapter);

        if (scrollToBottom) {
            scrollToBottom = false;
            scrollToTheBottom();
        }

    }

    private void scrollToTheBottom() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                recyclerview.smoothScrollToPosition(adapter.getItemCount());
            }
        }, 600);

    }

Код адаптера:

public class Adapter extends FirestoreRecyclerAdapter<Model, Adapter.ViewHolder> {

Context context;
TimeAgo timeAgo;

public Adapter(@NonNull FirestoreRecyclerOptions<Model> options, Context context) {
    super(options);
    this.context = context;
}

@Override
protected void onBindViewHolder(@NonNull final ViewHolder holder, int position, @NonNull Model model) {

    final String userID = model.getUser_id();
    String image = model.getImage();
    String username = model.getUsername();
    String comment = model.getComment();
    Timestamp commentTimeAgo = model.getTimestamp();

    String timestampString = String.valueOf(commentTimeAgo);
    String[] noOpeningParentheses = timestampString.split("\\(");
    String[] noClosingParentheses = noOpeningParentheses[1].split("\\)");
    String[] noCommaAndSpace = noClosingParentheses[0].split(", ");
    String[] secondsFromTimestamp = noCommaAndSpace[0].split("seconds=");
    String[] nanosecondsFromTimestamp = noCommaAndSpace[1].split("nanoseconds=");
    long millis = TimeUnit.SECONDS.toMillis(Long.parseLong(secondsFromTimestamp[1])) + TimeUnit.NANOSECONDS.toMillis(Long.parseLong(nanosecondsFromTimestamp[1]));

    // Applying
    if (image.equals("default")) {
        holder.userImage.setImageResource(R.mipmap.no_image);
    } else {
        Glide.with(context).load(image).into(holder.userImage);
    }
    holder.userUsername.setText(username);
    holder.comment.setText(String.valueOf(comment));
    holder.commentTimeAgo.setText(timeAgo.getTimeAgo(context, millis));

}

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

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem, parent, false);
    context = parent.getContext();
    timeAgo = new TimeAgo();
    return new ViewHolder(view);

}

public class ViewHolder extends RecyclerView.ViewHolder {

    CircleImageView userImage;
    TextView userUsername, comment, commentTimeAgo;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        userImage = itemView.findViewById(R.id.userimage);
        userUsername = itemView.findViewById(R.id.userUsername);
        comment = itemView.findViewById(R.id.comment);
        commentTimeAgo = itemView.findViewById(R.id.timeago);

    }

}

}

При просмотре logcat я получаю сообщение об ошибке в 3-й строке:

String timestampString = String.valueOf(timestamp);
String[] noOpeningParentheses = timestampString.split("\\(");
String[] noClosingParentheses = noOpeningParentheses[1].split("\\)"); // error here
String[] noCommaAndSpace = noClosingParentheses[0].split(", ");
String[] secondsFromTimestamp = noCommaAndSpace[0].split("seconds=");
String[] nanosecondsFromTimestamp = noCommaAndSpace[1].split("nanoseconds=");
long millis = TimeUnit.SECONDS.toMillis(Long.parseLong(secondsFromTimestamp[1])) + TimeUnit.NANOSECONDS.toMillis(Long.parseLong(nanosecondsFromTimestamp[1]));

Это код, который я написал для преобразования поля метки времени пожарного хранилища в миллисекунды.

То, что я получаю в logcat - это что-то вроде java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

Я не знаю, как это решить. Любая помощь, пожалуйста?

1 Ответ

1 голос
/ 03 мая 2020

Заменить:

recyclerview.smoothScrollToPosition(adapter.getItemCount());

на:

int lastIndex = adapter.getItemCount()-1;
if(lastIndex!=-1)
{recyclerview.smoothScrollToPosition(lastIndex);}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...