大家做安卓开发的时候listview是经常使用到的东西(虽然现在有了recyclerview),在这里我把自己懂得一点东西分享出来,大神手下留情。
listview点击某一项做操作的时候大家都知道,listview有自己的item监听事件但是如果是点击item的某一个子控件呢?
估计很多新手都会这么写
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
这样真好吗- -。。如果有大量的逻辑判断都写在这里的话,首先代码不整洁 条理不清晰就算了!它还丑!没错 我们多复制几遍看下效果
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
holder.tv_tz.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(context,MainActivity2.class);
context.startActivity(intent);
}
});
是不是有种淡淡的忧伤。。内存优化的问题咱们就不多说了(我也说不明白) 刚开始我就是这样写的后来被老大训了一顿,说我这都是啥!啥!啥。。。
于是我又改了一种方法运用到了handle。
首先适配器构造方法
public TestAdapter(Context context,List<Integer>integers,Handler handler) {
// TODO Auto-generated constructor stub
if(integers!=null){
this.integers=integers;
}else{
this.integers=new ArrayList<Integer>();
}
this.lif=LayoutInflater.from(context);
this.context=context;
this.handler=handler;
}```
然后重写点击事件onClickListener
//重写的点击监听
private class OnItemClickListener implements OnClickListener{
//点击的某个控件
private int indexClick=0;
//点击的某一项
private int position=0;
public OnItemClickListener(int indexClick,int position) {
// TODO Auto-generated constructor stub
this.indexClick=indexClick;
this.position=position;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Message message=new Message();
message.what=indexClick;
message.obj=integers.get(position);
//发送handle
handler.sendMessage(message);
}
然后就是子控件的监听事件
//跳转的监听事件
holder.tv_tz.setOnClickListener(new OnItemClickListener(CLICK_ITEM_TZ, position));
//删除某一项的监听事件
holder.tv_delete.setOnClickListener(new OnItemClickListener(CLICK_ITEM_DELETE, position));
这样代码就一目了然了,把逻辑放到主页面去做
public class MainActivity extends Activity {
private List<Integer> integers;
private TestAdapter testAdapter;
private ListView lv;
//图片的数组
private int[] tupians = new int[] { R.drawable.tupian1, R.drawable.tupian2,
R.drawable.tupian3, R.drawable.tupian4, R.drawable.tupian5,
R.drawable.tupian6, R.drawable.tupian7, R.drawable.tupian8, };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv_main);
integers=new ArrayList<Integer>();
for(int i=0;i<tupians.length;i++){
integers.add(tupians[i]);
}
//适配数据
testAdapter=new TestAdapter(this, integers, handler);
lv.setAdapter(testAdapter);
}
//创建接收数据的handle
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
Integer integer=(Integer) msg.obj;
switch (msg.what) {
//跳转
case TestAdapter.CLICK_ITEM_TZ:
Intent intent=new Intent(MainActivity.this,MainActivity2.class);
//传递图片的id到下一个页面
intent.putExtra("integer", integer);
startActivity(intent);
break;
//删除
case TestAdapter.CLICK_ITEM_DELETE:
//移除点击的某一项数据
integers.remove(integer);
//重新适配
testAdapter=new TestAdapter(MainActivity.this, integers, handler);
lv.setAdapter(testAdapter);
break;
default:
break;
}
}
};
}
MainActivity2显示上个页面传递过来的图片id并加载
public class MainActivity2 extends Activity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2);
imageView=(ImageView) findViewById(R.id.im_main2);
Intent intent=getIntent();
int id=intent.getIntExtra("integer", 0);
imageView.setImageResource(id);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
});
}
![效果图]()
listview有时候会根据需求会让他选中的时候改变背景颜色,我们可以在适配器给出一个识别的标志 判断是否是他的时候改变选中的item的背景颜色
首先适配器设置一个标识
//选中的某一项 默认为第一项
public static int select=0;
根据不同的标识设置不同的背景色
if(select==position){
//选中时背景色为红色
holder.rl_bg.setBackgroundColor(Color.parseColor("#ff3333"));
}else{
//否则白色
holder.rl_bg.setBackgroundColor(Color.parseColor("#ffffff"));
}
在activity设置listview的点击事件,让标识等于当前点击的position并刷新适配器
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int positon,
long arg3) {
// TODO Auto-generated method stub
//让选中的标识等于点击position 并刷新适配器
TestAdapter.select=positon;
testAdapter.notifyDataSetChanged();
}
});