【问题标题】:Where should I call Interface in android?我应该在哪里调用android中的接口?
【发布时间】:2016-12-08 06:48:54
【问题描述】:

我正在尝试使用接口从适配器类调用活动方法。两个活动都是独立的,即调用适配器的类和定义方法的类。

接口类

public interface AdapterCallback  {        
    int onMethodCallback();
}

适配器类

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> {

    String[] goals;
    Context context;
    private AdapterCallback mAdapterCallback;


    public  SimpleAdapter(Context context, String[] goals)
    {
        super();
        this.context=context;
        this.goals=goals;


    }

   /* public SimpleAdapter(Context context) {

        try {

        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement AdapterCallback.");
        }

    }*/

    @Override
    public SimpleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_item,parent,false);
        return new ViewHolder(view);
    }

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

      holder.textView.setText(goals[position]);

      holder.textView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

              try {
                  mAdapterCallback = ((AdapterCallback) context);
                  int result=mAdapterCallback.onMethodCallback();
                  Toast.makeText(context,Integer.toString(result), Toast.LENGTH_SHORT).show();
              } catch (ClassCastException exception) {
                  // do something
                  Log.i("In the catch","Yes");
              }




          }
      });

    }

    @Override
    public int getItemCount() {
        return  goals.length;
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        Button textView;

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

            textView=(Button) itemView.findViewById(R.id.text);
        }
    }

}

方法在 MainActivity.class 中定义

@Override
public int onMethodCallback() {
    // do something
    return 2;
}

问题: 我应该如何调用接口函数,以便间接调用 MainActivity 类中定义的函数。

我知道我需要提供 MainActivity 的上下文

mAdapterCallback = ((AdapterCallback) context);

但是我应该把这段代码放在哪里。

如果我将这段代码放在构造函数中,那么它将不会获得 MainActivity 类上下文,因为适配器是从另一个类调用的。

编辑:

public class MainActivity extends AppCompatActivity implements AdapterCallback {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public int onMethodCallback() {
        // do something
        return 2;
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    public int sampleFunction()
    {
        return 2;
    }
}

编辑 2

调用适配器类的类

public class OtherClass extends AppCompatActivity {

    RecyclerView recyclerView;
    SimpleAdapter simpleAdapter;
    String[]  action_name={"Swimming","Yoga","SWD","IFT","Follow Diet Plan", "Diagnostic Tests","Record Temperature","Record Blood Pressure"," Record Sugar Level","Record Weight"};

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

        recyclerView=(RecyclerView) findViewById(R.id.recylerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));


        simpleAdapter=new SimpleAdapter(this, action_name);

        recyclerView.setAdapter(simpleAdapter);

    }
}

【问题讨论】:

  • 能把MainActivity的代码发一下吗?
  • 完成@DeepakSachdeva
  • 检查我发布的解决方案。
  • 更新@DeepakSachdeva
  • @AnkurKhandelwal 试试我的解决方案?如果您有任何问题,请告诉我?

标签: java android interface android-arrayadapter


【解决方案1】:

首先你已经设置了接口。在你的适配器类中写一个这样的方法

    AdapterCallback  adapterCallback ;
    public void setAdapterCallback(AdapterCallback adapterCallback){
      this.adapterCallback = adapterCallback
    } 

现在隐含并初始化您实际需要回调的接口。在你的情况下MainActivity这样做

MainActivity extends AppCompatActivity implements AdapterCallback 

现在像这样初始化你的界面。

   SimpleAdapter adpter = new SimpleAdapter()   
   adpter.setAdapterCallback(this);       // very imp step

现在像这样发送回调

 holder.textView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
               if(adapterCallback  != null){
                  adapterCallback.onMethodCallback();  
              }
          }
      });

这就是你在 mainactivity 上得到的所有回调..

编辑

我看到你在另一个活动中设置了你的适配器。在这种情况下,你必须像这样传递你的接口对象

AdapterCallback  adapterCallback = this;
Intent intent = new Intent(context, OtherClass.class);
intent.putExtra("interface", adapterCallback);
startActivity(intent);

并在 OtherClass 中检索它;

Intent intent = getIntent();
AdapterCallback   inter = (AdapterCallback) intent.getSerializableExtra("interface");

还将接口更改为可序列化。

public interface AdapterCallback  extends Serializable {
     int onMethodCallback();
}

和setInterface这样

  simpleAdapter.setAdapterCallback(inter);

如果你只使用片段而不是其他类,那会容易得多..

编辑

如果这两个活动是独立的,那么您可以在 Application 类中为您的接口编写 getter 和 setter。从 mainActivity 设置接口并在您的适配器中获取回调..
在你的应用程序类中写下这个

AdapterCallback  adapterCallback;
public AdapterCallback getAdapterCallback() {
    return adapterCallback;
}

public void setAdapterCallback(AdapterCallback adapterCallback) {
    this.adapterCallback = adapterCallback;
}

把这个写在你的Main

((YourApplication)getApplication()). setAdapterCallback(this);

并在您的点击中使用此方法

((YourApplication) getApplication()).getAdapterCallback().onMethodCallback();

【讨论】:

  • 嘿,我已经尝试过了,但是得到了 adapterCallback=null,我还添加了构造函数 public SimpleAdapter(Context context) { try { this.context=context; } catch (ClassCastException e) { throw new ClassCastException("Activity 必须实现 AdapterCallback。"); } } 对于 SimpleAdapter 适配器 = new SimpleAdapter()
  • 我认为你完全错了。调用方法就像是完全独立的,MainActivity 和其他类之间没有任何关系。如果我这样设置 startActivity(intent);然后 MainActivity 总是移动到 otherclass
  • @AnkurKhandelwal 那么你为什么要调用这个 startActivity(new Intent(MainActivity.this,OtherClass.class));你想在哪里回调
  • 这只是个假人。我不能把实际代码写得这么长,也不能达到目的..
  • 不使用fragment有什么办法。
【解决方案2】:

如果您在 MainActivity 中实现了接口 AdapterCallback,则调用 SimpleAdapter 的构造函数,其中包含 AdapterCallback 对象的新参数。试试这些改变。可能对你有帮助

String[] goals;
Context context;
private AdapterCallback mAdapterCallback;

public  SimpleAdapter(Context context, AdapterCallback adapterCallback, String[] goals){
        super();
        this.context=context;
        this.adapterCallback = adapterCallback;
        this.goals=goals;
    }

并删除它

mAdapterCallback = ((AdapterCallback) context);

【讨论】:

  • 我调用适配器的类与我定义接口方法定义的类不同。
  • 只是为了澄清一下,所以他需要准备 MainActivity 和现有 Activity 中的数据和所有内容?
  • 请提供您调用 SimpleAdapter 的代码。
  • 假设你有 2 个 Activity A 和 B,并且 B Activity 有适配器。然后在BActivity中实现一个接口,在BActivity中接口的实现方法中获取数据,然后调用finish()。完成 B 活动后,您可以将数据移动到活动 A 的 onActivityResult()。然后您可以在 A 活动中使用您的数据。也许它可以解决你的问题。
  • 首先我无法在活动 B(适配器调用类)中声明该函数。 @DeepakSachdeva
【解决方案3】:

我不确定只是尝试解决方法,

如果你有一个 Util 类创建一个方法或创建一个 Util 类并做

 private Context mContext;
    public void setContext(Context context) {
        mContext = context;
    }

    public Context getContext(){

        return mContext;
    }

然后

在 MainActivity 中设置上下文

喜欢

Util.setContext(MainActivity.this);

在 SimpleAdapter 类中使用 Util.getContext() 和

Context context = Util.getContext();
 if(context != null && context instanceof MainActivity){
    mAdapterCallback = ((AdapterCallback) context);
    int result=mAdapterCallback.onMethodCallback();
 }

【讨论】:

    【解决方案4】:
       public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> {
    
        String[] goals;
        Context context;
        private AdapterCallback mAdapterCallback;
    
    
        public  SimpleAdapter(Context context, String[] goals)
        {
            super();
            this.context=context;
            this.goals=goals;
        }
    
       /* public SimpleAdapter(Context context) {
    
            try {
    
            } catch (ClassCastException e) {
                throw new ClassCastException("Activity must implement AdapterCallback.");
            }
    
        }*/
    
        @Override
        public SimpleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_item,parent,false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(final SimpleAdapter.ViewHolder holder, int position) {
    
            holder.textView.setText(goals[position]);
    
            holder.textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    try {
                        mAdapterCallback = ((AdapterCallback) context);
                        int result=mAdapterCallback.onMethodCallback();
                        Toast.makeText(context,Integer.toString(result), Toast.LENGTH_SHORT).show();
                    } catch (ClassCastException exception) {
                        // do something
                        Log.i("In the catch","Yes");
                    }
                }
            });
    
        }
        @Override
        public int getItemCount() {
            return  goals.length;
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            Button textView;
            public ViewHolder(View itemView) {
                super(itemView);
                textView=(Button) itemView.findViewById(R.id.text);
                //for entire cell
                itemView.setOnClickListener(this);
                //or only for button
                textView.setOnClickListener(this);
            }
    
            @Override
            public void onClick(View view) {
                /*
                If your want clicked position you can use bellow code
                 */
                //int clicked_position = getAdapterPosition();
                mAdapterCallback.onMethodCallback(clicked_position,goals[clicked_position]);
            }
        }
    }
    

    这是我们必须在android recyclerview中使用界面的方式

    编辑

    像下面这样改变你的界面

    public interface AdapterCallback  {
        void onMethodCallback(int position,String value);
    }
    

    在您的 OtherClass.class 上,如下所示

        public class OtherClass extends AppCompatActivity implements AdapterCallback{
    
        RecyclerView recyclerView;
        SimpleAdapter simpleAdapter;
        String[]  action_name={"Swimming","Yoga","SWD","IFT","Follow Diet Plan", "Diagnostic Tests","Record Temperature","Record Blood Pressure"," Record Sugar Level","Record Weight"};
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.xtra);
    
            recyclerView=(RecyclerView) findViewById(R.id.recylerview);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
    
            simpleAdapter=new SimpleAdapter(this, action_name);
    
            recyclerView.setAdapter(simpleAdapter);
    
        }
    
        @Override
        public void onMethodCallback(int position, String value) {
            System.out.println(value+"    "+position);
            //start activity intent here , now you have position as well as selected value
        }
    }
    

    【讨论】:

    • OP的问题是什么意思?
    • 问题:我应该如何调用接口函数,以便间接调用MainActivity类中定义的函数。?阅读原文中此语句后的接下来 4 行
    • 只需在 AppCompactActivity 或 Activity 后的 Activity 上添加“ implements AdapterCallback ”
    • 你可以在这里发布你的活动吗?
    • 阅读问题 MainActivity 和 Adapter 之间没有连接。这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2017-01-06
    • 2018-10-04
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多