Distance between RecyclerView is too far

Currently a novice android development developer, and I am following some exercises / tutorials here and there, and I ran into a problem when the distance between elements in RecyclerView is too far apart, as shown in the figure below, How to make it closer to each other to a friend? I searched everything but nothing works.

EDIT: After changing android:layout_height = "match_parent" to android:layout_height = "wrap_content" there are no changes in the layout yet.

So, I am including java classes along

Screenshot RecyclerView

Here is my .xml

custom_row_news_items.xml

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/date_text" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <ImageView android:src="@drawable/img" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/thumb_img" android:layout_below="@+id/date_text" android:layout_centerHorizontal="true" /> <TextView android:background="#006699" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/title_text" android:layout_alignBottom="@+id/thumb_img" android:layout_centerHorizontal="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/des_text" android:layout_below="@+id/thumb_img" android:layout_centerHorizontal="true" /> </RelativeLayout> 

content_navigation_drawer.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/app_bar_navigation_drawer" tools:context="com.example.azrie.dummyvoicethenews.NavigationDrawer"> <android.support.v7.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/recyclerView"/> </RelativeLayout> 

Here are my java classes

NavigationDrawer.java

 import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.widget.RecyclerView; import android.view.View; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; public class NavigationDrawer extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); RSSread rssRead; rssRead = new RSSread(this,recyclerView); rssRead.execute(); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.navigation_drawer, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } } 

RSSread.java

 public class RSSread extends AsyncTask{ Context context; ProgressDialog progressDialog; //RSS address String address = "https://www.sciencemag.org/rss/news_current.xml"; URL url; //Global initialization for other class to access ArrayList<FeedItem> feedItems; RecyclerView recyclerView; public RSSread(Context context, RecyclerView recyclerView){ //Initialize recycle view this.recyclerView = recyclerView; //Initialize progress dialog this.context = context; progressDialog = new ProgressDialog(context); progressDialog.setMessage("Loading...."); } @Override protected void onPreExecute() { //display progress dialog before fetching data progressDialog.show(); super.onPreExecute(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); //dismiss the "Loading..." progress dialog progressDialog.dismiss(); MyAdapter adapter = new MyAdapter(context,feedItems); recyclerView.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setAdapter(adapter); } @Override protected Object doInBackground(Object[] objects) { ProcessXml(Getdata()); return null; } private void ProcessXml(Document data) { //If data is present or not = null if(data!=null){ //ArrayList is created to store every item into a single item feedItems = new ArrayList<>(); //Return document element name that is RSS ( Exercise Part 1 ) //Log.d("Root", data.getDocumentElement().getNodeName()); //Element object that store "Root" element Element root = data.getDocumentElement(); //Items are inside channel and channel tag is first child of root tag Node channel = root.getChildNodes().item(1); //Store all child of channel element NodeList items = channel.getChildNodes(); //Loop through each child of element //Output testing //Log.d("ItemsLength",Integer.toString(items.getLength())); for (int i = 0; i < items.getLength(); i++){ //Create new node that will store data Node currentChild = items.item(i); //Check currentChild node is item node if (currentChild.getNodeName().equalsIgnoreCase("item")){ //Create a new feed item for every item FeedItem item = new FeedItem(); //Exercise Part 2 : How to process data NodeList itemChild = currentChild.getChildNodes(); //Loop through all childs with item tag for(int j = 0; j < itemChild.getLength(); j++){ Node current = itemChild.item(j); //Display context of Node Current ( Exercise Part 1 : How to process data ) //Log.d("textContent",current.getTextContent()); //check for node title node if(current.getNodeName().equalsIgnoreCase("title")){ //Set title from FeedItem into current title item.setTitle(current.getTextContent()); //Output test Log.d("CurrentItemTitle",current.getTextContent()); } else if(current.getNodeName().equalsIgnoreCase("description")){ //Set description from FeedItem into current description item.setDescr(current.getTextContent()); //Output test Log.d("CurrentItemDesp",current.getTextContent()); } else if(current.getNodeName().equalsIgnoreCase("pubDate")){ //Set pubDate from FeedItem into current pubDate item.setPubDate(current.getTextContent()); //Output test Log.d("CurrentItemPubDate",current.getTextContent()); } else if(current.getNodeName().equalsIgnoreCase("link")){ //Set link from FeedItem into current link item.setLink(current.getTextContent()); //Output test Log.d("CurrentItemLink",current.getTextContent()); } else if(current.getNodeName().equalsIgnoreCase("media:thumbnail")){ String url = current.getAttributes().item(0).getTextContent(); item.setThumbnailUrl(url); //Output test Log.d("CurrentItemThumbnailUrl",current.getTextContent()); } } feedItems.add(item); Log.d("ItemTitle",item.getTitle()); Log.d("ItemDescription",item.getDescr()); Log.d("ItemLink",item.getLink()); Log.d("ItemPubDate",item.getPubDate()); Log.d("ItemThumbnailUrl",item.getThumbnailUrl()); } } } } //method that return Document type public Document Getdata(){ try { //Passing the string to URL (From Address) url = new URL(address); //Open connection HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream inputStream = connection.getInputStream(); //Create new instance of document build DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); //Return XML document Document xmlDoc = builder.parse(inputStream); //Return xmlDoc return xmlDoc; } catch (Exception e) { e.printStackTrace(); return null; } } } 

MyAdapter.java

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { ArrayList<FeedItem> feedItems; Context context; public MyAdapter(Context context,ArrayList<FeedItem> feedItems){ this.feedItems = feedItems; this.context = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.custom_row_news_items,parent,false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { } @Override public int getItemCount() { return feedItems.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View itemView) { super(itemView); } } } 

Sorry, this is a little dirty. I still do not use formatting here.

+5
source share
4 answers

In custom_row_news_items.xml android:layout_height="match_parent" should be android:layout_height="wrap_content . Due to match_parent, it takes up the entire screen space. Always remember that one row for recyclerview should have wrap_content height if it has a vertical layout.

You can also try changing the recyclerview height width options to

  android:layout_width="match_parent" android:layout_height="match_parent" 

I speculate that since your height is set to wrap content, it only takes one line. But with match_parent it will place as much as possible on the screen.

+3
source

just change the height of your parent layout from android:layout_height="match_parent" to android:layout_height="wrap_content , and this will solve your problem, since your line layout container has wrap_content and your line layout tries to match the height of the parent, it will fill the full screen. and your only component has taken up the entire height of the screen.

changes in the layout of the lines:

 <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/date_text" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <ImageView android:src="@drawable/img" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/thumb_img" android:layout_below="@+id/date_text" android:layout_centerHorizontal="true" /> <TextView android:background="#006699" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/title_text" android:layout_alignBottom="@+id/thumb_img" android:layout_centerHorizontal="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/des_text" android:layout_below="@+id/thumb_img" android:layout_centerHorizontal="true" /> </RelativeLayout> 
+2
source

Modify custom_row_news_items.xml as follows.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/date_text" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <ImageView android:src="@drawable/img" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/thumb_img" android:layout_below="@+id/date_text" android:layout_centerHorizontal="true" /> <TextView android:background="#006699" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/title_text" android:layout_alignBottom="@+id/thumb_img" android:layout_centerHorizontal="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/des_text" android:layout_below="@+id/thumb_img" android:layout_centerHorizontal="true" /> </RelativeLayout> 

Set the parent height of the RelativeLayout as wrap_content . It is currently set to match_parent , which accepts spaces.

+1
source

This happens even when you change the height of the RelativeLayout to wrap_content , because the RelativeLayout does not know how tall it is in itself.

Set the RelativeLayout height to wrap_content and try adding the following to the last TextView .

 android:layout_alignParentBottom="true" 

This means that the bottom of the RelativeLayout aligned with the last TextView , so now the RelativeLayout knows where to stop.

+1
source

All Articles