爲什麼使用接口回調?
在recyclerView中,我們是沒法像ListView直接添加setOnItemClick()方法的,所以我們需要用其他方法來實現點擊事件
目前有兩種實習的方法:
第一種是在RecyclerView中給控件直接加點擊事件,這種方法雖然可以,但是有一定的侷限性。
所以我今天來介紹通過在Adapter中通過接口來實現點擊事件。
話不多說,直接實現。
首先先導入RecyclerView的依賴
implementation 'com.android.support:recyclerview-v7:27.1.1'
佈局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/item_layout"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"/>
</LinearLayout>
只寫一個recyclerView,不做解釋
RecyclerView的適配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private List<String> list;
private Context context;
public RecyclerAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.item_layout,null);
MyViewHolder viewHolder = new MyViewHolder(view);
viewHolder.textView = view.findViewById(R.id.text_view);
viewHolder.linearLayout = view.findViewById(R.id.relativelayout);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
holder.textView.setText(list.get(position));
//給條目佈局設置點擊事件
holder.linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//調用接口方法,傳遞下標
listener.onItemClick(position);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
public MyViewHolder(View itemView) {
super(itemView);
}
TextView textView;
RelativeLayout linearLayout;
}
//聲明接口
private ItemClickListener listener;
//set方法
public void setListener(ItemClickListener listener) {
this.listener = listener;
}
//定義接口
public interface ItemClickListener{
//實現點擊的方法,傳遞條目下標
void onItemClick(int position);
}
}
適配器裏只要定義一個接口,給條目的佈局加點擊即可。
最後MainActivity中調用即可
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
List<String> list = new ArrayList<>();
for (int i = 0; i <100 ; i++) {
list.add("模擬數據"+i);
}
RecyclerAdapter adapter = new RecyclerAdapter(list,this);
recyclerView.setAdapter(adapter);
//調用點擊的方法
adapter.setListener(new RecyclerAdapter.ItemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this,position+"===",Toast.LENGTH_SHORT).show();
}
});
}
}