Android Scrollview+Listview 实现不同条目点赞并计数功能及原理分析(3)
来源:互联网 发布:大非农数据是什么意思 编辑:程序博客网 时间:2024/06/02 21:52
过了有点久,还好上次把代码发上去了,不会影响。现在我们来解决最后一个问题
点赞后计数改变
这个问题难在哪里呢,就是我们需要在自定义的adapter中设置每个item长什么样子,每个子控件的clickListener也需要在这里设置,但是有时候点击事件需要改变外层的页面属性。比如我在item中有一个button,点击它,整个屏幕就暗了,显然需要在外界得到这个button的click事件。解决这个问题有几种方法,下面一个个说;
- 使用回调函数(也是代码中使用的)
在adapter中设置一个interface,然后在click中调用interface的方法,外层的代码需要实现这个interface,这样实际button的click的具体实现方法就在外层去做了。
item实现代码:
public class SampleItem extends BaseAdapter implements View.OnClickListener{ private Context context; private Callback callback; private List<ItemMsg> listMsg; public List<ItemMsg> getListMsg() { return listMsg; } public void setListMsg(List<ItemMsg> listMsg) { this.listMsg = listMsg; } public SampleItem(Context context,Callback callback,List<ItemMsg> list){ this.context = context; this.callback = callback; this.listMsg = list; } public interface Callback{ public void myClick(View view); } @Override public int getCount() { return listMsg.size(); } @Override public Object getItem(int i) { return listMsg.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder= null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.item,null); viewHolder = new ViewHolder(); viewHolder.up = (ImageButton)view.findViewById(R.id.up); viewHolder.down = (ImageButton)view.findViewById(R.id.down); viewHolder.itemMsg = (TextView)view.findViewById(R.id.item_text); view.setTag(viewHolder); }else{ viewHolder = (ViewHolder)view.getTag(); } viewHolder.up.setOnClickListener(this); viewHolder.up.setTag(i); viewHolder.down.setOnClickListener(this); viewHolder.down.setTag(i); viewHolder.itemMsg.setText(Integer.toString(listMsg.get(i).getI())); return view; } public class ViewHolder{ private ImageButton up,down; private TextView itemMsg; } @Override public void onClick(View view) { callback.myClick(view); }}
外层调用代码:
public class MainActivity extends Activity implements SampleItem.Callback{ private ListView listView; private SampleItem sampleItemAdapter; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { ... } @Override public void myClick(View view) { switch(view.getId()){ case R.id.up: ItemMsg itemMsgUp = sampleItemAdapter.getListMsg().get((Integer)view.getTag()); itemMsgUp.increase(); sampleItemAdapter.notifyDataSetChanged(); break; case R.id.down: ItemMsg itemMsgDown = sampleItemAdapter.getListMsg().get((Integer)view.getTag()); itemMsgDown.decrease(); sampleItemAdapter.notifyDataSetChanged(); break; } }}
2 传入handler,在每一次点击事件的时候发送一个msg,然后在外层拦截
这种方式就比较“Android”,但是并不是一个好方法,每一个点击事件都需要发送一个message,效率不高,也许有些场景会接受这种。
item代码:
public class SampleItem extends BaseAdapter implements View.OnClickListener{ public static final int UP = 1; public static final int DOWN = 2; private Context context; private Callback callback; private List<ItemMsg> listMsg; private Handler handler; public List<ItemMsg> getListMsg() { return listMsg; } public void setListMsg(List<ItemMsg> listMsg) { this.listMsg = listMsg; } public SampleItem(Context context,Callback callback,List<ItemMsg> list){ this.context = context; this.callback = callback; this.listMsg = list; } public SampleItem(Context context,List<ItemMsg> list,Handler handler){ this.context = context; this.listMsg = list; this.handler = handler; } public interface Callback{ public void myClick(View view); } @Override public int getCount() { return listMsg.size(); } @Override public Object getItem(int i) { return listMsg.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder= null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.item,null); viewHolder = new ViewHolder(); viewHolder.up = (ImageButton)view.findViewById(R.id.up); viewHolder.down = (ImageButton)view.findViewById(R.id.down); viewHolder.itemMsg = (TextView)view.findViewById(R.id.item_text); view.setTag(viewHolder); }else{ viewHolder = (ViewHolder)view.getTag(); } viewHolder.up.setOnClickListener(this); viewHolder.up.setTag(i); viewHolder.down.setOnClickListener(this); viewHolder.down.setTag(i); viewHolder.itemMsg.setText(Integer.toString(listMsg.get(i).getI())); return view; } public class ViewHolder{ private ImageButton up,down; private TextView itemMsg; } @Override public void onClick(View view) { //way 1// callback.myClick(view); //way 2 Message msg = new Message(); msg.arg1 = (Integer)view.getTag(); switch (view.getId()){ case R.id.up: msg.what = UP; handler.sendMessage(msg); break; case R.id.down: msg.what = DOWN; handler.sendMessage(msg); break; } }}
外层代码:
Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case SampleItem.UP: ItemMsg itemMsgUp = sampleItemWithHandler.getListMsg().get(msg.arg1); itemMsgUp.increase(); sampleItemWithHandler.notifyDataSetChanged(); break; case SampleItem.DOWN: ItemMsg itemMsgDown = sampleItemWithHandler.getListMsg().get(msg.arg1); itemMsgDown.decrease(); sampleItemWithHandler.notifyDataSetChanged(); break; } } };
这两种方法都是可以发到目的,时间不早了,再不回宿舍就关门了。。。
接下来在这个基础上加上一个下拉刷新,尽请期待~~~
新加了一种实现方式,代码地址:
http://download.csdn.net/detail/wsrspirit/9294389
1 0
- Android Scrollview+Listview 实现不同条目点赞并计数功能及原理分析(3)
- Android Scrollview+Listview 实现不同条目点赞并计数功能及原理分析(1)
- Android Scrollview+Listview 实现不同条目点赞并计数功能及原理分析(2)
- Android中Listview实现点赞功能
- Android ListView实现不同item的方法和原理分析
- Android ListView实现不同item的方法和原理分析
- android开发游记:ScrollView嵌套ListView,ListView完全展开及makeMeasureSpec测量机制原理分析
- Android ListView条目全选功能,不用checkbox实现!
- Android ListView条目全选功能,不用checkbox实现!
- Android ListView条目全选功能,不用checkbox实现!
- Android ScrollView中的ListView只显示一个条目问题
- 局部刷新ListView,实现点赞功能
- android listview 加载多种不同视图的条目
- ListView加载不同的条目
- 多条目展示ListView(如:有两种不同的布局图片在listview条目上展示)
- ListView实现类似多米的条目下拉功能
- 对ListView的多条目的一些实现功能
- listview网络请求数据并实现多条目展示
- 1011. A+B和C (15)
- ZZULIOJ 1795 爱吃薯片的寒聚聚
- Java并发编程:Lock
- ExcuteReader详解
- android菜单插件Slidingmenu和Actionbarsherlock组合使用做侧滑菜单
- Android Scrollview+Listview 实现不同条目点赞并计数功能及原理分析(3)
- 如何配置安全的Linux服务器
- objective-c中Category 类别、扩展 专题总结
- 正式项目中,web项目中的slf4j* jar包 删除 -- 项目错误记录
- 关于tuple的创建中
- shared_ptr智能指针源码剖析
- 1085. Perfect Sequence (25)
- 中文标点的Unicode编码
- UITableView编辑