Ich muss eine horizontale Listenansicht in meiner Android-Anwendung implementieren. Ich habe ein wenig recherchiert und bin auf/gestoßen Wie kann ich eine horizontale ListView in Android erstellen? und Horizontale ListView in Android? Diese Fragen wurden jedoch vor der Veröffentlichung von Recyclerview gestellt. Gibt es eine bessere Möglichkeit, dies jetzt mit Recyclerview zu implementieren?
Gibt es eine bessere Möglichkeit, dies jetzt mit Recyclerview zu implementieren?
Ja.
Wenn Sie eine RecyclerView
verwenden, müssen Sie eine LayoutManager
angeben, die für die Anordnung der einzelnen Elemente in der Ansicht verantwortlich ist. Mit der LinearLayoutManager
können Sie eine Ausrichtung angeben, genau wie eine normale LinearLayout
.
Um eine horizontale Liste mit RecyclerView
zu erstellen, können Sie Folgendes tun:
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
<Android.support.v7.widget.RecyclerView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
app:layoutManager="Android.support.v7.widget.LinearLayoutManager" />
Der einzige wirkliche Unterschied zwischen einer vertikalen RecyclerView
und einer horizontalen ist, wie Sie die LinearLayoutManager
einrichten. Hier ist das Code-Snippet. Das vollständige Beispiel ist unten.
LinearLayoutManager horizontalLayoutManagaer = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(horizontalLayoutManagaer);
Dieses ausführlichere Beispiel ist nach meine vertikale RecyclerView
Antwort modelliert.
Stellen Sie sicher, dass die folgenden Abhängigkeiten in Ihrer App gradle.build
-Datei enthalten sind:
implementation 'com.Android.support:appcompat-v7:27.1.1'
implementation 'com.Android.support:recyclerview-v7:27.1.1'
Sie können die Versionsnummern auf das aktuellste aktualisieren.
Fügen Sie die RecyclerView
zu Ihrem XML-Layout hinzu.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/rvAnimals"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</RelativeLayout>
Jedes Element in unserer RecyclerView
wird eine einzelne, farbige View
über einer TextView
haben. Erstellen Sie eine neue Layoutressourcendatei.
recyclerview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:padding="10dp">
<View
Android:id="@+id/colorView"
Android:layout_width="100dp"
Android:layout_height="100dp"/>
<TextView
Android:id="@+id/tvAnimalName"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="20sp"/>
</LinearLayout>
Die Variable RecyclerView
benötigt einen Adapter, um die Ansichten in jeder Zeile (horizontales Element) mit Ihren Daten zu füllen. Erstellen Sie eine neue Java-Datei.
MyRecyclerViewAdapter.Java
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
private List<Integer> mViewColors;
private List<String> mAnimals;
private LayoutInflater mInflater;
private ItemClickListener mClickListener;
// data is passed into the constructor
MyRecyclerViewAdapter(Context context, List<Integer> colors, List<String> animals) {
this.mInflater = LayoutInflater.from(context);
this.mViewColors = colors;
this.mAnimals = animals;
}
// inflates the row layout from xml when needed
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
return new ViewHolder(view);
}
// binds the data to the view and textview in each row
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int color = mViewColors.get(position);
String animal = mAnimals.get(position);
holder.myView.setBackgroundColor(color);
holder.myTextView.setText(animal);
}
// total number of rows
@Override
public int getItemCount() {
return mAnimals.size();
}
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
View myView;
TextView myTextView;
ViewHolder(View itemView) {
super(itemView);
myView = itemView.findViewById(R.id.colorView);
myTextView = itemView.findViewById(R.id.tvAnimalName);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
// convenience method for getting data at click position
public String getItem(int id) {
return mAnimals.get(id);
}
// allows clicks events to be caught
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}
Anmerkungen
ListViews
verfügbar und wird häufig benötigt. Sie können diesen Code entfernen, wenn Sie ihn nicht benötigen.Fügen Sie Ihrer Hauptaktivität den folgenden Code hinzu.
MainActivity.Java
public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
private MyRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// data to populate the RecyclerView with
ArrayList<Integer> viewColors = new ArrayList<>();
viewColors.add(Color.BLUE);
viewColors.add(Color.YELLOW);
viewColors.add(Color.Magenta);
viewColors.add(Color.RED);
viewColors.add(Color.BLACK);
ArrayList<String> animalNames = new ArrayList<>();
animalNames.add("Horse");
animalNames.add("Cow");
animalNames.add("Camel");
animalNames.add("Sheep");
animalNames.add("Goat");
// set up the RecyclerView
RecyclerView recyclerView = findViewById(R.id.rvAnimals);
LinearLayoutManager horizontalLayoutManager
= new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(horizontalLayoutManager);
adapter = new MyRecyclerViewAdapter(this, viewColors, animalNames);
adapter.setClickListener(this);
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClick(View view, int position) {
Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on item position " + position, Toast.LENGTH_SHORT).show();
}
}
Anmerkungen
ItemClickListener
implementiert, die wir in unserem Adapter definiert haben. Dies ermöglicht uns, Elementklickereignisse in onItemClick
zu behandeln.Das ist es. Sie sollten jetzt in der Lage sein, Ihr Projekt auszuführen und etwas Ähnliches wie das Bild oben zu erhalten.
Wenn Sie eine RecyclerView
mit der GridLayoutManager
verwenden möchten, erzielen Sie auf diese Weise einen horizontalen Bildlauf.
recyclerView.setLayoutManager(
new GridLayoutManager(recyclerView.getContext(), rows, GridLayoutManager.HORIZONTAL, false));
Der Versuch, eine horizontale ListView zu erstellen, dauert zu lange. Ich habe es auf zwei Arten gelöst.
1.Verwenden Sie einen ViewPager, dessen Adapter sich von PagerAdapter erstreckt.
2.Verwenden Sie RecyclerView genauso wie oben. Sie müssen LayoutManager wie im folgenden Code anwenden:
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
Wenn Sie die horizontale Ansicht des Recyclers als ViewPager verwenden möchten, ist dies jetzt mit Hilfe von LinearSnapHelper
möglich, das in der Support Library Version 24.2.0 hinzugefügt wird.
Zuerst füge RecyclerView deiner Aktivität/Fragment hinzu
<Android.support.v7.widget.RecyclerView
Android:layout_below="@+id/sign_in_button"
Android:layout_width="match_parent"
Android:orientation="horizontal"
Android:id="@+id/blog_list"
Android:layout_height="match_parent">
</Android.support.v7.widget.RecyclerView>
In meinem Fall habe ich eine CardView
innerhalb der RecyclerView
verwendet.
blog_row.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.CardView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_margin="15dp"
Android:orientation="vertical">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center"
Android:orientation="vertical">
<com.Android.volley.toolbox.NetworkImageView
Android:id="@+id/imageBlogPost"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:adjustViewBounds="true"
Android:paddingBottom="15dp"
Android:src="@drawable/common_google_signin_btn_text_light_normal" />
<TextView
Android:id="@+id/TitleTextView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="20dp"
Android:text="Post Title Here"
Android:textSize="16sp" />
<TextView
Android:id="@+id/descriptionTextView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Post Description Here"
Android:paddingBottom="15dp"
Android:textSize="14sp" />
</LinearLayout>
</Android.support.v7.widget.CardView>
In deiner Aktivität/Fragment
private RecyclerView mBlogList;
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
mBlogList = (RecyclerView) findViewById(R.id.blog_list);
mBlogList.setHasFixedSize(true);
mBlogList.setLayoutManager(layoutManager);
LinearSnapHelper snapHelper = new LinearSnapHelper() {
@Override
public int findTargetSnapPosition(RecyclerView.LayoutManager lm, int velocityX, int velocityY) {
View centerView = findSnapView(lm);
if (centerView == null)
return RecyclerView.NO_POSITION;
int position = lm.getPosition(centerView);
int targetPosition = -1;
if (lm.canScrollHorizontally()) {
if (velocityX < 0) {
targetPosition = position - 1;
} else {
targetPosition = position + 1;
}
}
if (lm.canScrollVertically()) {
if (velocityY < 0) {
targetPosition = position - 1;
} else {
targetPosition = position + 1;
}
}
final int firstItem = 0;
final int lastItem = lm.getItemCount() - 1;
targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
return targetPosition;
}
};
snapHelper.attachToRecyclerView(mBlogList);
Letzter Schritt besteht darin, den Adapter auf RecyclerView einzustellen
mBlogList.setAdapter(firebaseRecyclerAdapter);
Mit der Veröffentlichung der RecyclerView-Bibliothek können Sie nun eine Liste von Bildern einfach an Text ausrichten. Sie können den LinearLayoutManager verwenden, um die Richtung festzulegen, in die Sie Ihre Liste vertikal oder horizontal ausrichten möchten (siehe unten).
Sie können eine vollständige Arbeitsdemo von diesem Beitrag herunterladen
Es gibt eine RecyclerView-Unterklasse mit dem Namen HorizontalGridView , die Sie verwenden können, um die horizontale Richtung zu haben . VerticalGridView für die vertikale Richtung
Recycler-Ansicht in horizontaler Dynamik.
Implementierung von Recycler View
RecyclerView musicList = findViewById(R.id.MusicList);
// RecyclerView musiclist = findViewById(R.id.MusicList1);
// RecyclerView musicLIST = findViewById(R.id.MusicList2);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
musicList.setLayoutManager(layoutManager);
String[] names = {"RAP", "CH SHB", "Faheem", "Anum", "Shoaib", "Laiba", "Zoki", "Komal", "Sultan","Mansoob Gull"};
musicList.setAdapter(new ProgrammingAdapter(names));'
Adapterklasse für die Recycler-Ansicht, in der sich ein Ansichtshalter befindet, der die Ansicht dieses Recyclers enthält
public class ProgrammingAdapter
extendsRecyclerView.Adapter<ProgrammingAdapter.programmingViewHolder> {
private String[] data;
public ProgrammingAdapter(String[] data)
{
this.data = data;
}
@Override
public programmingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.list_item_layout, parent, false);
return new programmingViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull programmingViewHolder holder, int position) {
String title = data[position];
holder.textV.setText(title);
}
@Override
public int getItemCount() {
return data.length;
}
public class programmingViewHolder extends RecyclerView.ViewHolder{
ImageView img;
TextView textV;
public programmingViewHolder(View itemView) {
super(itemView);
img = itemView.findViewById(R.id.img);
textV = itemView.findViewById(R.id.textt);
}
}
Es ist sowohl für Horizontal als auch für Vertikal.
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_recycler);
recyclerView = (RecyclerView)findViewById(R.id.recyclerViewId);
RecyclAdapter adapter = new RecyclAdapter();
//Vertical RecyclerView
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
//Horizontal RecyclerView
//recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.HORIZONTAL,false));
recyclerView.setAdapter(adapter);
}
Versuche dies:
myrecyclerview.setLayoutManager(
new LinearLayoutManager(getActivity(),
LinearLayoutManager.HORIZONTAL,false));
myrecyclerview.setAdapter(recyclerAdapter);
nur für den Fall, dass Sie eine Recycling-Ansicht mit einigen Fragmenten erhalten haben.
<HorizontalScrollView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
>
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal"
Android:scrollbars="vertical|horizontal" />
</HorizontalScrollView>