Я хочу, чтобы мой recyclerview
мог показывать сообщение с изображением или без него, в зависимости от ввода пользователя. В настоящий момент, когда я нажимаю на сообщение ссылка , не прикрепляя изображение, появляется диалоговое окно с надписью "image required
".
Все работает отлично, за исключением того, что я не могу опубликовать заголовок и описание только как показано на изображениях ниже
1 и 2
Я хочу, чтобы, когда я размещал только текст, он проходил и избавлялся от пространства изображения, которое есть, если это возможно.
MainActivity code
public class MainActivity extends BaseActivity<MainView, MainPresenter> implements MainView {
private PostsAdapter postsAdapter;
private RecyclerView recyclerView;
private FloatingActionButton floatingActionButton;
private TextView newPostsCounterTextView;
private boolean counterAnimationInProgress = false;
private ProgressBar progressBar;
private SwipeRefreshLayout swipeContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
initContentView();
}
@Override
protected void onResume() {
super.onResume();
presenter.updateNewPostCounter();
}
@NonNull
@Override
public MainPresenter createPresenter() {
if (presenter == null) {
return new MainPresenter(this);
}
return presenter;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case ProfileActivity.CREATE_POST_FROM_PROFILE_REQUEST:
refreshPostList();
break;
case CreatePostActivity.CREATE_NEW_POST_REQUEST:
presenter.onPostCreated();
break;
case PostDetailsActivity.UPDATE_POST_REQUEST:
presenter.onPostUpdated(data);
break;
}
}
}
@Override
public void onBackPressed() {
attemptToExitIfRoot(floatingActionButton);
}
public void refreshPostList() {
postsAdapter.loadFirstPage();
if (postsAdapter.getItemCount() > 0) {
recyclerView.scrollToPosition(0);
}
}
@Override
public void removePost() {
postsAdapter.removeSelectedPost();
}
@Override
public void updatePost() {
postsAdapter.updateSelectedPost();
}
@Override
public void showCounterView(int count) {
AnimationUtils.showViewByScaleAndVisibility(newPostsCounterTextView);
String counterFormat = getResources().getQuantityString(R.plurals.new_posts_counter_format, count, count);
newPostsCounterTextView.setText(String.format(counterFormat, count));
}
private void initContentView() {
if (recyclerView == null) {
progressBar = findViewById(R.id.progressBar);
swipeContainer = findViewById(R.id.swipeContainer);
initFloatingActionButton();
initPostListRecyclerView();
initPostCounter();
}
}
private void initFloatingActionButton() {
floatingActionButton = findViewById(R.id.addNewPostFab);
if (floatingActionButton != null) {
floatingActionButton.setOnClickListener(v -> presenter.onCreatePostClickAction(floatingActionButton));
}
}
private void initPostListRecyclerView() {
recyclerView = findViewById(R.id.recycler_view);
postsAdapter = new PostsAdapter(this, swipeContainer);
postsAdapter.setCallback(new PostsAdapter.Callback() {
@Override
public void onItemClick(final Post post, final View view) {
presenter.onPostClicked(post, view);
}
@Override
public void onListLoadingFinished() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onAuthorClick(String authorId, View view) {
openProfileActivity(authorId, view);
}
@Override
public void onCanceled(String message) {
progressBar.setVisibility(View.GONE);
showToast(message);
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(this));
((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
recyclerView.setAdapter(postsAdapter);
postsAdapter.loadFirstPage();
}
private void initPostCounter() {
newPostsCounterTextView = findViewById(R.id.newPostsCounterTextView);
newPostsCounterTextView.setOnClickListener(v -> refreshPostList());
presenter.initPostCounter();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
hideCounterView();
super.onScrolled(recyclerView, dx, dy);
}
});
}
@Override
public void hideCounterView() {
if (!counterAnimationInProgress && newPostsCounterTextView.getVisibility() == View.VISIBLE) {
counterAnimationInProgress = true;
AlphaAnimation alphaAnimation = AnimationUtils.hideViewByAlpha(newPostsCounterTextView);
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
counterAnimationInProgress = false;
newPostsCounterTextView.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
alphaAnimation.start();
}
}
@SuppressLint("RestrictedApi")
@Override
public void openPostDetailsActivity(Post post, View v) {
Intent intent = new Intent(MainActivity.this, PostDetailsActivity.class);
intent.putExtra(PostDetailsActivity.POST_ID_EXTRA_KEY, post.getId());
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View imageView = v.findViewById(R.id.postImageView);
View authorImageView = v.findViewById(R.id.authorImageView);
ActivityOptions options = ActivityOptions.
makeSceneTransitionAnimation(MainActivity.this,
new android.util.Pair<>(imageView, getString(R.string.post_image_transition_name)),
new android.util.Pair<>(authorImageView, getString(R.string.post_author_image_transition_name))
);
startActivityForResult(intent, PostDetailsActivity.UPDATE_POST_REQUEST, options.toBundle());
} else {
startActivityForResult(intent, PostDetailsActivity.UPDATE_POST_REQUEST);
}
}
public void showFloatButtonRelatedSnackBar(int messageId) {
showSnackBar(floatingActionButton, messageId);
}
@Override
public void openCreatePostActivity() {
Intent intent = new Intent(this, CreatePostActivity.class);
startActivityForResult(intent, CreatePostActivity.CREATE_NEW_POST_REQUEST);
}
@SuppressLint("RestrictedApi")
@Override
public void openProfileActivity(String userId, View view) {
Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
intent.putExtra(ProfileActivity.USER_ID_EXTRA_KEY, userId);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && view != null) {
View authorImageView = view.findViewById(R.id.authorImageView);
ActivityOptions options = ActivityOptions.
makeSceneTransitionAnimation(MainActivity.this,
new android.util.Pair<>(authorImageView, getString(R.string.post_author_image_transition_name)));
startActivityForResult(intent, ProfileActivity.CREATE_POST_FROM_PROFILE_REQUEST, options.toBundle());
} else {
startActivityForResult(intent, ProfileActivity.CREATE_POST_FROM_PROFILE_REQUEST);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.profile:
presenter.onProfileMenuActionClicked();
return true;
case R.id.churchWebsite:
Intent churchWebsite = new Intent(this, CitadelWebsite.class);
startActivity(churchWebsite);
return true;
case R.id.search:
Intent searchIntent = new Intent(this, SearchActivity.class);
startActivity(searchIntent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
BaseCreatePostActivity
public abstract class BaseCreatePostActivity<V extends BaseCreatePostView, P extends BaseCreatePostPresenter<V>>
extends PickImageActivity<V, P> implements BaseCreatePostView {
protected ImageView imageView;
protected ProgressBar progressBar;
protected EditText titleEditText;
protected EditText descriptionEditText;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_create_post_activity);
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
titleEditText = findViewById(R.id.titleEditText);
descriptionEditText = findViewById(R.id.descriptionEditText);
progressBar = findViewById(R.id.progressBar);
imageView = findViewById(R.id.imageView);
imageView.setOnClickListener(v -> onSelectImageClick(v));
titleEditText.setOnTouchListener((v, event) -> {
if (titleEditText.hasFocus() && titleEditText.getError() != null) {
titleEditText.setError(null);
return true;
}
return false;
});
}
@Override
protected ProgressBar getProgressView() {
return progressBar;
}
@Override
protected ImageView getImageView() {
return imageView;
}
@Override
protected void onImagePikedAction() {
loadImageToImageView(imageUri);
}
@Override
public void setDescriptionError(String error) {
descriptionEditText.setError(error);
descriptionEditText.requestFocus();
}
@Override
public void setTitleError(String error) {
titleEditText.setError(error);
titleEditText.requestFocus();
}
@Override
public String getTitleText() {
return titleEditText.getText().toString();
}
@Override
public String getDescriptionText() {
return descriptionEditText.getText().toString();
}
@Override
public void requestImageViewFocus() {
imageView.requestFocus();
}
@Override
public void onPostSavedSuccess() {
setResult(RESULT_OK);
this.finish();
}
@Override
public Uri getImageUri() {
return imageUri;
}
}
BaseCreatePostPresenter (я пытался использовать здесь оператор if, но он не работал)
public abstract class BaseCreatePostPresenter<V extends BaseCreatePostView> extends PickImagePresenter<V> implements OnPostCreatedListener {
protected boolean creatingPost = false;
protected PostManager postManager;
public BaseCreatePostPresenter(Context context) {
super(context);
postManager = PostManager.getInstance(context);
}
@StringRes
protected abstract int getSaveFailMessage();
protected abstract void savePost(final String title, final String description);
protected abstract boolean isImageRequired();
protected void attemptCreatePost(Uri imageUri) {
// Reset errors.
ifViewAttached(view -> {
view.setTitleError(null);
view.setDescriptionError(null);
String title = view.getTitleText().trim();
String description = view.getDescriptionText().trim();
boolean cancel = false;
if (TextUtils.isEmpty(description)) {
view.setDescriptionError(context.getString(R.string.warning_empty_description));
cancel = true;
}
if (TextUtils.isEmpty(title)) {
view.setTitleError(context.getString(R.string.warning_empty_title));
cancel = true;
} else if (!ValidationUtil.isPostTitleValid(title)) {
view.setTitleError(context.getString(R.string.error_post_title_length));
cancel = true;
}
if (isImageRequired() && view.getImageUri() == null) {
view.showWarningDialog(R.string.warning_empty_image);
view.requestImageViewFocus();
cancel = true;
}
if (!cancel) {
creatingPost = true;
view.hideKeyboard();
savePost(title, description);
}
});
}
public void doSavePost(Uri imageUri) {
if (!creatingPost) {
if (hasInternetConnection()) {
attemptCreatePost(imageUri);
} else {
ifViewAttached(view -> view.showSnackBar(R.string.internet_connection_failed));
}
}
}
@Override
public void onPostSaved(boolean success) {
creatingPost = false;
ifViewAttached(view -> {
view.hideProgress();
if (success) {
view.onPostSavedSuccess();
LogUtil.logDebug(TAG, "Post was saved");
} else {
view.showSnackBar(getSaveFailMessage());
LogUtil.logDebug(TAG, "Failed to save a post");
}
});
}
}