`

LISTVIEW的单选和多选

阅读更多
使用LISTVIEW会遇到单选和多选的情况:

前提:LISTVIEW和ADAPTER(建议用自己写的,方便控制)

一.单选


    /** ADAPTER部分 */
    private int selectedIndex = -1; //定义一个标记

    //适合单选
    public void setSelectedIndex(int ind) {
        selectedIndex = ind;
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
     ............
     if (selectedIndex == position) {
       flag.setVisibility(View.VISIBLE);
     } else {
       flag.setVisibility(View.INVISIBLE);
     }

     .........
    }

    /** ACTIVITY 或 Fragment */
    adapter.setSelectedIndex(position);
    adapter.notifyDataSetChanged(); 
     



二.多选

填充数据的时候,数组初始化,并调用父类刷新
选中数据的时候,将KEY-VALUE放进数组,再调用父类刷新


    /** ADAPTER部分 */
    private SparseArray<Integer> sparseArray;//定义一个数组

    /**
     * 重写:用于列表更新
     * 这样就可以清理掉已选的标签
     */
    @Override
    public void notifyDataSetChanged() {
        this.sparseArray = new SparseArray<Integer>();
        super.notifyDataSetChanged();
    }

    /**
     * 适合多选
     * 调用父类的notifyDataSetChanged 去处理显示
     *
     * @param position
     */
    public void setMultiSelected(int position) {
        if (sparseArray.get(position) != null) { //在里面 清理
            sparseArray.delete(position);
        } else {
            sparseArray.append(position, position);
        }
        super.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
     ............
     if (sparseArray.get(houseInfo.houseId) != null) {
           flag.setVisibility(View.VISIBLE);
     }
     else {
           flag.setVisibility(View.INVISIBLE);
     }
     ..........
     }

     /** ACTIVITY 或 Fragment */
     
     //数据刷新什么的使用
     adapter.notifyDataSetChanged(); 

     //选中什么的使用
     adapter.setMultiSelected(houseInfo.houseId);


    另外的一种办法: 使用一个MAP存放选中的内容,然后获取flag再标记,这样会出现一个问题,软键盘的消失会重新绘制ADAPTER,导致选中的丢失,故多选的办法我觉得要好点

xxxxListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

    Object object= (object) adapterView.getAdapter().getItem(position);
    View flag = view.findViewById(R.id.flag);
     if (checkMap.get(object.id) != null) {
         flag.setVisibility(View.INVISIBLE);
         checkMap.remove(object.id);
      } else {
          flag.setVisibility(View.VISIBLE);
          checkMap.append(object.id, object);
       }
      }
});



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics