/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.supportv7.util; import com.example.android.supportv7.R; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.util.SortedList; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.util.SortedListAdapterCallback; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; /** * A sample activity that uses {@link SortedList} in combination with RecyclerView. */ public class SortedListActivity extends ActionBarActivity { private RecyclerView mRecyclerView; private LinearLayoutManager mLinearLayoutManager; private SortedListAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sorted_list_activity); mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setHasFixedSize(true); mLinearLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLinearLayoutManager); mAdapter = new SortedListAdapter(getLayoutInflater(), new Item("buy milk"), new Item("wash the car"), new Item("wash the dishes")); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setHasFixedSize(true); final EditText newItemTextView = (EditText) findViewById(R.id.new_item_text_view); newItemTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { if (id == EditorInfo.IME_ACTION_DONE && (keyEvent == null || keyEvent.getAction() == KeyEvent.ACTION_DOWN)) { final String text = textView.getText().toString().trim(); if (text.length() > 0) { mAdapter.addItem(new Item(text)); } textView.setText(""); return true; } return false; } }); } private static class SortedListAdapter extends RecyclerView.Adapter<TodoViewHolder> { SortedList<Item> mData; final LayoutInflater mLayoutInflater; public SortedListAdapter(LayoutInflater layoutInflater, Item... items) { mLayoutInflater = layoutInflater; mData = new SortedList<Item>(Item.class, new SortedListAdapterCallback<Item>(this) { @Override public int compare(Item t0, Item t1) { if (t0.mIsDone != t1.mIsDone) { return t0.mIsDone ? 1 : -1; } int txtComp = t0.mText.compareTo(t1.mText); if (txtComp != 0) { return txtComp; } if (t0.id < t1.id) { return -1; } else if (t0.id > t1.id) { return 1; } return 0; } @Override public boolean areContentsTheSame(Item oldItem, Item newItem) { return oldItem.mText.equals(newItem.mText); } @Override public boolean areItemsTheSame(Item item1, Item item2) { return item1.id == item2.id; } }); for (Item item : items) { mData.add(item); } } public void addItem(Item item) { mData.add(item); } @Override public TodoViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { return new TodoViewHolder ( mLayoutInflater.inflate(R.layout.sorted_list_item_view, parent, false)) { @Override void onDoneChanged(boolean isDone) { int adapterPosition = getAdapterPosition(); if (adapterPosition == RecyclerView.NO_POSITION) { return; } mBoundItem.mIsDone = isDone; mData.recalculatePositionOfItemAt(adapterPosition); } }; } @Override public void onBindViewHolder(TodoViewHolder holder, int position) { holder.bindTo(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } } abstract private static class TodoViewHolder extends RecyclerView.ViewHolder { final CheckBox mCheckBox; Item mBoundItem; public TodoViewHolder(View itemView) { super(itemView); mCheckBox = (CheckBox) itemView; mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mBoundItem != null && isChecked != mBoundItem.mIsDone) { onDoneChanged(isChecked); } } }); } public void bindTo(Item item) { mBoundItem = item; mCheckBox.setText(item.mText); mCheckBox.setChecked(item.mIsDone); } abstract void onDoneChanged(boolean isChecked); } private static class Item { String mText; boolean mIsDone = false; final public int id; private static int idCounter = 0; public Item(String text) { id = idCounter ++; this.mText = text; } } }