listview/gridview 好像有个 setChoiceMode
自己之前做需求中,用了一种recyclerview 多选的问题
avtivity代码:
package com.cinread.glance.ui;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.cinread.glance.R;
import com.cinread.glance.adapter.DetailDataAdapter;
import com.cinread.glance.base.UIUtils;
import com.cinread.glance.bean.DetailInfo;
import com.cinread.glance.helper.SimpleItemTouchHelperCallback;
import com.cinread.glance.utils.Constants;
import com.cinread.glance.utils.FileUtils;
import com.cinread.glance.utils.SPUtils;
import com.cinread.glance.view.NoScrollRrecyclerView;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.db.sqlite.Selector;
import com.lidroid.xutils.exception.DbException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @project:glance
* @package:com.cinread.glance.ui
* @author:pengjf
* @update:2016/5/7
* @desc: TODO
*/
// Created by pengjf on 2016/5/7.
public class DetailDataActivity extends Activity implements View.OnClickListener {
private int mCur = 0;
private TextView mTvPages;
private RelativeLayout mTopBar;
private ImageView mIvDes; //left
private ImageView mIvInc; //right
//private CheckBox checkbox;
private TextView mBtnOk;
private List<DetailInfo> mDatas;
//public static final String[] str = new String[]{FileUtils.getSdPath() + "/File/PNGFiles/", FileUtils.getSdPath() + "/Note/NoteDir/"/*, FileUtils.getSdPath() + "/comic/"*/};
private DbUtils db = UIUtils.getDb();
private AsyncTask<Void, Void, Void> mAsyncTask;
private DetailDataAdapter mAdapter;
private NoScrollRrecyclerView recyclerView;
private ItemTouchHelper mItemTouchHelper;
private boolean isChange = false;
private HashMap<Integer, Boolean> map = new HashMap<Integer, Boolean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
}
@Override
protected void onStart() {
super.onStart();
init();
initView();
initData();
initEvent();
}
private void initView() {
mTopBar = (RelativeLayout) findViewById(R.id.jmall_top_bar);
mBtnOk = (TextView) findViewById(R.id.btn_ok);
mTvPages = (TextView) findViewById(R.id.tabstrip_tv_pages);
mIvDes = (ImageView) findViewById(R.id.tabstrip_iv_pagedes);
mIvInc = (ImageView) findViewById(R.id.tabstrip_iv_pageinc);
//checkbox = (CheckBox) findViewById(R.id.detail_iv_check);
recyclerView = (NoScrollRrecyclerView) findViewById(R.id.recyclerview);
}
private void init() {
//所有文件 遍历查询并显示
mAsyncTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
findAllFile(FileUtils.getSdPath());
List<DetailInfo> all = null;
try {
all = db.findAll(Selector.from(DetailInfo.class));
//select * from tb_note group by dirname order by opentime desc;
} catch (DbException e) {
e.printStackTrace();
}
if (all != null) {
mDatas = all;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
initData();
mTvPages.setText(String.format("%d - %d / %d", 1, 6, mDatas == null ? 0 : mDatas.size()));
}
};
mAsyncTask.execute();
}
private void findAllFile(String path) {
File file = new File(path);
File files[] = file.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
if (files[i].isDirectory() && files[i].listFiles().length > 0) {
findAllFile(files[i].getAbsolutePath());
} else {
boolean isPdf = fileName.toLowerCase().endsWith(".pdf");
boolean isEpub = fileName.toLowerCase().endsWith(".epub");
if (isPdf || isEpub) {
try {
DetailInfo di = new DetailInfo();
di.setFilename(fileName);
di.setFilepath(files[i].getAbsolutePath());
di.setIsCheck(SPUtils.getBoolean(DetailDataActivity.this, "check" + fileName, false));
db.replace(di);
} catch (DbException e) {
e.printStackTrace();
}
}
}
}
}
}
private void initData() {
mAdapter = new DetailDataAdapter(this, mDatas);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(mAdapter);
mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(recyclerView);
}
private void initEvent() {
mTopBar.setOnClickListener(this);
mBtnOk.setOnClickListener(this);
mIvDes.setOnClickListener(this);
mIvInc.setOnClickListener(this);
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mBtnOk.setVisibility(View.VISIBLE);
try {
int count = 0;
for (int i = 0, p = mDatas.size(); i < p; i++) {
if (isChecked) {
map.put(i, true);
count++;
} else {
if (!isChange) {
map.put(i, false);
count = 0;
} else {
map = mAdapter.getMap();
count = map.size();
}
}
}
mAdapter.setMap(map);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
public void onClick(View v) {
if (v == mIvDes) {
mCur--;
if (mCur <= 0) {
mCur = 0;
}
recyclerView.scrollToPosition(mCur * 6);
mTvPages.setText(String.format("%d - %d / %d", (mCur + 1) * 6 - 5, (mCur + 1) * 6, mDatas.size()));
} else if (v == mIvInc) {
mCur++;
if ((mCur + 1) * 6 >= mDatas.size()) {
mCur = mDatas.size() / 6;
}
recyclerView.scrollToPosition(mCur * 6 + 1);
mTvPages.setText(String.format("%d - %d / %d", (mCur + 1) * 6 - 5, (mCur + 1) * 6, mDatas.size()));
} else if (v == mBtnOk) {
ArrayList<String> string = new ArrayList<String>();
if (mBtnOk.isShown()) {
for (int i = 0; i < mDatas.size(); i++) {
if (map != null && map.size() > 0) {
if (map.get(i)) {
string.add(mDatas.get(i).getFilepath());
}
}
}
//write to file
FileWriter fw = null;
try {
File file = new File(UIUtils.getAppFile() + Constants.SETPATH);
if (!file.exists()) {
file.createNewFile();
}
fw = new FileWriter(file);
fw.write("");
//写入
fw.write(SPUtils.getInt(DetailDataActivity.this, "play_duration", 10 * 60 * 1000) + "\n");
fw.write(SPUtils.getInt(DetailDataActivity.this, "play_mode", 0) + "\n");
fw.write(SPUtils.getInt(DetailDataActivity.this, "low_power", 10 * 60 * 1000) + "\n");
//fw.write(mFilePath + "\n");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
FileUtils.close(fw);
}
if (string.size() <= 0) {
Toast.makeText(DetailDataActivity.this, "设置失败,请至少选择一项", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(DetailDataActivity.this, "设置成功", Toast.LENGTH_SHORT).show();
finish();
}
}
} else if (v == mTopBar) {
recyclerView.scrollToPosition(0);
}
}
@Override
protected void onResume() {
super.onResume();
init();
}
}
adapter代码:
package com.cinread.glance.adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.cinread.glance.R;
import com.cinread.glance.bean.DetailInfo;
import com.cinread.glance.helper.ItemTouchHelperAdapter;
import com.cinread.glance.helper.ItemTouchHelperViewHolder;
import com.lidroid.xutils.BitmapUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
* @project:Rss
* @package:com.cinread.rss
* @author:pengjf
* @update:2016/4/9
* @desc: TODO
*/
// Created by pengjf on 2016/4/9.
public class DetailDataAdapter extends RecyclerView.Adapter<DetailDataAdapter.ItemViewHolder> implements ItemTouchHelperAdapter {
private List<DetailInfo> mItems;
private Context mContext;
public HashMap<Integer, Boolean> map;
public DetailDataAdapter(Context context, List<DetailInfo> data) {
this.mContext = context;
this.mItems = data;
map = new HashMap<Integer, Boolean>();
init();
}
private void init() {
if (null == mItems || mItems.size() <= 0) {
return;
}
for (int i = 0, p = mItems.size(); i < p; i++) {
map.put(i, false);
}
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_detail, parent, false);
ItemViewHolder itemViewHolder = new ItemViewHolder(view);
return itemViewHolder;
}
@Override
public void onBindViewHolder(final ItemViewHolder holder, final int position) {
if (null == mItems || mItems.size() <= 0) {
return;
}
holder.tvName.setText(mItems.get(position).getFilename());
BitmapUtils u = new BitmapUtils(mContext);
u.display(holder.ivImage, mItems.get(position).getFilepath());
holder.ivCheck.setTag(new Integer(position));//设置tag 否则划回来时选中消失
if (map != null) {
holder.ivCheck.setChecked((map.get(position)));
} else {
holder.ivCheck.setChecked(false);
}
holder.ivCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int mFlags = (Integer) view.getTag();
if (map != null) {
if (map.get(position)) {
map.put(position, false);
} else {
map.put(mFlags, Boolean.TRUE);
}
}
}
});
}
@Override
public int getItemCount() {
return mItems == null ? 0 : mItems.size();
}
@Override
public void onItemDismiss(int position) {
mItems.remove(position);
notifyItemRemoved(position);
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(mItems, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
return true;
}
/**
* Simple example of a view holder that implements {@link ItemTouchHelperViewHolder} and has a
* "handle" view that initiates a drag event when touched.
*/
public static class ItemViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
public TextView tvName;
public CheckBox ivCheck;
public ImageView ivImage;
public ItemViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.tv_name);
ivImage = (ImageView) itemView.findViewById(R.id.iv_image);
ivCheck = (CheckBox) itemView.findViewById(R.id.iv_check);
}
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(0);
}
}
public HashMap<Integer, Boolean> getMap() {
return map;
}
public void setMap(HashMap<Integer, Boolean> map) {
this.map = map;
notifyDataSetChanged();
}
}