由于正在学习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<CheckBox> list;
private Context mContext;
public void setCheckListObserver(CheckListObserver checkListObserver) {
this.checkListObserver = checkListObserver;
}
private CheckListObserver checkListObserver;
public CheckListAdapter(List<CheckBox> 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);
}