2016-07-18 13 views
5

Obecnie początkujący w rozwoju Androida i byłem tu kilka ćwiczeń/tutorial tu i tam i mam do czynienia z problemem, w którym odległość między w pozycji w RecyclerView jest zbyt daleko od siebie, jak pokazano na poniższym obrazku. Jak mogę się do siebie zbliżyć? Szukałem wszędzie, ale nic nie działa.Odległość między RecyclerView zbyt daleko

EDYCJA: Po zmianie android:layout_height = "match_parent" na android:layout_height = "wrap_content" nadal nie ma zmian w układzie.

Więc to moje java klas wraz

RecyclerView Screenshot

Oto moja .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> 

Oto moje java klas

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

Przepraszamy, ale jest trochę brudny. Wciąż nie jestem przyzwyczajony do tego formatowania.

Odpowiedz

3

W pliku custom_row_news_items.xml, android:layout_height="match_parent" powinno być android:layout_height="wrap_content. Ze względu na match_parent, zajmuje przestrzeń całego ekranu. Zawsze pamiętaj, że pojedynczy wiersz do recyclerview powinien mieć wysokość wrap_content, jeśli ma układ pionowy.

Można także spróbować zmienić parametry Szerokość Wysokość recyclerview do

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

Jestem spekulacje, że ponieważ wysokość jest ustawiona na owinąć treści, to trwa tylko jeden wiersz. Ale z match_parent, będzie pomieścić tyle, ile może na ekranie.

+0

Witam i dziękuję za odpowiedź. Teraz dzięki waszemu wyjaśnieniu lepiej rozumiem, jak to działa. Ale nawet po zmianie 'android: layout_height' nadal ma dużą lukę pomiędzy. Może coś jest nie tak z moją Javą? –

+0

Proszę również zrozumieć, jak używać parametru wyrównania w relatywnych wersjach. Powiedziałeś "title_text' alignBottom z' thumb_img', ale oba mają 'layout_width =" match_parent "'. Oznacza to, że widok tekstowy i widok obrazu są w tym samym rzędzie i zajmują całkowitą szerokość ekranu. To nie może być możliwe. Ale to nie daje żadnego błędu, nadal jest to niewłaściwe – suku

+0

Dziękuję, powinienem dowiedzieć się więcej o składni. Jest to teraz rozwiązane. Miłego dnia :) –

1

Zmodyfikuj swój custom_row_news_items.xml w następujący sposób.

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

Ustaw macierzystą RelativeLayout wysokość jak wrap_content. Obecnie jest ustawiony na match_parent, który zajmuje miejsca.

+0

Witam i dziękuję. Próbowałem Twojego rozwiązania, ale problem nadal istnieje. Zawarłem razem mój kod Java, myśląc, że źródło problemu może pochodzić stamtąd. –

2

Po prostu zmień wysokość układu rodzica z android:layout_height="match_parent" na android:layout_height="wrap_content, a to rozwiąże Twój problem, ponieważ twój kontener z układem wierszy ma wartość wrap_content, a układ wiersza próbuje dopasować wysokość nadrzędnej, a wypełni cały ekran, a twój pojedynczy komponent wziął pełną wysokość ekranu.

zmiany w układzie rzędowym:

<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

Witam i dziękuję za pomoc. Próbowałem, ale nic się nie zmieniło. Nadal istnieje duża luka między nimi. Publikuję moją klasę języka Java, myśląc, że problem może pochodzić stąd. –

1

Dzieje się to nawet po zmianie wysokość, którą RelativeLayout „s do wrap_content ponieważ RelativeLayout nie wie, jak wysoki powinien być sam.

Ustawia wysokość RelativeLayout na wrap_content i dodaje następujące wartości do ostatniej TextView.

android:layout_alignParentBottom="true" 

Mówi Bottom RelativeLayout „s zostać dostosowane do ostatniej TextView, więc teraz RelativeLayout wie, gdzie się kończy.