本文实例为大家分享了Android仿今日头条订阅频道,供大家参考,具体内容如下
源码:Android实现今日头条订阅频道
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.a2_.MainActivity"> <TextView android:background="@android:color/holo_blue_dark" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="已订阅频道" /> <com.example.a2_.MyGridLayout android:id="@+id/gl1" android:columnCount="4" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> </com.example.a2_.MyGridLayout> <TextView android:gravity="center_horizontal" android:background="@android:color/darker_gray" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="未订阅频道" /> <com.example.a2_.MyGridLayout android:columnCount="4" android:id="@+id/gl2" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> </com.example.a2_.MyGridLayout> </LinearLayout>
shape文件和选择器
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="5dp"/> <stroke android:color="#000" android:width="1dp"/> </shape>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="5dp"/> <stroke android:color="#ff0000" android:dashGap="1dp" android:dashWidth="3dp" android:width="1dp"/> </shape>
自定义布局
package com.example.a2_; import android.animation.LayoutTransition; import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.util.AttributeSet; import android.view.DragEvent; import android.view.View; import android.widget.GridLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2017.06.08.0008. */ public class MyGridLayout extends GridLayout implements View.OnDragListener { private OnItemClickListener listener; private List<Rect> rects; private View DragItem = null; private boolean dragable; public MyGridLayout(Context context, AttributeSet attrs) { super(context, attrs); //添加动画 setLayoutTransition(new LayoutTransition()); //舰艇拖拽事件 setOnDragListener(this); } //根据传递进来的数据,动态地添加控件 public void setData(List<String> list) { for (int i = 0; i < list.size(); i++) { addItem(list.get(i)); } } public void addItem(String s) { final TextView textView = new TextView(getContext()); textView.setText(s); textView.setTextColor(Color.BLACK); textView.setPadding(15, 5, 15, 5); //设置背景 textView.setBackgroundResource(R.drawable.selector_item_bg); textView.setTextSize(25); //将控件添加到页面中 addView(textView); LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); //设置外边距 layoutParams.setMargins(5, 5, 5, 5); //监听textview点击事件 textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (listener != null) { listener.onItemClick(v); } } }); //监听控件的长按事件 textView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { if (!dragable) { return true; } //把当前长按的控件变红,并且有虚线 v.setBackgroundResource(R.drawable.selector_item_red_bg); //开始拖拽控件 v.startDrag(null, new DragShadowBuilder(v), null, 0); DragItem = v; //获取所有空间的矩形区域 getAllRect(); return true; } }); } //获取所有的矩形区域 private void getAllRect() { rects = new ArrayList<>(); for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); //获取每个控件的坐标点,并存在集合中 rects.add(new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } } public void setOnClickListener(OnItemClickListener listener) { this.listener = listener; } @Override public boolean onDrag(View v, DragEvent event) { if (!dragable) { return true; } switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: System.out.println("ACTION_DRAG_STARTED"); break; case DragEvent.ACTION_DRAG_ENTERED: System.out.println("ACTION_DRAG_ENTERED"); break; case DragEvent.ACTION_DRAG_EXITED: System.out.println("ACTION_DRAG_EXITED"); break; case DragEvent.ACTION_DRAG_LOCATION: System.out.println("ACTION_DRAG_LOCATION"); //拖拽移动时,位置发生变化 //根据当前的位置,判断应该插入到哪个位置 int dragItemIndex = findDragItem(event); if (dragItemIndex != -1 && DragItem != null && getChildAt(dragItemIndex) != DragItem) { //先删除原来的控件 removeView(DragItem); //吧新的控件拖拽到新的位置 addView(DragItem, dragItemIndex); } break; case DragEvent.ACTION_DROP: System.out.println("ACTION_DROP"); break; case DragEvent.ACTION_DRAG_ENDED: System.out.println("ACTION_DRAG_ENDED"); if (DragItem != null) { DragItem.setBackgroundResource(R.drawable.selector_item_bg); } break; } return true; } private int findDragItem(DragEvent event) { if (rects == null) { return -1; } for (int i = 0; i < rects.size(); i++) { //如果鼠标当前的坐标包含在某个控件的坐标内部,那就说明,当前在该空间内部 if (rects.get(i).contains((int) event.getX(), (int) event.getY())) { return i; } } return -1; } public interface OnItemClickListener { void onItemClick(View v); } // 设置控件是否可以拖拽 public void setDragable(boolean dragable) { this.dragable = dragable; } }
核心代码
package com.example.a2_; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import java.util.Arrays; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; public class MainActivity extends Activity { @InjectView(R.id.gl1) MyGridLayout gl1; @InjectView(R.id.gl2) MyGridLayout gl2; @InjectView(R.id.activity_main) LinearLayout activityMain; //创建已订阅和为订阅的集合 private List<String> select = Arrays.asList("北京", "中国", "国际", "体育", "生活", "旅游", "科技", "军事", "时尚", "财经", "育儿", "汽车"); private List<String> unselect = Arrays.asList("娱乐", "服饰", "音乐", "视频", "段子", "搞笑", "科学", "房产", "名站"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); //初始化数据 initData(); } private void initData() { gl1.setData(select); gl2.setData(unselect); gl1.setDragable(true); //设置监听 gl1.setOnClickListener(new MyGridLayout.OnItemClickListener() { @Override public void onItemClick(View v) { gl1.removeView(v); //设置中间人 String s = ((TextView) v).getText().toString(); gl2.addItem(s); } }); gl2.setOnClickListener(new MyGridLayout.OnItemClickListener() { @Override public void onItemClick(View v) { gl2.removeView(v); //设置中间人 String s = ((TextView) v).getText().toString(); gl1.addItem(s); } }); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
数据结构中堆的概念,堆排序 死锁的概念,怎么避免死锁 ReentrantLock 、synchronized和volatile(n面) HashMap singleTask启动模式 用到的一些开源框架,介绍一个看过源码的,内部实现过程。 消息机制实现 ReentrantLock的内部实现 App启动崩溃异常捕捉 事件传递机制的介绍 ListView的优化 二叉树,给出根节点和目标节点,找出从根节点
11.1 今日头条 1.今日头条后台,配置“转化类型”为“激活”、“激活且注册”或“激活且付费”的转化; Ps:及策仅支持回调激活和注册,无付费指标 2.监测地址,填写及策后台生成的点击监测链接。 3.今日头条后台,一个计划只能对应一个转化,一个转化可以对应多个计划。 若需按照计划维度监测数据,可以创建多个转化,和计划一一对应。 头条后台设置: 第一步:创建转化跟踪 第二步:设置广告监测 “创建目
本文向大家介绍Android仿今日头条滑动页面导航效果,包括了Android仿今日头条滑动页面导航效果的使用技巧和注意事项,需要的朋友参考一下 最近项目中用到了滑动页面,也就是和目前市场上很火的"今日头条"页面滑动类似,在网上找了一下,大部分都是用ViewPager来实现的,刚开始我用的是ViewPager+ViewGroup,上面的标题按钮用的是HorizontalScrollView,写完之后
本文向大家介绍Android仿今日头条多个fragment懒加载的实现,包括了Android仿今日头条多个fragment懒加载的实现的使用技巧和注意事项,需要的朋友参考一下 前言 最近有时间,所以我又双叒叕推新一篇文章了,fragment懒加载实现虽然是个小模块,但做过的人都有体会,通常并不会轻易就成功了的,让你辗转反侧,彻夜难眠,绵绵无绝期。我就按照今日头条的样式做了一个懒加载功能。文章到一半
本文向大家介绍iOS自定义UITabBar仿今日头条效果,包括了iOS自定义UITabBar仿今日头条效果的使用技巧和注意事项,需要的朋友参考一下 动机 关于自定义 TabBar,早就有过很多讨论,开源网站上也有很多造好的轮子,多半是纯代码实现有个性的 TabBar,当然我们可以很方便的使用它。周末闲着没事干,自己也写了一下,模仿今日头条的 TabBar 效果,实现方式是Storyboard +
本文向大家介绍java实现简单的爬虫之今日头条,包括了java实现简单的爬虫之今日头条的使用技巧和注意事项,需要的朋友参考一下 前言 需要提前说下的是,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问。下面话不多说了,直接上代码。 示例代码如下 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可
专业面一(46min)(2022-9-15) 自我介绍 后期补上 算法题 反问(问了部门的业务以及技术栈、您觉得我的专业能力有哪些需要提升的?、面试流程) 专业面二(48min)(2022-9-21) 自我介绍 后期补上 算法题 反问(您觉得我的专业能力有哪些需要提升的?、面试流程) 专业面三(1h3min)(2022-9-27) 自我介绍 后期补上 反问(新人培养制度、面试官学习的方法、面试流程
一面 - 12.30 自我介绍 介绍头条项目的功能 具体如何解决搜索遇到的前端异步请求竞态问题 防抖如何做的 记住滚动条位置如何做的/会出现闪动问题吗/手动实现还是用的api 这个功能有没有考虑不同浏览器兼容性的问题 资讯一次渲染多少条 加载很多会白屏吗 有什么性能问题吗 移动端适配具体怎么做的 用的插件原理是什么 如果我想把css中的px转成其他单位,有的我不想转换,让你做这样的插件,有什么思路