我有一個片段用戶,其中有 3 個其他片段(選項卡)。對于一個標簽(稱為 Friends2Fragment ),我制作了一個回收器視圖并為其制作了一個配接器。在 RecyclerView 的每個專案中,我都有一個“添加朋友”按鈕,我想從 Friends2Fragment 呼叫它,而不是從配接器呼叫它,因為我無法正確使用 Firestore 資料庫。
回收器視圖介面:
public interface RecyclerViewInterface {
void onItemClick(int position, String button_pressed);
}
Friends2Fragment.java:
public void onStart(){
super.onStart();
recyclerView = (RecyclerView) v.findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
friendslist = new ArrayList<>();
myAdapter = new MyAdapter(friendslist,v.getContext());
recyclerView.setAdapter(myAdapter);
------ Firestore operations ------
}
@Override
public void onItemClick(int position, String button_pressed) {
switch ( button_pressed ){
case "ADD_FRIEND":
Log.d(TAG, "item clicked: " friendslist.get(position).username);
}
}
MyAdapter.java:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.myViewHolder> {
Context context;
public ArrayList<User> userArrayList;
public MyAdapter(ArrayList<User> userArrayList, Context context) {
this.userArrayList = userArrayList;
this.context = context;
}
public Context getContext() {
return context;
}
public ArrayList<User> getUserArrayList() {
return userArrayList;
}
@NonNull
@Override
public MyAdapter.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
MyAdapter.myViewHolder myViewHolder = new MyAdapter.myViewHolder(v);
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((Friends2Fragment)context).onItemClick(myViewHolder.getAdapterPosition(),"ADD_FRIEND");
}
});
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.myViewHolder holder, int position) {
User user = userArrayList.get(position);
holder.usernamerecycle.setText(user.username);
}
@Override
public int getItemCount() {
return userArrayList.size();
}
public void filterList(List<User> filteredList){
userArrayList = (ArrayList<User>) filteredList;
notifyDataSetChanged();
}
public class myViewHolder extends RecyclerView.ViewHolder{
TextView usernamerecycle;
Button addbutton;
View rootview;
public myViewHolder(@NonNull View itemView) {
super(itemView);
rootview = itemView;
usernamerecycle = itemView.findViewById(R.id.usernamerecycler);
addbutton = itemView.findViewById(R.id.addfriendbutton);
}
}
}
問題出在這一行:((Friends2Fragment)context).onItemClick(myViewHolder.getAdapterPosition(),"ADD_FRIEND"); 在 MyAdapter 的 onCreateViewHolder 方法中。
我有這個錯誤:不可轉換的型別;無法將“android.content.Context”轉換為“com.example.birthday.Fragments.Friends2Fragment”
請幫我 ..
uj5u.com熱心網友回復:
AFragment
不是 a Context
(這不是它的超型別之一),所以強制轉換是不可能的,這就是你得到錯誤的原因。
我認為你應該這樣組織它:你Adapter
拿著一堆User
物體,對吧?它顯示這些,并且您在每個上都有一個單擊偵聽器,ViewHolder
它知道User
它當前正在顯示的串列中的哪個索引,并且它希望在單擊它時通知某個偵聽器。該索引實際上是一個內部細節,查找實際User
的 并將其提供給聽眾會更有意義。
最簡單的方法是只提供您的片段作為偵聽器。首先將其存盤在您的配接器中:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.myViewHolder> {
// store a reference to your fragment
private Friends2Fragment listener;
// add a function to provide that fragment
public void setListener(Friends2Fragment: listener) {
this.listener = listener
}
...
public MyAdapter.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
...
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
// look up the actual user
User user = userArrayList.get(myViewHolder.getAdapterPosition());
// call a function on your fragment
listener.onItemClick(user, "ADD_FRIEND");
}
}
});
}
然后添加配接器使用的回呼函式,并將配接器上的片段設定為偵聽器:
// Friends2Fragment
// You should REALLY be doing this in onViewCreated or something, so this setup happens once.
// You're losing all your state by creating a new adapter whenever the user returns to the app
public void onStart(){
...
myAdapter = new MyAdapter(friendslist,v.getContext());
// set the fragment as the listener
myAdapter.setListener(this);
recyclerView.setAdapter(myAdapter);
}
// now add the function the adapter calls
private void onItemClick(User user, String someString) {
// handle the clicked user
}
更好的方法是創建一個包含所有需要處理的事件的介面,并讓您的 Fragment 實作這些。它打破了與 Fragment 的硬關聯,因為您可以傳遞任何實作這些功能的物件,而且它也更清晰,因為介面有點記錄配接器產生的所有資料,并且偵聽器需要能夠處理。像這樣的東西:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.myViewHolder> {
// the listener is now something that implements the Callbacks interface
private Callbacks listener;
...
// nesting it inside MyAdapter makes the path MyAdapter.Callbacks, which makes it clear
// exactly what it is and what it relates to, and kinda gives the Adapter "ownership"
interface Callbacks {
void addFriend(User user)
}
然后你只需讓 Fragment 實作該介面
public class Friends2Fragment() extends Fragment implements MyAdapter.Callbacks {
...
// implement all the callbacks you need to handle
override public void addFriend(User user) {
// do the thing
}
// set it in the same way, since this Fragment implements MyAdapter.Callbacks
myAdapter.setListener(this);
我認為這更整潔,但作業量更大。另外,如果您注意到,我將回呼函式從通用重命名為handleItemClick
更具體的addFriend
- 所以不必傳遞String
說它是什么型別的點擊,您只需為每個要處理的事件提供一個函式,您可以命名他們適當地
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507364.html