小试一下自定义接口的使用

来源:互联网 发布:windows 相对路径 编辑:程序博客网 时间:2024/04/29 15:10

在Android中接口有很多的用处,接口的具体定义和使用场景就不多说了,网络多的是。

这里提供一个使用场景:一个页面中有一个ListView,每个条目都可以点击,点击时删除一个条目,当条目被删除完的时候,显示一个图片或者一个提示性的语句。

代码很简单,就一个MainActivity,一个adapter,这里是这样使用的:


MainActivity的代码:

package com.example.text;


import java.util.ArrayList;


import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


import com.example.text.MyAdapter.OnListener;

public class MainActivity extends ActionBarActivity {


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

ArrayList<String> s = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
s.add("哥哥你好" + i);
}
ListView listView = (ListView) findViewById(R.id.list);
final TextView tv = (TextView) findViewById(R.id.tv);
MyAdapter adapter = new MyAdapter(s, this);


               // 借口是在adapter中定义的,所以用adapter来使用接口,即setOnListener();
adapter.setOnListener(new OnListener() {

// 实现接口的方法,在该方法中写具体的逻辑,比如这里就只是让xml布局中本来隐藏的TextView显示出来
@Override
public void listener(int size) {
tv.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, size + "aa", Toast.LENGTH_SHORT).show();
}
});
listView.setAdapter(adapter);
}





}


adapter的二代码如下:

package com.example.text;


import java.util.ArrayList;


import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;


import com.example.text.R.layout;


public class MyAdapter extends BaseAdapter {

private Context context;
private ArrayList<String> s;
public MyAdapter(ArrayList<String> s, Context context){
this.context = context;
this.s = s;
}


@Override
public int getCount() {
return s.size();
}


@Override
public Object getItem(int arg0) {
return s.get(arg0);
}


@Override
public long getItemId(int arg0) {
return arg0;
}


@Override
public View getView(final int position, View arg1, ViewGroup arg2) {
View view = View.inflate(context, layout.item, null);
TextView text = (TextView) view.findViewById(R.id.text);
Button button = (Button) view.findViewById(R.id.button);
text.setText(s.get(position));
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
s.remove(position);
notifyDataSetChanged();
System.out.println("mOnListener = " + mOnListener);
if(s.size() == 0){

if(mOnListener != null){
mOnListener.listener(position);
}
}
}
});
return view;
}


// 定义一个借口
public interface OnListener{
void listener(int size);
}


// 用成员变量记录传进来的listener

public OnListener mOnListener;
/
/ 提供其他类设置listener的方法,类似button的setOnClickListener()方法

        public void setOnListener(OnListener onListener){
// 把传进来的listener赋值给成员变量用以记录
this.mOnListener = onListener;
}

}


这里自定义接口的思路是:

需要在Activity中改变TextView的显示与否,所以需要在这里setOnListener,因为是在点击item中button时,如果是点击取消最后一条,则应该显示文字提示,所以

自定义接口写在了adapter中,activity一调用setOnListener,则adapter中的public void setOnlistener(....)方法就传进来了listener,再把这个值赋值给成员变量记录,

成员变量有了值,就可以调用接口中的onListener方法了,调用该方法需要合适的时机,这里就是在点击取消的button中调用的。


我的使用场景是:有一个关注列表,每个item都可以点击取消关注,如果没有了关注,则显示一个图片和一个文字提示,这里当取消关注成功后,并且此时已经没有了关注,

则利用接口回调的方式进行处理。因为这种场景还是挺常见的,而且我用的都是这种方式(也不知道好不好),所以就简单的写了下。写的不好请见谅!!!


0 0
原创粉丝点击