众所周知RecyclerView是androidv7包下的控件,比listview的灵活度高,但是RecyclerView并未提供多选,长按的、单击的功能,这些功能需要我们自己去实现,这就导致要实现多选就比较麻烦。
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.ActionMode;
import android.view.View;
import android.view.ViewGroup;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* weiheng.li
*/
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
protected List<T> data;
protected Context context;
protected ActionMode mode;
protected OnItemClickListener mOnItemClickListener;
protected MultiChoiceModeListener multiChoiceModeListener;
protected boolean IsChoiceModeL = false;//是否显示多选按钮
protected Set<Integer> selectedPositionSet = new HashSet<Integer>() {
};
public void setData(List<T> data) {
this.data = data;
}
public List<T> getData() {
return data;
}
public Set<Integer> getSelectedPositionSet() {
return selectedPositionSet;
}
public void setMultiChoiceModeListener(Context context, MultiChoiceModeListener multiChoiceModeListener) {
this.multiChoiceModeListener = multiChoiceModeListener;
}
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
@Override
public abstract ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
if (selectedPositionSet.contains(position))
((CardView) holder.itemView).setCardBackgroundColor(Color.DKGRAY);
else
((CardView) holder.itemView).setCardBackgroundColor(Color.WHITE);
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!IsChoiceModeL) {
//不为多选
mOnItemClickListener.onItemClick(holder.itemView, position);
} else {
if (multiChoiceModeListener != null) {
boolean select = IsAddSelected(position);
if (selectedPositionSet.size() > 0) {
multiChoiceModeListener.onItemCheckedStateChanged(mode, position, select);
BaseAdapter.this.notifyDataSetChanged();
} else {
mode.finish();//取消
}
}
}
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (multiChoiceModeListener != null && IsChoiceModeL == false) {
mode = ((Activity) context).startActionMode(multiChoiceModeListener);
IsChoiceModeL = true;
multiChoiceModeListener.onItemCheckedStateChanged(mode, position, IsAddSelected(position));
BaseAdapter.this.notifyDataSetChanged();
} else {
mOnItemClickListener.onItemLongClick(holder.itemView, position);
}
return false;
}
});
}
}
public BaseAdapter(Context context, List<T> data) {
this.data = data;
this.context = context;
}
@Override
public int getItemCount() {
return data.size();
}
public ActionMode getMode() {
return mode;
}
public boolean isChoiceModeL() {
return IsChoiceModeL;
}
private boolean IsAddSelected(int namePosition) {
if (selectedPositionSet.contains(namePosition)) {
selectedPositionSet.remove(namePosition);
return false;
} else {
selectedPositionSet.add(namePosition);
return true;
}
}
/**
* 全部选中
*/
public void allSelected() {
this.selectedPositionSet.clear();
for (int i = 0; i < data.size(); i++)
selectedPositionSet.add(i);
this.notifyDataSetChanged();
}
/**
* 取消选中
*/
public void cancelSelected() {
IsChoiceModeL = false;
this.selectedPositionSet.clear();
this.notifyDataSetChanged();
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
public interface MultiChoiceModeListener extends ActionMode.Callback {
public void onItemCheckedStateChanged(ActionMode mode,
int position, boolean checked);
}
}
子类实现方式
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.hengjiatech.waterpatrolapp.R;
import com.hengjiatech.waterpatrolapp.model.PatrolRecord;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import java.util.List;
/**
* Created by HengJiaTech_7 on 2016/5/3 0003.
*/
public class TestAdapter extends BaseAdapter<PatrolRecord> {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
myViewHolder holder = new myViewHolder(LayoutInflater.from(
context).inflate(R.layout.record_item, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
PatrolRecord p = data.get(position);
myViewHolder mholder = ((myViewHolder) holder);
mholder.titleTv.setText(p.getTitle());
mholder.descriptionTv.setText(p.getDescriptionDisplay());
mholder.personTv.setText(p.getPersons());
mholder.startTimeTv.setText(p.getStartTimeDisplay());
super.onBindViewHolder(mholder, position);
}
public TestAdapter(Context context, List<PatrolRecord> data) {
super(context, data);
}
class myViewHolder extends RecyclerView.ViewHolder {
@ViewInject(R.id.title_tv)
TextView titleTv;
@ViewInject(R.id.description_tv)
TextView descriptionTv;
@ViewInject(R.id.persons_tv)
TextView personTv;
@ViewInject(R.id.start_time_tv)
TextView startTimeTv;
public myViewHolder(View view) {
super(view);
ViewUtils.inject(this, view);
}
}
}
Activity实现
package com.hengjiatech.waterpatrolapp.uitl;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
import android.widget.Toast;
import com.hengjiatech.waterpatrolapp.PatrolRecordListQueryActivity;
import com.hengjiatech.waterpatrolapp.PatrolRecordManager;
import com.hengjiatech.waterpatrolapp.PatrolRecordSingleActivity;
import com.hengjiatech.waterpatrolapp.R;
import com.hengjiatech.waterpatrolapp.model.PatrolRecord;
import com.hengjiatech.waterpatrolapp.model.RecordQueryExpression;
import com.hengjiatech.waterpatrolapp.view.SpaceItemDecoration;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ContentView;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;
import java.util.ArrayList;
import java.util.List;
@ContentView(R.layout.record_list)
public class TestListActivity extends AppCompatActivity {
@ViewInject(R.id.id_recyclerview)
private RecyclerView mRecyclerView;
private TestAdapter patrolRecordAdapter;
private static final int REQUEST_CODE_UPDATE_RECORD = 100;
private static final int REQUEST_CODE_ADD_RECORD = 101;
private static final int REQUEST_CODE_QUERY_RECORD = 102;
private List<PatrolRecord> selectItem = new ArrayList<PatrolRecord>();
private int catalog = PatrolRecord.CATALOG_ALL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewUtils.inject(this);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.addItemDecoration(new SpaceItemDecoration(30));
patrolRecordAdapter = new TestAdapter(this, new ArrayList<PatrolRecord>());
patrolRecordAdapter.setOnItemClickListener(new TestAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position) {
}
});
patrolRecordAdapter.setMultiChoiceModeListener(this, new TestAdapter.MultiChoiceModeListener() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.menu_record_delete, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_delete) {
if (selectItem.size() > 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(TestListActivity.this);
builder.setMessage(String.format("是否删除这%d项内容?", selectItem.size()));
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
patrolRecordAdapter.getData().removeAll(selectItem);
mode.finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mode.finish();
dialogInterface.dismiss();
}
});
builder.show();
} else {
Toast.makeText(TestListActivity.this, "当前无删除项!", Toast.LENGTH_SHORT).show();
mode.finish();
}
} else if (id == R.id.action_cancel) {
mode.finish();
} else if (id == R.id.action_check_all) {
//全选
selectItem.clear();
selectItem.addAll(patrolRecordAdapter.getData());
patrolRecordAdapter.allSelected();
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
//ActionMode 消失时执行
notifyDataSetChanged();
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, boolean checked) {
// System.out.println(String.format("position =%d title=%s ", position, patrolRecordAdapter.getPatrolRecord(position).getTitle()) + checked);
if (checked) {
selectItem.add(patrolRecordAdapter.getData().get(position));
} else {
selectItem.remove(patrolRecordAdapter.getData().get(position));
}
System.out.println(String.format("size=%d >>", selectItem.size()));
}
});
mRecyclerView.setAdapter(patrolRecordAdapter);
catalog = getIntent().getIntExtra("catalog", PatrolRecordManager.CATALOG_ALL);
actionBar.setSelectedNavigationItem(catalog);
}
public void notifyDataSetChanged() {
System.out.println("删除size," + selectItem.size() + "selectsize=" + patrolRecordAdapter.selectedPositionSet.size());
selectItem.clear();
patrolRecordAdapter.cancelSelected();
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章