【问题标题】:Interface adaptor to interface fragment android接口适配器到接口片段android
【发布时间】:2016-07-30 12:54:28
【问题描述】:

提供接口的适配器类:

public class Adaptor{

    private ItemCLickCallback itemCLickCallback;

        public interface ItemCLickCallback {
            void onItemClick(int p);
            void onSecItemClick(int p);
        }
        public void setItemCLickCallback(final ItemCLickCallback itemCLickCallback){
            this.itemCLickCallback = itemCLickCallback;
        }}


public class Overview extends Fragment implements Adaptor.ItemCLickCallback{

         @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_overview, container, false);
        Adaptor adaptor = new Adaptor(mijnwinkels, this.getActivity());
adaptor.setItemCLickCallback(this);
        return view;
    }

@Override
    public void onItemClick(int p) {
}
    @Override
    public void onSecItemClick(int p) {
      // On click: send data to database, remove data from database
      // Needs methods that should be implemented in my activity, cant be linked to the activity
    }}

所以。在我的片段中被覆盖的方法需要应该位于我的活动中的方法,这些方法需要来自片段的数据。通常我会使用一个接口来执行此操作,但这些方法已经是另一个类的接口的一部分,那么我怎样才能将它们放在一个接口中,以便我可以从我的活动中做所有事情呢?谢谢

【问题讨论】:

  • 所有创建 Bundle 的代码都可以提取到一个接受 Winkel 对象的方法中
  • 无论如何,onSuccess 是什么?请出示minimal reproducible example
  • @cricket_007 添加了一些评论以进一步解释。我的片段目前正在从我的适配器实现接口,但我想基本上在我的活动中创建一个新接口。 OnSecItemCLick() 将具有获取数据并将数据设置到我的数据库的代码,但是由于我也需要在其他地方使用该代码(在同一个活动中),我希望它在活动中,我不知道该怎么做因为这些方法是我的适配器接口的一部分,在我的片段中实现
  • 你也可以让Winkel实现Parcelable,然后你甚至不需要显式地将每个数据放入Bundle extras中
  • 对不起,我不太明白解释。你有 3 个类和一些接口。听起来您正在尝试减少重复代码。将通用功能提取到其他方法中通常是您这样做的方式

标签: java android interface


【解决方案1】:

您的问题似乎主要涉及从界面中删除重复代码,所以这里有一些建议。

当您在 onSuccess 中获取数据时,您无需添加全新的 Adapter。

private ArrayList<Winkel> mijnwinkels;
private Adaptor mAdaptor;

onCreateView() { 
    //... Other code 
    mijnwinkels = new  ArrayList<Winkel>();
    // mRecyclerView =... 
    mAdaptor = new Adaptor(mijnwinkels, this.getActivity());
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
    mRecyclerView.addItemDecoration(new VerticalSpace(30));
    mRecyclerView.setAdapter(adaptor);
    adaptor.setItemCLickCallback(this);
   // etc... 
} 

@Override
public void onSuccess(ArrayList<Winkel> winkels) {
    mijnwinkels.clear();
    mijnwinkels.addAll(winkels);
    mAdaptor.notifyDatasetChanged(); // something like this... Not sure how RecyclerView does it 
 }

如果您创建Winkel implements Parcelable 并为此实现必要的代码,您将在那里删除一些行。

@Override
public void onItemClick(int p) {
    Winkel winkel = (Winkel) mijnwinkels.get(p);

     Bundle detailsBundle = new Bundle();
    detailsBundle.putExtra(EXTRA_WINKEL,winkel);

    Details detail= new Details();
    detail.setArguments(detailsBundle);
    this.getFragmentManager().beginTransaction()
            .replace(R.id.mycontainer,detail,null)
            .addToBackStack(null)
            .commit();
  }

虽然,真的,这一切都可以写成它自己的方法。

public static void showWinkel(Winkel winkel, FragmentManager fm) {
    Bundle detailsBundle = new Bundle();
    detailsBundle.putExtra(EXTRA_WINKEL,winkel);

    Details detail= new Details();
    detail.setArguments(detailsBundle);
    fm.beginTransaction()
        .replace(R.id.mycontainer,detail)
        .addToBackStack(null)
        .commit();
} 

并且可以从任何地方调用

@Override
public void onItemClick(int p) {
    showWinkel(mijnwinkels.get(p), this.getFragmentManager());
} 

【讨论】:

    【解决方案2】:

    而不是

    adaptor.setItemCLickCallback(this);
    

    一旦为您的片段使用以下代码:

       adaptor.setItemCLickCallback(new Adaptor.ItemCLickCallback () {
                    @Override
                    public void onItemClick(int position) {
    
        }
    
    });
    

    【讨论】:

    • 编辑了我的代码,抱歉,不够清楚。我的方法工作得很好,我想避免重复代码(仍然必须编写),但我不知道在这种情况下该怎么做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2016-03-18
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多