Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Distance between RecyclerView too far

Currently a beginner at android development and I've been following some exercises/tutorial here and there and I'm facing a problem where the distance between in items in RecyclerView is too far apart from each other as shown in the picture below. How do I make it closer to each other? I've been searching all over but nothing works.

EDIT : After changing android:layout_height = "match_parent" to android:layout_height = "wrap_content"there is still no changes to the layout.

So I include my java classes along

RecyclerView Screenshot

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 is 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 it is a little bit messy. I'm still not used to the formatting here.

like image 512
azriebakri Avatar asked Jul 18 '16 18:07

azriebakri


People also ask

How to reduce space between RecyclerView in android?

Try to use cardElevation=0dp. This should remove the extra spacing between recyclerview items.

How do you make a RecyclerView more performant?

If the size of ImageView in RecyclerView items is not fixed then RecyclerView will take some time to load and adjust the RecyclerView item size according to the size of Image. So to improve the performance of our RecyclerView we should keep the size of our ImageView to make it RecyclerView load faster.


1 Answers

In the custom_row_news_items.xml, android:layout_height="match_parent" should be android:layout_height="wrap_content. Because of match_parent, it is taking the space of the entire screen. Always remember that the single row for recyclerview should have height wrap_content if it has vertical layout.

You can also try to change the recyclerview height width parameters to

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

I am speculating that because your height is set to wrap content, it is only taking a single row. But with match_parent, it will accomodate as many as it can on the screen.

like image 154
suku Avatar answered Oct 17 '22 19:10

suku