Android Учебник: создание RecyclerView, CardView и меню опций для элемента RecyclerView
В этом уроке вы узнаете, как создать простое приложение с помощью RecyclerView, CardView для отображения данных, а затем добавить меню опций (options menu) для элементов списка.
Пример кода:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.gnirt69.recyclerviewoptionmenu.MainActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView"></android.support.v7.widget.RecyclerView> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" android:elevation="4dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/activity_horizontal_margin"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtTitle" android:text="Title" android:textAppearance="?android:textAppearanceLarge"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtDescription" android:text="Description" android:textAppearance="?android:textAppearanceMedium" android:layout_below="@id/txtTitle"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="⋮" android:id="@+id/txtOptionDigit" android:textAppearance="?android:textAppearanceLarge" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:paddingLeft="@dimen/activity_horizontal_margin"/> </RelativeLayout> </android.support.v7.widget.CardView> </LinearLayout>
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private MyAdapter adapter; private List<RecyclerItem> listItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); listItems = new ArrayList<>(); //Generate sample data for (int i = 0; i<10; i++) { listItems.add(new RecyclerItem("Item " + (i + 1), "Welcome to Torisan channel, this is description of item " + (i+1))); } //Set adapter adapter = new MyAdapter(listItems, this); recyclerView.setAdapter(adapter); } }
import android.content.Context; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<RecyclerItem> listItems; private Context mContext; public MyAdapter(List<RecyclerItem> listItems, Context mContext) { this.listItems = listItems; this.mContext = mContext; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { final RecyclerItem itemList = listItems.get(position); holder.txtTitle.setText(itemList.getTitle()); holder.txtDescription.setText(itemList.getDescription()); holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Display option menu PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit); popupMenu.inflate(R.menu.option_menu); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.mnu_item_save: Toast.makeText(mContext, "Saved", Toast.LENGTH_LONG).show(); break; case R.id.mnu_item_delete: //Delete item listItems.remove(position); notifyDataSetChanged(); Toast.makeText(mContext, "Deleted", Toast.LENGTH_LONG).show(); break; default: break; } return false; } }); popupMenu.show(); } }); } @Override public int getItemCount() { return listItems.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public TextView txtTitle; public TextView txtDescription; public TextView txtOptionDigit; public ViewHolder(View itemView) { super(itemView); txtTitle = (TextView) itemView.findViewById(R.id.txtTitle); txtDescription = (TextView) itemView.findViewById(R.id.txtDescription); txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit); } } }
public class RecyclerItem { private String title; private String description; public RecyclerItem(String title, String description) { this.title = title; this.description = description; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
Пример кода скачать