RecyclerView ile Yatay ListView nasıl oluşturulur?


338

Android uygulamama yatay bir liste görünümü uygulamam gerekiyor. Biraz araştırma yaptım ve rastladım Android'de nasıl yatay bir ListView yapabilirim? ve Yatay ListView? ancak bu sorular Recyclerview yayınlanmadan önce sorulmuştur. Bunu şimdi Recyclerview ile uygulamanın daha iyi bir yolu var mı?


12
Sadece kullanmak LinearLayoutManageriçin oryantasyon seti ile HORIZONTAL.
Egor Neliuba

@EgorN bunu denedim, yatay yapıyor ancak adaptör satırının çocuklarını da yatay olarak değiştiriyor gibi görünüyor. Bir RelativeLayout var. Bunu nasıl düzeltebileceğimi bilmiyorum?
Muhammed Umar

Yanıtlar:


739

Bunu şimdi Recyclerview ile uygulamanın daha iyi bir yolu var mı?

Evet.

A kullandığınızda , görünümdeki her öğeyi düzenlemekle sorumlu RecyclerViewbir tane belirtmeniz gerekir LayoutManager. LinearLayoutManagerNormal bir benzeri, bir yönünü belirlemenizi sağlar LinearLayoutistiyorum.

İle yatay bir liste oluşturmak için şöyle bir RecyclerViewşey yapabilirsiniz:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

Bunu denedim, yatay yapıyor ama hatta adaptör satırının çocuklarını da yatay olarak değiştiriyor gibi görünüyor. Bir RelativeLayout var. Bunu nasıl düzeltebileceğimi bilmiyorum?
Muhammed Umar

2
RelativeLayoutyatay ve dikey kavramları yoktur, bu yüzden soruyu gerçekten anlamıyorum.
Bryan Herbst

2
Görünüşe göre RecyclerView ve yatay olarak kaydırılan LayoutManager ... ile ilgili bazı sorunlar var ... code.google.com/p/android/issues/detail?id=74772 - aslında yatay kaydırma yapan bir RecyclerView kullanarak da mücadele ettiğim için buldum
AgentKnopf

Zainodis o zaman ne kullanacağını anladın mı? LinearLayoutManager benim için bir ithalat olarak bile görünmüyor mu? Bir şey mi eksik
Lion789

@ Tanis.7x Bu benim için harika çalışıyor, ancak listeyi soldan sağa doğru dolduruyor. Sağdan sola doldurmanın bir yolu olup olmadığını bilen var mı? (İlk madde ... vb dizin 1'de öğe sola daha sonra, sağ en listede olduğunu ve)
raisedandglazed

169
 <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" />

LayoutManager'ı nasıl ayarlayabilirim?
Kai Wang

@kaiwang pls yukarıdaki "Tanis.7x" cevabına bakınız.
kaynamış su

app:layoutManager="android.support.v7.widget.LinearLayoutManager"sürüm oluşturma için çalışmaz. Bu sorunla karşılaştım Sürüm derleme.
Abu Yousuf

Bunu arayüz oluşturucuda nasıl göstereceğimizi arıyordum. araçlar: yönlendirme = "yatay" araçlar: layoutManager = "android.support.v7.widget.LinearLayoutManager" beni kurtardı teşekkürler.
Mohammad Tabbara

'<androidx.recyclerview.widget.RecyclerView android: layout_width = "match_parent" android: layout_height = "70dp" android: layout_gravity = "alt" android: yönlendirme = "yatay" uygulama: layoutManager = "androidx.recyclerview.widget.LinearLayoutManager" /> '
Yanny

74

Komple örnek

resim açıklamasını buraya girin

Dikey RecyclerViewve yatay arasındaki tek gerçek fark LinearLayoutManager,. İşte kod pasajı. Tam örnek aşağıdadır.

LinearLayoutManager horizontalLayoutManagaer = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(horizontalLayoutManagaer);

Bu dolgun örnek örnek alındı benim dikey RecyclerViewcevap .

Gradle bağımlılıklarını güncelleme

Uygulama gradle.builddosyanızda aşağıdaki bağımlılıkların bulunduğundan emin olun :

implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'

Sürüm numaralarını en güncel sürümle güncelleyebilirsiniz .

Etkinlik düzeni oluştur

RecyclerViewXml düzeninize ekleyin .

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>

Öğe düzeni oluştur

Bizim her öğenin üzerinde bir RecyclerViewtek bir renk olacak . Yeni bir düzen kaynak dosyası oluşturun.ViewTextView

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>

Bağdaştırıcıyı oluşturun

RecyclerViewSenin verilerle her satır (yatay öğe) görünümleri doldurmak için bir adaptör ihtiyacı var. Yeni bir java dosyası oluşturun.

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

notlar

  • Kesinlikle gerekli olmasa da, öğelerdeki tıklama etkinliklerini dinleme işlevini dahil ettim. Bu eski ListViewsve mevcuttu ortak bir ihtiyaç. İhtiyacınız yoksa bu kodu kaldırabilirsiniz.

Aktivitede RecyclerView'i başlat

Ana etkinliğinize aşağıdaki kodu ekleyin.

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

notlar

  • Etkinliğin ItemClickListener, adaptörümüzde tanımladığımız işlemi gerçekleştirdiğine dikkat edin. Bu, öğedeki öğe tıklama olaylarını işlememize olanak tanır onItemClick.

bitmiş

Bu kadar. Projenizi şimdi çalıştırabilmeli ve üstteki görüntüye benzer bir şey elde edebilmelisiniz.

notlar


12

A RecyclerViewile kullanmak istiyorsanız GridLayoutManager, yatay kaydırma yapmanın yolu budur.

recyclerView.setLayoutManager(
new GridLayoutManager(recyclerView.getContext(), rows, GridLayoutManager.HORIZONTAL, false));

Bu benim için iyi çalışıyor ... çoğunlukla satırları num ... ayarlayabildiğiniz için bunu LinearLayoutManager'da da yapabilir mi?
superUser

9

Yatay bir ListView oluşturmaya çalışmak çok zaman alıyor. Bunu iki şekilde çözdüm.

1. adaptörü PagerAdapter olan bir ViewPager kullanarak.

Yukarıdaki gibi RecyclerView kullanarak. LayoutManager'ı aşağıdaki kodda olduğu gibi uygulamanız gerekir:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

6

ViewPager olarak hareket etmek için Yatay Geri Dönüşüm Görünümünü kullanmak istiyorsanız, şimdi LinearSnapHelperDestek Kitaplığı sürüm 24.2.0'a eklenen yardımla mümkündür.

Öncelikle Faaliyetinize / Parçanıza RecyclerView ekleyin

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

Benim durumumda bir CardViewiç kullandımRecyclerView

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>

Faaliyetinizde / Parçanızda

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

Son Adım, adaptörü RecyclerView olarak ayarlamaktır

mBlogList.setAdapter(firebaseRecyclerAdapter);

4

RecyclerView kütüphanesinin piyasaya sürülmesiyle, artık metinle bağlanan görüntü listesini kolayca hizalayabilirsiniz. Listenizi yönlendirmek istediğiniz yönü aşağıda gösterildiği gibi dikey veya yatay olarak belirlemek için LinearLayoutManager'ı kullanabilirsiniz.

resim açıklamasını buraya girin

Bu yayından tam bir çalışma demosu indirebilirsiniz


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

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Context;
    import android.content.ContextWrapper;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    public class MainActivity extends AppCompatActivity
     {
        ImageView mImageView1;
        Bitmap bitmap;
        String mSavedInfo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mImageView1 = (ImageView) findViewById(R.id.image);
        }
        public Bitmap getBitmapFromURL(String src) {
            try {
                java.net.URL url = new java.net.URL(src);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();
                Bitmap myBitmap = BitmapFactory.decodeStream(input);
                return myBitmap;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
        public void button2(View view) {
            new DownloadImageFromTherad().execute();
        }
        private class DownloadImageFromTherad extends AsyncTask<String, Integer, String> {
            @Override
            protected String doInBackground(String... params) {
                bitmap = getBitmapFromURL("https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_960_720.png");
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                File sdCardDirectory = Environment.getExternalStorageDirectory();
                File image = new File(sdCardDirectory, "test.png");
                boolean success = false;
                FileOutputStream outStream;
                mSavedInfo = saveToInternalStorage(bitmap);
                if (success) {
                    Toast.makeText(getApplicationContext(), "Image saved with success", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Error during image saving" + mSavedInfo, Toast.LENGTH_LONG).show();
                }
            }
        }
        private String saveToInternalStorage(Bitmap bitmapImage) {
            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            // path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            File mypath = new File(directory, "profile.jpg");
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(mypath);
                bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return directory.getAbsolutePath();
        }
        private void loadImageFromStorage(String path) {
            try {
                File f = new File(path, "profile.jpg");
                Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
                mImageView1.setImageBitmap(b);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        public void showImage(View view) {
            loadImageFromStorage(mSavedInfo);
        }
    }


1

Hem Yatay hem de Dikey içindir.

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

}

1

Yatay Dinamik Recycler Görünümü.

Recycler View Uygulaması

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

Bu geri dönüştürücünün görünümünü tutmak için bir görünüm tutucu bulunan geri dönüşümcü görünümü için adaptör sınıfı

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

1
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));

recyclerView.setAdapter(adapter);

0

Bunu dene:

myrecyclerview.setLayoutManager(
        new LinearLayoutManager(getActivity(),
                                LinearLayoutManager.HORIZONTAL,false));
myrecyclerview.setAdapter(recyclerAdapter);

ancak üzerinde bazı parçaların bulunduğu bir geri dönüşüm görünümüne sahip olmanız durumunda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.