2016-07-18 19 views
5

Derzeit ein Anfänger bei Android-Entwicklung und ich habe einige Übungen/Tutorial hier und da verfolgt und ich habe ein Problem, wo der Abstand zwischen den Elementen in RecyclerView zu weit voneinander entfernt ist im Bild unten gezeigt. Wie erreiche ich es näher beieinander? Ich habe überall gesucht, aber nichts funktioniert.Entfernung zwischen RecyclerView zu weit

BEARBEITEN: Nach dem Ändern android:layout_height = "match_parent" zu android:layout_height = "wrap_content" gibt es noch keine Änderungen am Layout.

So schließe ich meine java Klassen entlang

RecyclerView Screenshot

Hier ist meine .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> 

Hier ist meine java Klassen

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

Leider ist es ein bisschen chaotisch. Ich bin immer noch nicht an die Formatierung gewöhnt.

Antwort

3

In der Datei custom_row_news_items.xml sollte android:layout_height="match_parent"android:layout_height="wrap_content sein. Aufgrund von match_parent nimmt es den Platz des gesamten Bildschirms ein. Denken Sie immer daran, dass die einzelne Zeile für die Recycleransicht die Höhe wrap_content haben sollte, wenn sie vertikal angeordnet ist.

Sie können auch versuchen, die recyclerview Höhe Breite Parameter

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

ich, dass ich spekulierte zu ändern, weil Ihre Höhe Inhalt wickeln gesetzt, es wird nur eine einzige Reihe nehmen. Aber mit match_parent wird es so viele wie möglich auf dem Bildschirm empfangen.

+0

Hallo und danke für Ihre Antwort. Dank deiner Erklärung habe ich jetzt mehr Verständnis dafür, wie es funktioniert. Aber auch nach dem Wechsel von "android: layout_height" ist immer noch eine große Lücke dazwischen. Vielleicht stimmt etwas mit meinem Java nicht? –

+0

Bitte verstehen Sie auch, wie Sie den Parameter align in relativen Layouts verwenden. Sie haben 'title_text' alignBottom mit' thumb_img' angegeben, aber beide haben 'layout_width =" match_parent "'. Das bedeutet, dass die Textansicht und die Bildansicht in derselben Zeile sind und die gesamte Bildschirmbreite einnehmen. Dies kann nicht möglich sein. Aber es gibt keinen Fehler, trotzdem ist es falsch das zu tun – suku

+0

Danke, ich sollte mehr über die Syntax lernen. Es ist jetzt gelöst. Einen schönen Tag noch :) –

1

Ändern Sie Ihre custom_row_news_items.xml wie folgt.

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

die als wrap_contentRelativeLayout Höhe Eltern ein. Momentan ist es auf match_parent eingestellt, was die Räume belegt.

+0

Hallo und danke. Ich habe deine Lösung versucht, aber das Problem bleibt bestehen. Ich habe meinen Java-Code miteingeschlossen und dachte, dass die Quelle des Problems von dort stammen könnte. –

2

ändern Sie einfach Ihre übergeordnete Layouthöhe von android:layout_height="match_parent" zu android:layout_height="wrap_content und es wird Ihr Problem lösen, da Ihr Container Zeilenlayout wrap_content hat und Ihr Zeilenlayout versucht, die Höhe des übergeordneten zu füllen, wird es einen Vollbild füllen, und Ihre einzige Die Komponente hat eine volle Höhe des Bildschirms eingenommen.

Änderungen in der Reihe Layout:

<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

Hallo und vielen Dank für Ihre Hilfe. Ich habe es versucht, aber nichts scheint sich zu ändern. Es ist immer noch eine große Lücke dazwischen. Ich poste meine Java-Klasse und denke, dass das Problem von dort stammen könnte. –

1

Dies geschieht auch, wenn Sie die RelativeLayout ‚s Höhe wrap_content weil RelativeLayout nicht weiß, ändern, wie hoch sich sein sollte.

Stellen Sie die Höhe RelativeLayout auf wrap_content ein und versuchen Sie Folgendes zu der letzten TextView hinzuzufügen.

android:layout_alignParentBottom="true" 

Dies teilt die RelativeLayout ‚s Boden mit dem letzten TextView, so dass nun der RelativeLayout weiß wo enden ausgerichtet werden.

Verwandte Themen