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
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.
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ą? –
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
Dziękuję, powinienem dowiedzieć się więcej o składni. Jest to teraz rozwiązane. Miłego dnia :) –