首页 > 解决方案 > 如何在片段内的回收器视图中调用主要活动代码?

问题描述

我已经准备好所有东西来设置我的片段通信,但我唯一的问题是如何让回收器视图itemVitem.setOnClickListener调用主要活动中的覆盖接口方法,以便我可以获取该数据并创建一个意图去详细活动或更新双窗格布局的详细信息片段,更多解释在下面的代码注释中提供。

主要活动

public class MainActivity extends AppCompatActivity implements ListFragment.Listener {

// the method to be called when an item in recycler view is clicked
// so i can pass this data to DetailFragment
@Override
public void listener(String firstName, String lastName) {
    DetailFragment detailFragment = new DetailFragment();
    detailFragment.updateText(firstName, lastName);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

回收器视图适配器

   public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView tvFirstName;
    public TextView tvLastName;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        tvFirstName = itemView.findViewById(R.id.row_first_name);
        tvLastName = itemView.findViewById(R.id.row_last_name);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // how to call the "listener()" method in main activity
            }
        });
    }

包含回收站视图的片段

public class ListFragment extends Fragment {

private static final String TAG = "ListFragment"; 

private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;

// fragment communication interface
public interface Listener {
    void listener(String firstName, String lastName);
}

private Listener listener;

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    try {
        this.listener = (Listener) context;
    } catch (ClassCastException e) {
        Log.d(TAG, "onAttach: "+ e.getMessage());
    }
}

public ListFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_list, container, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    recyclerView = getView().findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


    // some dummy data to fill the recycler view
    ArrayList<User> users = new ArrayList<>();

    users.add(new User("hiwa", "jalal"));
    users.add(new User("mohammed", "abdullah"));


    recyclerViewAdapter = new RecyclerViewAdapter(users, getActivity());

    recyclerView.setAdapter(recyclerViewAdapter);

}
}

细节片段

public class DetailFragment extends Fragment {


private TextView tvFirstName;
private TextView tvLastName;

public DetailFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_detail, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    tvFirstName = view.findViewById(R.id.detail_frag_first_name);
    tvLastName = view.findViewById(R.id.detail_frag_last_name);
}

// update the details fragment views
public void updateText(String firstName, String lastName) {
    tvFirstName.setText(firstName);
    tvLastName.setText(lastName);
}

}

标签: androidandroid-fragmentsandroid-recyclerview

解决方案


传递listener给您RecyclerViewAdapter并使用它来调用回调

recyclerViewAdapter = new RecyclerViewAdapter(users, getActivity(), listener);

更新RecyclerViewAdapter如下

class RecyclerViewAdapter {
   private Listener mListener;

   ....

   public RecyclerViewAdapter(ArrayList<User> users, Context context, Listener listener) {
       ....

       mListener = listener;
   }

   @Override
   public void onBindViewHolder(ViewHolder holder, int position) {

       ....

       holder.itemView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                mListener.listener(first_name. last_name);
           }
        });

       ....
   }

   ....
}

推荐阅读