package carbon.dialog; import android.content.Context; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.StyleRes; import android.support.v7.widget.LinearLayoutManager; import android.view.View; import android.view.ViewGroup; import java.util.Arrays; import java.util.List; import carbon.R; import carbon.recycler.RowFactory; import carbon.recycler.RowListAdapter; import carbon.widget.LinearLayout; import carbon.widget.RecyclerView; public class ListDialog<Type> extends DialogBase { protected RecyclerView recyclerView; protected RowListAdapter adapter; protected List<Type> items; protected RecyclerView.OnItemClickedListener listener; private RecyclerView.OnItemClickedListener internalListener = getInternalListener(); public ListDialog(@NonNull Context context) { super(context); init(); } public ListDialog(@NonNull Context context, @StyleRes int themeResId) { super(context, themeResId); init(); } private void init() { recyclerView = new RecyclerView(getContext()); recyclerView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1)); int padding = getContext().getResources().getDimensionPixelSize(R.dimen.carbon_paddingHalf); recyclerView.setPadding(0, padding, 0, padding); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); super.setContentView(recyclerView, null); } protected RecyclerView.OnItemClickedListener getInternalListener() { return (view, item, position) -> { if (listener != null) listener.onItemClicked(view, item, position); dismiss(); }; } protected void dividerCallback(int contentHeight) { int padding = getContext().getResources().getDimensionPixelSize(R.dimen.carbon_paddingHalf); int height = padding * 2; for (int i = 0; i < recyclerView.getChildCount(); i++) { height += recyclerView.getChildAt(i).getHeight(); } height += recyclerView.getAdapter().getItemCount() - recyclerView.getChildCount(); if (height <= contentHeight) { if (topDivider != null) topDivider.setVisibility(View.GONE); if (bottomDivider != null) bottomDivider.setVisibility(View.GONE); } else { if (topDivider != null) topDivider.setVisibility(View.VISIBLE); if (bottomDivider != null) bottomDivider.setVisibility(View.VISIBLE); } } @Override public void setContentView(@LayoutRes int layoutResID) { throw new RuntimeException("not supported"); } @Override public void setContentView(@NonNull View view) { throw new RuntimeException("not supported"); } @Override public void setContentView(@NonNull View view, ViewGroup.LayoutParams params) { throw new RuntimeException("not supported"); } public void setItems(Type[] items, RowFactory<Type> factory) { this.items = Arrays.asList(items); adapter = new RowListAdapter<>(this.items, factory); adapter.setOnItemClickedListener(internalListener); recyclerView.setAdapter(adapter); } public void setItems(List<Type> items, RowFactory<Type> factory) { this.items = items; adapter = new RowListAdapter<>(items, factory); adapter.setOnItemClickedListener(internalListener); recyclerView.setAdapter(adapter); } public void setOnItemClickedListener(RecyclerView.OnItemClickedListener listener) { this.listener = listener; } }