package com.loopeer.codereader.ui.adapter; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.loopeer.codereader.R; import com.loopeer.codereader.model.DirectoryNode; import com.loopeer.codereader.ui.view.DirectoryNavDelegate; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class DirectoryAdapter extends RecyclerViewAdapter<DirectoryNode> { DirectoryNode mNodeRoot; private DirectoryNavDelegate.FileClickListener mFileClickListener; public DirectoryAdapter(Context context, DirectoryNavDelegate.FileClickListener fileClickListener) { super(context); mFileClickListener = fileClickListener; } public void setNodeRoot(DirectoryNode root) { mNodeRoot = root; updateData(adaptNodes()); } public DirectoryNode getNodeRoot() { return mNodeRoot; } private List<DirectoryNode> adaptNodes() { ArrayList<DirectoryNode> nodes = new ArrayList<>(); if (mNodeRoot.isDirectory) { StringBuilder sb = new StringBuilder(); createShowNodes(nodes, -1, mNodeRoot, sb); } else { mNodeRoot.displayName = mNodeRoot.name; nodes.add(mNodeRoot); } return nodes; } private void createShowNodes(ArrayList<DirectoryNode> nodes, int i, DirectoryNode nodeRoot, StringBuilder sb) { ++i; if (!nodeRoot.pathNodes.isEmpty()) { if (nodes.size() != 0 && nodeRoot.pathNodes.size() == 1 && nodeRoot.pathNodes.get(0).isDirectory) { nodeRoot.openChild = true; nodes.remove(nodes.size() - 1); --i; DirectoryNode node = nodeRoot.pathNodes.get(0); node.depth = i; sb.append("."); sb.append(node.name); node.displayName = sb.toString(); nodes.add(node); if (node.openChild || (node.pathNodes != null && node.pathNodes.size() == 1 && node.pathNodes.get(0).isDirectory)) { createShowNodes(nodes, i, node, sb); } } else { for (DirectoryNode node : nodeRoot.pathNodes) { if (sb.length() > 0) sb.delete(0, sb.length()); node.depth = i; sb.append(node.name); node.displayName = sb.toString(); nodes.add(node); if (node.openChild || (node.pathNodes != null && node.pathNodes.size() == 1 && node.pathNodes.get(0).isDirectory)) { createShowNodes(nodes, i, node, sb); } } } } } @Override public void bindView(final DirectoryNode var1, int var2, RecyclerView.ViewHolder var3) { if (var3 instanceof DirectoryViewHolder) { DirectoryViewHolder viewHolder = (DirectoryViewHolder) var3; viewHolder.bind(var1); View.OnClickListener clickListener = view -> { if (var1.isDirectory) { var1.openChild = !var1.openChild; updateData(adaptNodes()); } else { mFileClickListener.doOpenFile(var1); } }; viewHolder.itemView.setOnClickListener(clickListener); } if (var3 instanceof CodeReadRepoHeaderViewHolder) { CodeReadRepoHeaderViewHolder viewHolder = (CodeReadRepoHeaderViewHolder) var3; viewHolder.bind(mNodeRoot); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = getLayoutInflater(); View view; switch (viewType) { case R.layout.list_item_code_read_repo_header: view = inflater.inflate(R.layout.list_item_code_read_repo_header, parent, false); return new CodeReadRepoHeaderViewHolder(view); default: view = inflater.inflate(R.layout.list_item_directory, parent, false); return new DirectoryViewHolder(view); } } @Override public int getItemViewType(int position) { if (position == 0) { return R.layout.list_item_code_read_repo_header; } return R.layout.list_item_directory; } @Override public int getItemCount() { return super.getItemCount() == 0 ? 0 : super.getItemCount() + 1; } @Override public DirectoryNode getItem(int position) { if (position == 0) return mNodeRoot; return super.getItem(position - 1); } class DirectoryViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.text_directory_name) TextView mTextDirectoryName; @BindView(R.id.img_directory_open_close) ImageView mImgOpenClose; DirectoryNode mNode; public DirectoryViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } public void bind(DirectoryNode pathNode) { mNode = pathNode; mTextDirectoryName.setText(pathNode.displayName); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams(); params.leftMargin = 20 * pathNode.depth; mImgOpenClose.setSelected(mNode.openChild); int drawableId = R.drawable.ic_directory_file; if (pathNode.isDirectory) { drawableId = R.drawable.ic_directory_path; mImgOpenClose.setVisibility(pathNode.pathNodes.isEmpty() ? View.INVISIBLE : View.VISIBLE); } else { mImgOpenClose.setVisibility(View.INVISIBLE); } Drawable drawable = ContextCompat.getDrawable(itemView.getContext(), drawableId); mTextDirectoryName.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); } } class CodeReadRepoHeaderViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.img_code_read_repo_type) ImageView mImgRepoType; @BindView(R.id.text_code_read_repo_name) TextView mTextRepoName; public CodeReadRepoHeaderViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } public void bind(DirectoryNode directoryNode) { mImgRepoType.setImageResource(directoryNode.isDirectory ? R.drawable.ic_repo_white : R.drawable.ic_document_white); mTextRepoName.setText(directoryNode.name); } } }