您的位置:首页 > 移动开发 > Android开发

Android实用技巧.列表技巧(二).itemClick

2016-12-23 15:41 369 查看
当list页每一个item有多个点击事件,并且逻辑处理需要在activity中时,就需要把点击事件传递到activity中。



有两种方式:委托模式和反射机制

下边具体例子:

创建列表页

public class ListListenerActivity extends Activity implements ItemClickListener{
ListView listView;
private ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation_controller);
listView = (ListView)findViewById(R.id.listView);
List<String> list = new ArrayList<>();
list.add("页面1");
list.add("页面2");
list.add("页面3");
list.add("页面4");
list.add("页面5");
list.add("页面6");
list.add("页面7");
list.add("页面8");
list.add("页面9");
list.add("页面10");
adapter = new ListAdapter(this,ListListenerActivity.this,list,this);
listView.setAdapter(adapter);
}

@Override
public void itemClickListener(int idx) {
toastText(idx);
}
public void toastText(Integer idx){
Toast.makeText(this,"接口调用监听"+idx,Toast.LENGTH_SHORT).show();
}
public void toastText2(Integer idx){
Toast.makeText(this,"反射调用监听"+idx,Toast.LENGTH_SHORT).show();
}
}


adapter:
/**
* Created by Dujq on 2016/12/23.
*/
public class ListAdapter extends BaseAdapter {
private Context ctx;
private Object object;
private List<String> list;
private LayoutInflater mInflater;
private ItemClickListener itemListener;
public ListAdapter(Context ctx, Object object, List<String> list,ItemClickListener itemListener){
this.ctx = ctx;
this.list = list;
this.object = object;
this.itemListener = itemListener;
this.mInflater = LayoutInflater.from(ctx);
}

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

@Override
public Object getItem(int i) {
return list.get(i);
}

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

@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
view = mInflater.inflate(R.layout.item_textview, null);
viewHolder.textView = (TextView) view
.findViewById(R.id.text);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.textView.setText(list.get(i)==null?"":list.get(i));
viewHolder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(i%2==0){
reflectMethod(i);
}else{
itemListener.itemClickListener(i);
}
}
});
return view;
}
/**
* 反射调用委托方法
*/
public void reflectMethod(Integer idx) {
Method cMethod;
try {
cMethod = object
.getClass()
.getMethod(
"toastText2",
new Class[] {
Class.forName("java.lang.Integer") });
cMethod.invoke(object, idx);
} catch (Exception e) {
e.printStackTrace();
}
}
public  final class  ViewHolder{
TextView textView;
}

public Context getCtx() {
return ctx;
}

public void setCtx(Context ctx) {
this.ctx = ctx;
}

public Object getObject() {
return object;
}

public void setObject(Object object) {
this.object = object;
}

public List<String> getList() {
return list;
}

public void setList(List<String> list) {
this.list = list;
}
}


接口监听:
创建接口
/**
* Created by Dujq on 2016/12/23.
*/
public interface ItemClickListener {
void itemClickListener(int idx);
}
在acrivity中实现,然后传到adapter中调用即可

反射监听:
把activity类传到adapter中,通过反射机制调用类中的方法
/**
* 反射调用委托方法
*/
public void reflectMethod(Integer idx) {
Method cMethod;
try {
cMethod = object
.getClass()
.getMethod(
"toastText2",
new Class[] {

c074
Class.forName("java.lang.Integer") });
cMethod.invoke(object, idx);
} catch (Exception e) {
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: