Самый простой способ отображения строк со значками в RecyclerView

Что может быть самым простым способом показать список строк и значков в RecyclerView ?

Для ListView я использую следующий код (здесь полный проект в GitHub ) без отдельного адаптера:

Скриншот приложения

 mListView = (ListView) findViewById(R.id.list_view); mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mPlanets) { @Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getView(position, convertView, parent); view.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_stars_black_24dp, 0, 0, 0); return view; } }); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), "You have clicked " + mPlanets[position], Toast.LENGTH_LONG).show(); } }); 

Интересно, как использовать ArrayAdapter и android.R.layout.simple_list_item_1 с RecyclerView так же просто, без пользовательских макетов и адаптеров.

Solutions Collecting From Web of "Самый простой способ отображения строк со значками в RecyclerView"

Бадди это самый простой способ

  1. Сначала добавьте зависимость в файле build.gradle

     compile 'com.android.support:recyclerview-v7:21.0.+' 
  2. В своей основной функции определите объект RecyclerView

     private RecyclerView recyclerView; private RecyclerView.Adapter adapter; private RecyclerView.LayoutManager layoutManager; private ArrayList<String> planetList=new ArrayList(); //Other Stuff protected void onCreate(Bundle savedInstanceState) { //Other Stuff and initialize planetList with all the planets name before passing it to adapter recyclerView = (RecyclerView) findViewById(R.id.recycler_view); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); adapter = new PlanetAdapter(planetList,getApplicationContext()); recyclerView.setAdapter(adapter); } 
  3. Главная Buzz Killer PlanetAdapter , вы должны определить PlanetAdapter, который расширяет RecyclerView.Adapter

     public class PlanetAdapter extends RecyclerView.Adapter<PlanetAdapter.PlanetViewHolder> { ArrayList<String> planetList; public PlanetAdapter(ArrayList<String> planetList, Context context) { this.planetList = planetList; } @Override public PlanetAdapter.PlanetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.planet_row,parent,false); PlanetViewHolder viewHolder=new PlanetViewHolder(v); return viewHolder; } @Override public void onBindViewHolder(PlanetAdapter.PlanetViewHolder holder, int position) { holder.image.setImageResource(R.drawable.planetimage); holder.text.setText(planetList.get(position).toString()); } @Override public int getItemCount() { return planetList.size(); } public static class PlanetViewHolder extends RecyclerView.ViewHolder{ protected ImageView image; protected TextView text; public PlanetViewHolder(View itemView) { super(itemView); image= (ImageView) itemView.findViewById(R.id.image_id); text= (TextView) itemView.findViewById(R.id.text_id); } } } 

4.main_activity.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> 
  1. Последнее, но не в последнюю очередь planet_row.xml

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/image_id"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Planet Name" android:id="@+id/text_id"/> </LinearLayout> 

Я уменьшил решение LX (спасибо!) Несколькими строками в моей MainActivity.java :

Сначала класс ViewHolder с прослушивателем кликов:

 private class PlanetViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public PlanetViewHolder(View v) { super(v); v.setOnClickListener(this); } @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "You have clicked " + ((TextView) v).getText(), Toast.LENGTH_LONG).show(); } } 

А затем адаптер переопределяет 3 абстрактных метода и использует android.R.layout.simple_list_item_1 :

  mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(new RecyclerView.Adapter<PlanetViewHolder>() { @Override public PlanetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate( android.R.layout.simple_list_item_1, parent, false); PlanetViewHolder vh = new PlanetViewHolder(v); return vh; } @Override public void onBindViewHolder(PlanetViewHolder vh, int position) { TextView tv = (TextView) vh.itemView; tv.setText(mPlanets[position]); tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_stars_black_24dp, 0, 0, 0); } @Override public int getItemCount() { return mPlanets.length; } }); 

Вышеприведенный код отображает массив строковых mPlanets как:

Скриншот приложения