listview + checkBox 的结合

由于正在学习MediaCodec、MediaExtractor等工具,并在写一个项目demo

项目的目的是完成视频的转码、裁剪、合并、播放

在合并的时候,由于考虑到用户需要可选的合并视频,因为需要提供一个可视化的列表供其选择,因此listview+checkBox就不得不使用了。

标配的MyAdapter配置

package com.example.myapplication3.Utils;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;

import com.example.myapplication3.R;

import java.util.List;

/**
 * Created by weizheng.huang on 2019-11-04.
 */
public class CheckListAdapter extends BaseAdapter {
    private List  list;
    private Context mContext;

    public void setCheckListObserver(CheckListObserver checkListObserver) {
        this.checkListObserver = checkListObserver;
    }

    private CheckListObserver checkListObserver;
    public CheckListAdapter(List list, Context mContext) {
        this.list = list;
        this.mContext = mContext;
    }

    public interface CheckListObserver{
        public void checkClick(boolean isChecked,int position);
    }
    @Override
    public int getCount() {
        return list.size() > 0 ? list.size() : 0;
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;

        if (view == null){
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.checklistitem,viewGroup,false);
            viewHolder.checkBox = view.findViewById(R.id.checkbox);
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.checkBox.setText(list.get(i).getText());
        viewHolder.checkBox.setChecked(list.get(i).isChecked());
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (checkListObserver != null) {
                    checkListObserver.checkClick(b, i);
                }
            }
        });
        return view;
    }


    class ViewHolder{
        CheckBox checkBox;
    }
}

简单说一下各个要点:
1.getView、getItem 是获取item数据时调用的,

2.getItemId 是点击事件时会调用的,getCount是在绘制listview内部时会调用的。

3.getView里边Holder类是为了缓存一下item里的控件,我这里只缓存了checkbox一个控件,其目的是为了不需要重新进行一次item子控件绑定。这里convertView则是缓存一个item的视图,假如listview是多样化的item的话,convertView结合holder就会产生神奇的化学反应,会极大的降低绑定控件、加载item视图的时间。

4.我这里多了一个Observer接口,是为了当复选按钮被勾上或取消的时候能及时反馈到持有Adapter的类,并完成必要的数据更新操作,因为复选按钮被勾上或取消肯定是为了加上或删除某个item的数据,这没毛病吧。

下面是持有Adapter的类的部分代码

    private void initListView() {
        listAdd(datalist);
        checkListAdapter = new CheckListAdapter(datalist, this.getBaseContext());
        checkListAdapter.setCheckListObserver(new CheckListAdapter.CheckListObserver() {
            @Override
            public void checkClick(boolean isChecked, int position) {
                if (isChecked) {
                    fileList.add(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + datalist.get(position).getText());
                } else {
                    fileList.remove(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + datalist.get(position).getText());
                }

            }
        });
        listView.setAdapter(checkListAdapter);
    }

 

你可能感兴趣的:(MediaCodec框架的学习)