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
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.
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? –
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
Danke, ich sollte mehr über die Syntax lernen. Es ist jetzt gelöst. Einen schönen Tag noch :) –