package com.yaoyumeng.v2ex.ui.adapter; import android.content.Context; import android.content.Intent; import android.os.Parcelable; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.SectionIndexer; import android.widget.TextView; import com.yaoyumeng.v2ex.R; import com.yaoyumeng.v2ex.model.NodeModel; import com.yaoyumeng.v2ex.ui.NodeActivity; import com.yaoyumeng.v2ex.utils.PinyinAlpha; import com.yaoyumeng.v2ex.utils.PinyinComparator; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * Created by yw on 2015/4/28. */ public class AllNodesAdapter extends RecyclerView.Adapter<AllNodesAdapter.ViewHolder> implements SectionIndexer { Context mContext; List<NodeModel> mNodes = new ArrayList<NodeModel>(); List<NodeModel> mAllNodes = new ArrayList<NodeModel>(); HashMap<String, Integer> mAlphaPosition = new HashMap<String, Integer>(); String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public AllNodesAdapter(Context context) { mContext = context; } public HashMap<String, Integer> getAlphaPosition() { return mAlphaPosition; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_node, viewGroup, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final NodeModel node = mNodes.get(position); viewHolder.card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, NodeActivity.class); intent.putExtra("model", (Parcelable) node); mContext.startActivity(intent); } }); viewHolder.title.setText(node.title); if (node.header != null) { viewHolder.header.setVisibility(View.VISIBLE); viewHolder.header.setText(Html.fromHtml(node.header)); } else { viewHolder.header.setVisibility(View.GONE); } viewHolder.topics.setText(node.topics + " 个主题"); } @Override public int getItemCount() { return mNodes.size(); } public void update(ArrayList<NodeModel> data) { TreeMap<String, List<NodeModel>> lists = new TreeMap<String, List<NodeModel>>(); for (int i = 0; i < data.size(); i++) { NodeModel node = data.get(i); String alpha = PinyinAlpha.getFirstChar(node.title); if (!lists.containsKey(alpha)) { List<NodeModel> list = new ArrayList<NodeModel>(); list.add(node); lists.put(alpha, list); } else { lists.get(alpha).add(node); } } PinyinComparator comparator = new PinyinComparator(); mNodes.clear(); Iterator iter = lists.entrySet().iterator(); int offset = 0; while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String key = (String) entry.getKey(); List<NodeModel> val = (List<NodeModel>) entry.getValue(); Collections.sort(val, comparator); mNodes.addAll(val); mAlphaPosition.put(key, offset); offset += val.size(); } mAllNodes = mNodes; notifyDataSetChanged(); } @Override public int getPositionForSection(int i) { return mAlphaPosition.get(mSections.substring(i, i + 1)); } @Override public int getSectionForPosition(int i) { return 0; } @Override public Object[] getSections() { String[] chars = new String[mSections.length()]; for (int i = 0; i < mSections.length(); i++) { chars[i] = String.valueOf(mSections.charAt(i)); } return chars; } public void filterText(CharSequence query) { if (TextUtils.isEmpty(query)) { mNodes = mAllNodes; notifyDataSetChanged(); return; } List<NodeModel> result = new ArrayList<NodeModel>(); for (NodeModel node : mAllNodes) { if (node.name.contains(query) || node.title.contains(query) || (node.titleAlternative != null && node.titleAlternative.contains(query))) result.add(node); } mNodes = result; notifyDataSetChanged(); } static class ViewHolder extends RecyclerView.ViewHolder { public TextView title; public TextView header; public TextView topics; public CardView card; public ViewHolder(View view) { super(view); card = (CardView) view.findViewById(R.id.card_container); title = (TextView) view.findViewById(R.id.node_title); header = (TextView) view.findViewById(R.id.node_summary); topics = (TextView) view.findViewById(R.id.node_topics); } } }