Я сделал приложение для новостной ленты, и я использовал ресивлер, чтобы показать изображения, но между двумя изображениями есть большой разрыв, как показано на скриншоте ниже. Я попытался использовать украшение элемента RecyclerView, но оно не сработало. Я также дал код моего feedFragment и feedAdapter. Пожалуйста, помогите
![enter image description here](https://i.stack.imgur.com/NZOD3.jpg)
feedFragment
package com.example.fireapp;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.fireapp.Adapter.feedAdapter;
import com.example.fireapp.model.Image;
import com.example.fireapp.model.Users;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import static android.app.Activity.RESULT_OK;
public class feedFragment extends Fragment {
Button uploadButton;
private int PICK_IMAGE_REQUEST = 7;
private Uri uri;
Bitmap bitmap;
StorageReference storageReference;
String downloadUrl;
DatabaseReference reference;
FirebaseAuth mAuth;
FirebaseUser mUser;
RecyclerView recyclerView;
RecyclerView.LayoutManager mLayoutManager;
feedAdapter mAdapter;
ArrayList<Image> images = new ArrayList<>();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_feed,container,false);
//upload image
uploadButton=view.findViewById(R.id.uploadButton);
uploadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
});
//save image to database
mAuth = FirebaseAuth.getInstance();
mUser = mAuth.getCurrentUser();
reference = FirebaseDatabase.getInstance().getReference();
//setup recycler view
recyclerView=view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
mLayoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(mLayoutManager);
mAdapter = new feedAdapter(images, this);
recyclerView.setAdapter(mAdapter);
//get the latest images
Query imagesQuery = reference.child("Feed_Images").orderByKey().limitToFirst(100);
imagesQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
final Image image = dataSnapshot.getValue(Image.class);
//get the image user
reference.child("User/"+image.userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Users user = dataSnapshot.getValue(Users.class);
image.user = user;
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mAdapter.addImage(image);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
//get extension of file
public String GetFileExtension(Uri uri) {
ContentResolver contentResolver = getActivity().getApplicationContext().getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}
//select image
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
uri = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getApplicationContext().getContentResolver(), uri);
} catch (Exception e) {
}
if (uri != null) {
//this is for image file name
storageReference = FirebaseStorage.getInstance().getReference().child("Feed_Image");
final StorageReference filepath = storageReference.child(System.currentTimeMillis() +
"." + GetFileExtension(uri));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 25, baos);
byte[] dataa = baos.toByteArray();
UploadTask uploadTask = filepath.putBytes(dataa);
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
downloadUrl=uri.toString();
String key=reference.child("Feed_Images").push().getKey();
Image image = new Image(key,mUser.getUid(),downloadUrl);
reference.child("Feed_Images").child(key).setValue(image);
Toast.makeText(getContext(), "Upload successful!", Toast.LENGTH_SHORT).show();
//Toast.makeText(accountActivity.this, "success!", Toast.LENGTH_SHORT).show();
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Upload failed!", Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(getContext(), "Error! Please try again!", Toast.LENGTH_SHORT).show();
}
}
}
}
feedAdapter
package com.example.fireapp.Adapter;
import android.content.Context;
import android.graphics.Rect;
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 androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.fireapp.R;
import com.example.fireapp.feedFragment;
import com.example.fireapp.model.Image;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class feedAdapter extends RecyclerView.Adapter<feedAdapter.ViewHolder> {
private ArrayList<Image> mDataset;
private feedFragment mfeedFragment;
public feedAdapter(ArrayList<Image> myDataset, feedFragment feedFragment) {
mDataset=myDataset;
mfeedFragment=feedFragment;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ImageView mImageView;
public Button mLikeButton;
public ViewHolder(View v){
super(v);
mTextView = v.findViewById(R.id.textView2);
mImageView = v.findViewById(R.id.imageView);
mLikeButton=v.findViewById(R.id.likeButton);
}
}
@NonNull
@Override
public feedAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_image,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull feedAdapter.ViewHolder holder, int position) {
final Image image = mDataset.get(position);
if (image.user != null) {
holder.mTextView.setText(image.user.username);
}
Picasso.get().load(image.downloadUrl).fit().into(holder.mImageView);
}
@Override
public int getItemCount() {
return mDataset.size();
}
public void addImage(Image image){
mDataset.add(0,image);
notifyDataSetChanged();
}
}
feed_image. xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:adjustViewBounds="true" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="246dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:textSize="20dp"
android:maxLines="1"
android:text="sample text"
android:layout_below="@+id/imageView"/>
<Button
android:id="@+id/likeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView"
android:layout_alignParentEnd="true"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:text="Like" />
</RelativeLayout>