2016-07-18 130 views
5

Attualmente un principiante nello sviluppo di Android e ho seguito alcuni esercizi/tutorial qua e là e sto affrontando un problema in cui la distanza tra gli elementi in RecyclerView è troppo distanziata l'una dall'altra mostrato nella foto qui sotto. Come posso renderlo più vicino l'un l'altro? Ho cercato tutto ma niente funziona.Distanza tra RecyclerView troppo lontano

MODIFICA: Dopo aver modificato android:layout_height = "match_parent" in android:layout_height = "wrap_content", non sono ancora presenti modifiche al layout.

Così ho includere il mio java classi insieme

RecyclerView Screenshot

Ecco il mio .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> 

Ecco il mio java classi

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); 
    } 
} 
} 

Ci dispiace ma è un po 'disordinato. Non sono ancora abituato alla formattazione qui.

risposta

3

Nel file custom_row_news_items.xml, android:layout_height="match_parent" deve essere android:layout_height="wrap_content. A causa di match_parent, occupa lo spazio dell'intero schermo. Ricorda sempre che l'unica riga per il riciclaggio deve avere l'altezza wrap_content se ha un layout verticale.

Si può anche provare a modificare i parametri di larghezza altezza recyclerview a

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

Sono speculazioni che, poiché l'altezza è impostato per avvolgere il contenuto, è solo prendendo una singola riga. Ma con match_parent, sarà in grado di accogliere il maggior numero possibile sullo schermo.

+0

Ciao e grazie per la risposta. Grazie alla tua spiegazione ora ho più comprensione di come funziona. Ma anche dopo aver cambiato 'android: layout_height' ha ancora un grande divario nel mezzo. Forse c'è qualcosa di sbagliato con il mio Java, invece? –

+0

Inoltre, ti preghiamo di capire come usare il parametro align in relativelayouts. Hai detto 'title_text' alignBottom con' thumb_img', ma entrambi hanno 'layout_width =" match_parent "'. Ciò significa che la vista testo e la vista immagine sono entrambe nella stessa riga e occupano la larghezza totale dello schermo. Questo non può essere possibile. Ma non sta dando alcun errore, tuttavia è sbagliato farlo – suku

+0

Grazie, dovrei imparare di più sulla sintassi. È risolto ora. Buona giornata :) –

1

Modificare il numero custom_row_news_items.xml come segue.

<?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> 

Impostare il genitore RelativeLayout altezza wrap_content. Attualmente è impostato su match_parent che sta prendendo gli spazi.

+0

Ciao e grazie. Ho provato la tua soluzione ma il problema rimane. Ho incluso il mio codice java pensando che la fonte del problema potesse provenire da lì. –

2

basta cambiare l'altezza di layout genitore dall'essere android:layout_height="match_parent"-android:layout_height="wrap_content e sarà risolvere il tuo problema, come il vostro contenitore di layout di riga è wrap_content e il layout di fila cerca di far corrispondere l'altezza di un genitore si riempirà a schermo intero, e il vostro unico componente ha preso una piena altezza dello schermo.

cambiamenti nel layout di fila:

<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> 
+0

Ciao e grazie per il tuo aiuto. Ci ho provato ma nulla sembra cambiare. C'è ancora un grosso divario tra questo. Inserisco la mia lezione di java pensando che il problema potrebbe essere originato da lì. –

1

Questo sta accadendo anche quando si cambia l'altezza s' il RelativeLayout-wrap_content perché RelativeLayout non sa quanto alto sé dovrebbe essere.

Impostare l'altezza di RelativeLayout su wrap_content e provare ad aggiungere quanto segue all'ultimo TextView.

android:layout_alignParentBottom="true" 

Questo dice in basso s' il RelativeLayout per essere allineato con l'ultimo TextView, così ora il RelativeLayout sa dove alla fine.