Android RecyclerView使用(包含Onlick Listener)

曾國維
7 min readJan 16, 2018

--

首先在build.gradle(Module:app)裡面引進recyclerview的library

compile 'com.android.support:recyclerview-v7:27.0.1'

接著在你要的layout裡面加入元件:

<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

創一個view裡面的單一row的layout,通常可以配合cardview使用會有比較好的點擊效果:

<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:id="@+id/cv_item"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardCornerRadius="4dp"
card_view:cardBackgroundColor="#ffffff"
card_view:cardElevation="4dp"
>
<TextView
android:id="@+id/tName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
/>

</android.support.v7.widget.CardView>

創建一個class(通常可以叫RecyclerAdapter)

public class RecyclerAdapter_UserList extends RecyclerView.Adapter<RecyclerAdapter_UserList.RecyclerHolder>  {
private ArrayList<String> name;

private OnItemClickListener mOnItemClickListener;

public RecyclerAdapter_UserList(ArrayList<String> name){
this.name = name;
}


public interface OnItemClickListener
{
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}

public void setOnItemClickListener(OnItemClickListener mOnItemClickListener)
{
this.mOnItemClickListener = mOnItemClickListener;
}

public static class RecyclerHolder extends RecyclerView.ViewHolder {
//這裡要bind元件到你綁的view上面
TextView textViewName;
public RecyclerHolder(View itemView) {
super(itemView);
textViewName = itemView.findViewById(R.id.tName);


}
}

@Override
public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_user_list, parent, false);
return new RecyclerHolder(view);
}

@Override
public void onBindViewHolder(final RecyclerHolder holder, int position) {
//這邊把你要的資料bind在元件上面,onclicklistener也是在這裡加入
holder.textViewName.setText(name.get(position));
if (mOnItemClickListener != null){
//set短和長按事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, pos);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override public boolean onLongClick(View v)
{
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemLongClick(holder.itemView, pos);
return false;
}
});
}
}

@Override
public int getItemCount() {
if (name == null)
return 0;
else
return name.size();
}


}

最後在主要activity或是fragment加入以下:

RecyclerView recyclerView = v.findViewById(R.id.recycler_userlist);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);

recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new DefaultItemAnimator());

adapter_userList = new RecyclerAdapter_UserList(names);
recyclerView.setAdapter(adapter_userList);

當資料有變動要即時更新時:

adapter_userList.notifyDataSetChanged();

這邊要特別注意一點就是只有在你使用的還是相同的adapter還有相同的data set才可以直接call這個method,任何有新的物件都要重新constructor 或者setadapter

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response