【问题标题】:How to communicate with fragment from my adapter class如何与我的适配器类中的片段进行通信
【发布时间】:2020-11-06 10:14:47
【问题描述】:

我创建了一个自定义适配器类。在那个类中,当我点击我的列表视图布局时,我有一个代码必须向我的片段发送消息。 谷歌搜索后,最好的方法可能是使用界面。其中大多数是在活动与片段之间进行通信的示例。但就我而言,我对如何在适配器类与片段类之间进行通信没有任何想法。 假设我在我的适配器类中创建了一个接口,例如:

public interface SuccessResponse{
    void onSuccess();
}

在我的适配器类中的 LinearLayout 上,我希望它是这样的:

linearLayout.setOnClickListener(new View.OnClickListener{
    @Override
    public void onClick (View view){
        SuccessResponse.onSuccess();
    }
})

然后我想确保我的片段页面获得 onSuccess() 方法并执行以下操作:

public class MyFragment extends ListFragment implements Adapter.SuccessResponse{
    @Override
    public void onSuccess(){
        //do Something
    }
}

有没有办法像上面那样做?

【问题讨论】:

  • 通过构造函数将要分片的实例传递给您的自定义适配器。
  • 你在onClick()方法中调用onSuccess()的方式是错误的...应该在fragment上调用它,因为它是Fragment的方法。
  • 那么,如果我希望它在单击项目时调用 onSuccess() 怎么办?
  • 你能告诉我怎么做构造函数吗?

标签: java android android-fragments


【解决方案1】:

更新 如果您正在寻找 Kotlin 中的解决方案

class ExampleFragment : Fragment(), SuccessResponse {
    val adapter = MyAdapter()
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        adapter.successResponse = this
    }

    override fun onSuccess() {
        //DO what you want to do
    }
}


class MyAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    var successResponse: SuccessResponse? = null
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        holder.itemView.setOnClickListener {
            successResponse?.onSuccess()
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        TODO("Not yet implemented")
    }

    override fun getItemCount(): Int {
        TODO("Not yet implemented")
    }
}

interface SuccessResponse {
    fun onSuccess()
}

JAVA 以下代码可能对您有所帮助。

public class ExampleFragment extends Fragment implements MyAdapter.SuccessResponse{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View contentView  = inflater.inflate(R.layout.my_layout, container, false);
        MyAdapter myAdapter = new MyAdapter(getActivity(), 0);
        myAdapter.successResponse = this;
        return contentView;
    }

    @Override
    public void onSuccess() {

    }
}

MyAdapter 类扩展 ArrayAdapter{ 成功响应成功响应; 公共 MyAdapter(上下文上下文,int 资源){ 超级(上下文,资源); } 公共接口 SuccessResponse{ 无效的成功(); } @覆盖 public View getView(int position, View convertView, ViewGroup parent) { //你的观点 linearLayout.setOnClickListener(新 View.OnClickListener{ @覆盖 public void onClick(查看视图){ 如果(成功响应!=空) 成功响应.onSuccess(); } }) } }

【讨论】:

  • 在我的片段中的 onSuccess() 方法上,我放了一个 Log.d 来打印一些东西,它告诉我程序永远不会到达它。也许是因为我的successResponse==null?
  • 好的,我忘了在我的片段中初始化它,它现在正在工作,正是我要找的东西
【解决方案2】:

在您的 CustomAdapter 中执行此操作

1) 导入片段

import android.support.v4.app.Fragment;   

2) 在你的适配器中声明碎片对象

     Fragment frag

        public YourAdapter(Fragment frag) {
            this.frag = frag;
        }

3) 现在调用你的片段方法

        linearLayout.setOnClickListener(new View.OnClickListener{
            @Override
            public void onClick (View view){
                ((HomeFragment) frag).onSuccess();// here your fragment name HomeFragment
            }
        })

4) 在 HomeFragment 中

    public void onSuccess(){
         // do your stuff here
    }

【讨论】:

  • 为什么不直接通过Adapter.SuccessResponse。整个 Fragment 在 Adapter 中是无用的。
  • @cricket_007 是的,他也可以这样做。
  • 在这里,您将适配器耦合到片段。 Adapter 应该只关心一个Adapter.SuccessResponse,而不是依赖一个 Fragment 的存在。
  • 所以当我初始化我的适配器时,它会是这样的:CustomAdapter customAdapter = new CustomAdapter (FragmentClass.class)?
  • 不,传递你的 Fragment 的对象而不是 FragmentClass.class。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多