记录:在使用 Adapter是对 item的点击设置,合并,不同布局实现
来源:互联网 发布:电脑桌面文件整理软件 编辑:程序博客网 时间:2024/05/16 04:14
摘要:在使用 ListView 中需要更改点击 item上面的文字颜色和相应 item的背景图片。在使用通过 <selector> 标签一直没有成功。后面搜索到 通过 adapter 的“getView“ 和 “setOnItemClickListener“ 达到效果。借此,把 多布局和合并相同内容一起记录一下
item 的点击效果
注意:在 setOnItemClickListener({ })
中一定要使用 notifyDataSetChanged( )
,进行刷新。不然没有对应的效果。
public class ColorAdapter extends BaseAdapter { private Context context ; private List<String> mNames; private List<String> mNums ; private LayoutInflater inflater ; //记录,上一次选中的 item(position) private int old = -1 ; private SparseBooleanArray isSelected ; public ColorAdapter(Context context, List<String> mNames, List<String> mNums) { super(); this.context = context; this.mNames = mNames; this.mNums = mNums; inflater = LayoutInflater.from(context); isSelected = new SparseBooleanArray(); } @Override public int getCount() { return mNames.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder ; if(convertView == null){ convertView = inflater.inflate(R.layout.item_lv, parent, false); holder = new ViewHolder(); holder.item = (LinearLayout) convertView.findViewById(R.id.rl_item); holder.bookNum = (TextView) convertView.findViewById(R.id.tv_book_num); holder.bookCalss = (TextView) convertView.findViewById(R.id.tv_book_class); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } //通过取出存取的值,修改对应的颜色 if(isSelected.get(position)){ holder.item.setBackgroundColor(Color.parseColor("#ffff8800")); holder.bookNum .setTextColor(Color.parseColor("#ffaa66cc")); holder.bookCalss .setTextColor(Color.parseColor("#ff0099cc")); }else{ holder.item.setBackgroundColor(Color.parseColor("#ff33b5e5")); holder.bookNum .setTextColor(Color.parseColor("#ff000000")); holder.bookCalss .setTextColor(Color.parseColor("#ffffffff")); } holder.bookNum.setText(mNums.get(position)) ; holder.bookCalss.setText(mNames.get(position)); return convertView; } public void setSelectItem(int selected){ if(old != -1){ //把上次选中的 item(position),存一个 false的变量 this.isSelected.put(old, false); } //把当前的存一个 true 变量 this.isSelected.put(selected,true); //最后把选中的赋给 old,便于下次选中,取消这一次 old = selected ; } class ViewHolder{ LinearLayout item; TextView bookNum; TextView bookCalss; }}
listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { colorAdapter.setSelectItem(position); colorAdapter.notifyDataSetChanged(); } });
大致的实现步骤:
- 设置 int old = -1,去记录上一点击的位置。默认为 -1,因为 position从 0 开始。SparseBooleanArray isSelected,记录一个 boolean值。
- 编写 “setSelectItem(int selected)“ 函数,把点击中的 position传递过来
- 在“getView( )“ 函数通过“if(isSelected.get(position)){选中项 }else{未选中项}“
效果图如下:
item 相同的合并
public class RepeatAdapter extends BaseAdapter { private Context context ; private List<String> mNames; private List<String> mNums ; private LayoutInflater inflater ; //模拟一个头部的分类 private String[] bookHead = { "军事","政治","历史" }; //模拟一个尾部的时间 private String[] bookDate = { "2017-1-1","2016-1-1","2015-1-1" }; private List<String> date ; private List<String> head ; public RepeatAdapter(Context context, List<String> mNames, List<String> mNums) { super(); this.context = context; this.mNames = mNames; this.mNums = mNums; inflater = LayoutInflater.from(context); date = new ArrayList<>(); head = new ArrayList<>(); for (int i = 0; i < mNames.size(); i++) { //头部数据 if(i <= 5){ head.add("头部分类 :"+bookHead[0]); }else if(i <= 10){ head.add("头部分类 :"+bookHead[1]); }else{ head.add("头部分类 :"+bookHead[2]); } //尾部数据 if(i <= 7){ date.add("创建的时间 :"+bookDate[0]); }else if(i <= 12){ date.add("创建的时间 :"+bookDate[1]); }else{ date.add("创建的时间 :"+bookDate[2]); } } } @Override public int getCount() { return mNames.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder ; if(convertView == null){ convertView = inflater.inflate(R.layout.item_lv, parent, false); holder = new ViewHolder(); holder.bookHead = (TextView) convertView.findViewById(R.id.tv_book_head); holder.bookNum = (TextView) convertView.findViewById(R.id.tv_book_num); holder.bookCalss = (TextView) convertView.findViewById(R.id.tv_book_class); holder.bookDate = (TextView) convertView.findViewById(R.id.tv_book_date); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.bookHead.setText(head.get(position)); holder.bookNum.setText(mNums.get(position)) ; holder.bookCalss.setText(mNames.get(position)); holder.bookDate.setText(date.get(position));// //头部的合并 if(position == 0){//把,第一个去除,避免 ArrayIndexOutOfBoundException //显示第一个 内容 holder.bookHead.setVisibility(View.VISIBLE); holder.bookHead.setText(head.get(position)); }else{//隐藏后面,相同的内容 item if(!TextUtils.equals(head.get(position), head.get(position-1))){ holder.bookHead.setVisibility(View.VISIBLE); holder.bookHead.setText(head.get(position)); }else{ holder.bookHead.setVisibility(View.GONE); } }// 合并尾部 if(position == date.size()-1){ //把,最后一个去除,避免 ArrayIndexOutOfBoundException holder.bookDate.setVisibility(View.VISIBLE) ; holder.bookDate.setText(date.get(position)); }else{ if(!TextUtils.equals(date.get(position), date.get(position+1))){ holder.bookDate.setVisibility(View.VISIBLE) ; holder.bookDate.setText(date.get(position)); }else{ holder.bookDate.setVisibility(View.GONE); } } return convertView ; } class ViewHolder{ TextView bookHead ; TextView bookNum; TextView bookCalss; TextView bookDate; }}
相关图片:
item 的多种布局
public class MultiAdapter extends BaseAdapter { private Context context ; private List<String> mNames; private List<String> mNums ; private LayoutInflater inflater ; private final int ITEM_1 = 0 ; private final int ITEM_2 = 1 ; public MultiAdapter(Context context, List<String> mNames, List<String> mNums) { super(); this.context = context; this.mNames = mNames; this.mNums = mNums; inflater = LayoutInflater.from(context); } @Override public int getItemViewType(int position) { return position%2 == 0 ? ITEM_1 : ITEM_2; } @Override public int getViewTypeCount() { return 2; } @Override public int getCount() { return mNames.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolderOne holderOne = null ; ViewHolderTwo holderTwo = null; int type = getItemViewType(position); if(convertView == null){ switch (type) { case ITEM_1: convertView = inflater.inflate(R.layout.item_lv, parent, false); holderOne = new ViewHolderOne(); holderOne.bookHead = (TextView) convertView.findViewById(R.id.tv_book_head); holderOne.bookNum = (TextView) convertView.findViewById(R.id.tv_book_num); holderOne.bookCalss = (TextView) convertView.findViewById(R.id.tv_book_class); holderOne.bookDate = (TextView) convertView.findViewById(R.id.tv_book_date); convertView.setTag(holderOne); break; case ITEM_2: convertView = inflater.inflate(R.layout.item_lv_copy, parent, false); holderTwo = new ViewHolderTwo(); holderTwo.bookHead = (TextView) convertView.findViewById(R.id.tv_book_head); holderTwo.bookNum = (TextView) convertView.findViewById(R.id.tv_book_num); holderTwo.bookCalss = (TextView) convertView.findViewById(R.id.tv_book_class); holderTwo.bookDate = (TextView) convertView.findViewById(R.id.tv_book_date); convertView.setTag(holderTwo); break; } }else{ switch (type) { case ITEM_1: holderOne = (ViewHolderOne) convertView.getTag(); break; case ITEM_2: holderTwo = (ViewHolderTwo) convertView.getTag(); break; } } switch (type) { case ITEM_1: holderOne.bookHead.setVisibility(View.GONE); holderOne.bookDate.setVisibility(View.GONE); holderOne.bookNum.setText(mNums.get(position)) ; holderOne.bookCalss.setText(mNames.get(position)); break; case ITEM_2: holderTwo.bookHead.setVisibility(View.GONE); holderTwo.bookDate.setVisibility(View.GONE); holderTwo.bookNum.setText(mNums.get(position)) ; holderTwo.bookCalss.setText(mNames.get(position)); break; } return convertView; } class ViewHolderOne{ TextView bookHead ; TextView bookNum; TextView bookCalss; TextView bookDate; } class ViewHolderTwo{ TextView bookHead ; TextView bookNum; TextView bookCalss; TextView bookDate; }}
相关图片:
listview和Gridview的xml属性使用
- disabled 禁用TranscriptMode,也是默认值
- normal 当新条目添加进列表中并且已经准备好显示的时候,列表会自动滑动到底部以显示最新条目
- alwaysScroll 列表会自动滑动到底部,无论新条目是否已经准备好显示
- none : 不改变,把多余的空白留到一边
- spacingWidth:多余的空白平摊给间距
- columnWidth: 多余的空白平分给 列宽
- spacingWidthUniform:
字符分割与比较
在有的时候,我们拿到一个路径的时候,需要进行对立面内容过滤或者需要把后面的毫秒值,截取下来,以便后续的处理。
/** * Compares the specified string to this string to determine if the * specified string is a prefix. * * @param prefix * the string to look for. * @return {@code true} if the specified string is a prefix of this string, * {@code false} otherwise * @throws NullPointerException * if {@code prefix} is {@code null}. */ public boolean startsWith(String prefix) { return startsWith(prefix, 0); }
给定的字符串和自定义的字符串想比较,看是否前缀相同。eg:A.startsWith(B),A
是给定的B
是自己定义的字串
/** * Compares the specified string to this string, starting at the specified * offset, to determine if the specified string is a prefix. * * @param prefix * the string to look for. * @param start * the starting offset. * @return {@code true} if the specified string occurs in this string at the * specified offset, {@code false} otherwise. * @throws NullPointerException * if {@code prefix} is {@code null}. */ public boolean startsWith(String prefix, int start) { return regionMatches(start, prefix, 0, prefix.count); }
指定字符串和自定义字符串从指定的 start 位置开始比较会否前缀相同。eg:A.startsWith(B,C),A
是否和B
从 C
位置开始是否前缀相同,A
是给定的B
是自己定义的字串。
&emsp;&emsp;相对应也用后缀最比较,endsWith(String suffix)
substring
s=s.substring(int begin);截取掉s从首字母起长度为begin的字符串,将剩余字符串赋值给s;
s=s.substring(int begin,int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;
split
split(String regularExpression)将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
split(String regularExpression, int limit)根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
split 的实现直接调用的 matcher 类的 split 的方法。“ . ”在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义(\.)截取的效率问题。
数组的排序
<1> .利用Arrays带有的排序方法快速排序
int[] a={5,4,2,4,9,1};Arrays.sort(a); //进行排序
<2> .冒泡排序算法
public static int[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;i<args.length-1;i++){ for(int j=i+1;j<args.length;j++){ if (args[i]>args[j]){ int temp=args[i]; args[i]=args[j]; args[j]=temp; } } } return args; }
<3> .选择排序算法
public static int[] selectSort(int[] args){//选择排序算法 for (int i=0;i<args.length-1 ;i++ ){ int min=i; for (int j=i+1;j<args.length ;j++ ){ if (args[min]>args[j]){ min=j; } } if (min!=i){ int temp=args[i]; args[i]=args[min]; args[min]=temp; } } return args; }
<4> .插入排序算法
public static int[] insertSort(int[] args){//插入排序算法 for(int i=1;i<args.length;i++){ for(int j=i;j>0;j--){ if (args[j]<args[j-1]){ int temp=args[j-1]; args[j-1]=args[j]; args[j]=temp; }else break; } } return args; }
Comparable与Comparator
Comparable与Comparator的区别
- 记录:在使用 Adapter是对 item的点击设置,合并,不同布局实现
- 在adapter中对item的某个控件点击,并在点击事件中对其他item控件进行设置
- 给Recyclerview的item设置不同布局的Adapter
- 自定义Adapter 加载不同布局的item
- Andriod之Adapter的getViewTypeCount和getItemViewType为Listview的item设置不同的布局
- GridView设置不同的item(布局)
- 设置adapter的item的背景时 不能使用根布局的属性
- 关于在Activty中对Adapter中的item布局改变引起的布局(数据)混乱的问题解决
- listview为不同的item设置不同的点击事件
- 实现listView的不同布局item
- ListView实现不同的Item布局
- Android ListView不同的item布局实现
- RecyclerView通用adapter以及item点击事件的实现
- Adapter类型控件之ListView Item多布局的实现
- Android中ListView使用getItemViewType为item设置不同的布局
- 设置itemcontrol的item点击前后不同状态
- Android为ListView的Item设置不同的布局
- Android为ListView的Item设置不同的布局
- RB-tree性质理解
- environments
- 动态类型 的 概念 与 识别方法
- 分布式架构的演进
- Linux下gitlab安装使用
- 记录:在使用 Adapter是对 item的点击设置,合并,不同布局实现
- nodejs debug 模块入门
- MMC/SD卡驱动的Config.in
- [Java]字节流与字符流的区别
- 【LeetCode41-50】找出丢失最小正整数,计算蓄水量,检测?*匹配(44),跳跳棋,全排列,矩阵逆转,颠倒字母重新排序(auto,set/multiset,vector初始化),n次方
- 常见DOM操作(JS)
- PHP session的使用简介
- swift3.0蓝牙开发(2)
- 1111111111