studio recyclerview make implement how ejemplo create cardview android android-recyclerview

make - recyclerview android studio ejemplo



Ejemplo simple de Android RecyclerView (7)

He hecho una lista de elementos varias veces usando RecyclerView de Android, pero es un proceso bastante complicado. Revisando uno de los numerosos tutoriales en línea ( this , this y this son buenos), pero estoy buscando un ejemplo básico que puedo copiar y pegar para ponerme en marcha rápidamente. Solo son necesarias las siguientes características:

  • Diseño vertical
  • Un solo TextView en cada fila
  • Responde a eventos de clic

Como he deseado esto varias veces, finalmente decidí hacer la respuesta a continuación para mi referencia futura y la suya.


Minimal Recycler view lista para usar la plantilla de Kotlin para:

  • Diseño vertical
  • Un solo TextView en cada fila
  • Responde a eventos de clic (Single y LongPress)

Sé que este es un hilo viejo y también lo son las respuestas aquí. Agregando esta respuesta para referencia futura:

Agregue una vista de reciclaje en su diseño

<android.support.v7.widget.RecyclerView android:id="@+id/wifiList" android:layout_width="match_parent" android:layout_height="match_parent" />

Cree un diseño para mostrar elementos de la lista (list_item.xml)

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:padding="5dp" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatTextView android:id="@+id/ssid" android:text="@string/app_name" android:layout_width="match_parent" android:textSize="17sp" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v7.widget.CardView>

Ahora cree un adaptador mínimo para contener datos, el código aquí se explica por sí mismo

class WifiAdapter(private val wifiList: ArrayList<ScanResult>) : RecyclerView.Adapter<WifiAdapter.ViewHolder>() { // holder class to hold reference inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { //get view reference var ssid: TextView = view.findViewById(R.id.ssid) as TextView } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { // create view holder to hold reference return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { //set values holder.ssid.text = wifiList[position].SSID } override fun getItemCount(): Int { return wifiList.size } // update your data fun updateData(scanResult: ArrayList<ScanResult>) { wifiList.clear() notifyDataSetChanged() wifiList.addAll(scanResult) notifyDataSetChanged() } }

Agregue esta clase para manejar eventos de clic único y clic largo en elementos de lista

import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { public interface ClickListener { void onClick(View view, int position); void onLongClick(View view, RecyclerView recyclerView, int position); } private GestureDetector gestureDetector; private ClickListener clickListener; public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { this.clickListener = clickListener; gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null) { clickListener.onLongClick(child,recyclerView, recyclerView.getChildPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { View child = rv.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child, rv.getChildPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { }

Por último, configure su adaptador en Recycler View y agregue Touch Listener para comenzar a interceptar el evento táctil para tocar una o dos veces los elementos de la lista

wifiAdapter = WifiAdapter(ArrayList()) wifiList.apply { // vertical layout layoutManager = LinearLayoutManager(applicationContext) // set adapter adapter = wifiAdapter // Touch handling wifiList.addOnItemTouchListener(RecyclerTouchListener(applicationContext, wifiList, object : RecyclerTouchListener.ClickListener { override fun onClick(view: View?, position: Int) { Toast.makeText(applicationContext, "RV OnCLickj " + position, Toast.LENGTH_SHORT).show() } override fun onLongClick(view: View, recyclerView: RecyclerView, position: Int) { Toast.makeText(applicationContext, "RV OnLongCLickj " + position, Toast.LENGTH_SHORT).show() } } )) }

Bono; Actualizar datos

wifiAdapter.updateData(mScanResults as ArrayList<ScanResult>)

Resultado:


Ahora necesita 1 adaptador para todos los RecyclerView

  • Se puede usar un adaptador para todos los RecyclerView. Entonces, NO onBindViewHolder , No onCreateViewHolder manejo.
  • No hay código para configurar el adaptador de la clase Java / Kotlin. Verifique la clase de muestra .
  • Puede establecer eventos y datos personalizados para cada lista utilizando Adaptadores de enlace .

Muestro aquí la configuración de dos RecyclerView diferentes por 1 adaptador:

activity_home.xml

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="listOne" type="java.util.List"/> <variable name="listTwo" type="java.util.List"/> <variable name="onItemClickListenerOne" type="com.ks.nestedrecyclerbindingexample.callbacks.OnItemClickListener"/> <variable name="onItemClickListenerTwo" type="com.ks.nestedrecyclerbindingexample.callbacks.OnItemClickListener"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView rvItemLayout="@{@layout/row_one}" rvList="@{listOne}" rvOnItemClick="@{onItemClickListenerOne}" android:layout_width="match_parent" android:layout_height="wrap_content" app:layoutManager="android.support.v7.widget.LinearLayoutManager" /> <android.support.v7.widget.RecyclerView rvItemLayout="@{@layout/row_two}" rvList="@{listTwo}" rvOnItemClick="@{onItemClickListenerTwo}" android:layout_width="match_parent" android:layout_height="wrap_content" app:layoutManager="android.support.v7.widget.LinearLayoutManager" /> </LinearLayout> </layout>

Puede ver que paso la lista, la identificación del diseño del elemento y hago clic en el oyente desde el diseño.

rvItemLayout="@{@layout/row_one}" rvList="@{listOne}" rvOnItemClick="@{onItemClickListenerOne}"

Estos atributos personalizados son creados por BindingAdapter .

public class BindingAdapters { @BindingAdapter(value = {"rvItemLayout", "rvList", "rvOnItemClick"}, requireAll = false) public static void setRvAdapter(RecyclerView recyclerView, int rvItemLayout, List rvList, @Nullable OnItemClickListener onItemClickListener) { if (rvItemLayout != 0 && rvList != null && rvList.size() > 0) recyclerView.setAdapter(new GeneralAdapter(rvItemLayout, rvList, onItemClickListener)); } }

Ahora desde Actividad, pasa la lista, haga clic en oyente como

HomeActivity.java

public class HomeActivity extends AppCompatActivity { ActivityHomeBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_home); binding.setListOne(new ArrayList()); // pass your list or set list from response of API binding.setListTwo(new ArrayList()); binding.setOnItemClickListenerOne(new OnItemClickListener() { @Override public void onItemClick(View view, Object object) { if (object instanceof ModelParent) { // TODO: your action here } } }); binding.setOnItemClickListenerTwo(new OnItemClickListener() { @Override public void onItemClick(View view, Object object) { if (object instanceof ModelChild) { // TODO: your action here } } }); } }

No desea leer demasiado, clonar / descargar directamente el ejemplo completo en mi repositorio de github. Y pruébalo tú mismo.

Puede ver GeneralAdapter.java en el repositorio anterior.

Si tiene problemas al configurar el enlace de datos, consulte esta respuesta .


Basado en diferentes fuentes, he creado una implementación simple de RecyclerView usando una biblioteca simple.

Agregue esta línea en build.gradle

implementation ''com.hereshem.lib:awesomelib:2.0.1''

AddCreate un RecyclerView agregando MyRecyclerView en activity_main.xml con

<com.hereshem.lib.recycler.MyRecyclerView android:id="@+id/recycler" app:layoutManager="LinearLayoutManager" android:layout_width="match_parent" android:layout_height="match_parent"/>

Ahora en MainActivity, cree un ViewHolder pasando el nombre de la clase que necesita vincularse

public static class EVHolder extends MyViewHolder<Events> { TextView date, title, summary; public EVHolder(View v) { super(v); date = v.findViewById(R.id.date); title = v.findViewById(R.id.title); summary = v.findViewById(R.id.summary); } @Override public void bindView(Events c) { date.setText(c.date); title.setText(c.title); summary.setText(c.summary); } }

Cree elementos de lista de variables y adaptadores con muy pocas líneas pasando elementos, clase y diseño en el adaptador

List<Events> items = new ArrayList<>(); MyRecyclerView recycler = findViewById(R.id.recycler); RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event); recycler.setAdapter(adapter);

ClickListener se puede agregar con las siguientes líneas

recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() { @Override public void onItemClick(int position) { Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show(); } });

Todo está hecho.

Más ejemplos e implementación se pueden encontrar here . Espero que esto ayude !!!


Como todavía no puedo comentar, voy a publicar como respuesta el enlace ... He encontrado un tutorial simple y bien organizado sobre recyclerview http://www.androiddeft.com/2017/10/01/recyclerview-android/

Aparte de eso, cuando va a agregar una vista de reciclador a su actividad, lo que quiere hacer es lo siguiente y cómo debe hacerlo, se describe en el enlace

  • agregue el componente RecyclerView en su archivo de diseño
  • crea una clase que vas a mostrar como filas de lista
  • hacer un archivo de diseño que es el diseño de una fila de su lista
  • ahora necesitamos un adaptador personalizado, así que cree un adaptador personalizado extendiéndolo desde la clase padre RecyclerView.Adapter
  • agregue la vista del reciclador en su actividad principal
  • agregando separadores
  • agregando oyentes Touch

El siguiente es un ejemplo mínimo que se verá como la siguiente imagen.

Comience con una actividad vacía. Realizará las siguientes tareas para agregar RecyclerView. Todo lo que necesita hacer es copiar y pegar el código en cada sección. Más tarde, puede personalizarlo para satisfacer sus necesidades.

  • Agregar dependencias a gradle
  • Agregue los archivos de diseño xml para la actividad y para la fila RecyclerView
  • Haga el adaptador RecyclerView
  • Inicialice RecyclerView en su actividad

Actualizar dependencias de Gradle

Asegúrese de que las siguientes dependencias estén en el archivo gradle.build su aplicación:

implementation ''com.android.support:appcompat-v7:27.1.1'' implementation ''com.android.support:recyclerview-v7:27.1.1''

Puede actualizar los números de versión a lo que sea más actual . Use la compile lugar de la implementation si todavía usa Android Studio 2.x.

Crear diseño de actividad

Agregue RecyclerView a su diseño xml.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rvAnimals" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>

Crear diseño de fila

Cada fila en nuestro RecyclerView solo tendrá un único TextView . Cree un nuevo archivo de recursos de diseño.

recyclerview_row.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp"> <TextView android:id="@+id/tvAnimalName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> </LinearLayout>

Crea el adaptador

RecyclerView necesita un adaptador para llenar las vistas en cada fila con sus datos. Crea un nuevo archivo java.

MyRecyclerViewAdapter.java

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> { private List<String> mData; private LayoutInflater mInflater; private ItemClickListener mClickListener; // data is passed into the constructor MyRecyclerViewAdapter(Context context, List<String> data) { this.mInflater = LayoutInflater.from(context); this.mData = data; } // inflates the row layout from xml when needed @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.recyclerview_row, parent, false); return new ViewHolder(view); } // binds the data to the TextView in each row @Override public void onBindViewHolder(ViewHolder holder, int position) { String animal = mData.get(position); holder.myTextView.setText(animal); } // total number of rows @Override public int getItemCount() { return mData.size(); } // stores and recycles views as they are scrolled off screen public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView myTextView; ViewHolder(View itemView) { super(itemView); myTextView = itemView.findViewById(R.id.tvAnimalName); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition()); } } // convenience method for getting data at click position String getItem(int id) { return mData.get(id); } // allows clicks events to be caught void setClickListener(ItemClickListener itemClickListener) { this.mClickListener = itemClickListener; } // parent activity will implement this method to respond to click events public interface ItemClickListener { void onItemClick(View view, int position); } }

Notas

  • Aunque no es estrictamente necesario, incluí la funcionalidad para escuchar eventos de clic en las filas. Esto estaba disponible en los antiguos ListViews y es una necesidad común. Puede eliminar este código si no lo necesita.

Inicializar RecyclerView en actividad

Agregue el siguiente código a su actividad principal.

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener { MyRecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // data to populate the RecyclerView with ArrayList<String> animalNames = new ArrayList<>(); animalNames.add("Horse"); animalNames.add("Cow"); animalNames.add("Camel"); animalNames.add("Sheep"); animalNames.add("Goat"); // set up the RecyclerView RecyclerView recyclerView = findViewById(R.id.rvAnimals); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new MyRecyclerViewAdapter(this, animalNames); adapter.setClickListener(this); recyclerView.setAdapter(adapter); } @Override public void onItemClick(View view, int position) { Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show(); } }

Notas

  • Observe que la actividad implementa el ItemClickListener que definimos en nuestro adaptador. Esto nos permite manejar eventos de clic de fila en onItemClick .

Terminado

Eso es. Debería poder ejecutar su proyecto ahora y obtener algo similar a la imagen en la parte superior.

Continuando

Agregar un divisor entre filas

Puedes agregar un divisor simple como este

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), layoutManager.getOrientation()); recyclerView.addItemDecoration(dividerItemDecoration);

Si quieres algo un poco más complejo, mira las siguientes respuestas:

Cambiar el color de la fila al hacer clic

Consulte esta respuesta para saber cómo cambiar el color de fondo y agregar el efecto dominó cuando se hace clic en una fila.

Actualizando filas

Consulte esta respuesta para saber cómo agregar, eliminar y actualizar filas.

Otras lecturas


Puede usar un adaptador abstracto con utilidades y filtros diff

SimpleAbstractAdapter.kt

abstract class SimpleAbstractAdapter<T>(private var items: ArrayList<T> = arrayListOf()) : RecyclerView.Adapter<SimpleAbstractAdapter.VH>() { protected var listener: OnViewHolderListener<T>? = null private val filter = ArrayFilter() private val lock = Any() protected abstract fun getLayout(): Int protected abstract fun bindView(item: T, viewHolder: VH) protected abstract fun getDiffCallback(): DiffCallback<T>? private var onFilterObjectCallback: OnFilterObjectCallback? = null private var constraint: CharSequence? = "" override fun onBindViewHolder(vh: VH, position: Int) { getItem(position)?.let { bindView(it, vh) } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { return VH(parent, getLayout()) } override fun getItemCount(): Int = items.size protected abstract class DiffCallback<T> : DiffUtil.Callback() { private val mOldItems = ArrayList<T>() private val mNewItems = ArrayList<T>() fun setItems(oldItems: List<T>, newItems: List<T>) { mOldItems.clear() mOldItems.addAll(oldItems) mNewItems.clear() mNewItems.addAll(newItems) } override fun getOldListSize(): Int { return mOldItems.size } override fun getNewListSize(): Int { return mNewItems.size } override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return areItemsTheSame( mOldItems[oldItemPosition], mNewItems[newItemPosition] ) } abstract fun areItemsTheSame(oldItem: T, newItem: T): Boolean override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return areContentsTheSame( mOldItems[oldItemPosition], mNewItems[newItemPosition] ) } abstract fun areContentsTheSame(oldItem: T, newItem: T): Boolean } class VH(parent: ViewGroup, @LayoutRes layout: Int) : RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(layout, parent, false)) interface OnViewHolderListener<T> { fun onItemClick(position: Int, item: T) } fun getItem(position: Int): T? { return items.getOrNull(position) } fun getItems(): ArrayList<T> { return items } fun setViewHolderListener(listener: OnViewHolderListener<T>) { this.listener = listener } fun addAll(list: List<T>) { val diffCallback = getDiffCallback() when { diffCallback != null && !items.isEmpty() -> { diffCallback.setItems(items, list) val diffResult = DiffUtil.calculateDiff(diffCallback) items.clear() items.addAll(list) diffResult.dispatchUpdatesTo(this) } diffCallback == null && !items.isEmpty() -> { items.clear() items.addAll(list) notifyDataSetChanged() } else -> { items.addAll(list) notifyDataSetChanged() } } } fun add(item: T) { items.add(item) notifyDataSetChanged() } fun add(position:Int, item: T) { items.add(position,item) notifyItemInserted(position) } fun remove(position: Int) { items.removeAt(position) notifyItemRemoved(position) } fun remove(item: T) { items.remove(item) notifyDataSetChanged() } fun clear(notify: Boolean=false) { items.clear() if (notify) { notifyDataSetChanged() } } fun setFilter(filter: SimpleAdapterFilter<T>): ArrayFilter { return this.filter.setFilter(filter) } interface SimpleAdapterFilter<T> { fun onFilterItem(contains: CharSequence, item: T): Boolean } fun convertResultToString(resultValue: Any): CharSequence { return filter.convertResultToString(resultValue) } fun filter(constraint: CharSequence) { this.constraint = constraint filter.filter(constraint) } fun filter(constraint: CharSequence, listener: Filter.FilterListener) { this.constraint = constraint filter.filter(constraint, listener) } fun getFilter(): Filter { return filter } interface OnFilterObjectCallback { fun handle(countFilterObject: Int) } fun setOnFilterObjectCallback(objectCallback: OnFilterObjectCallback) { onFilterObjectCallback = objectCallback } inner class ArrayFilter : Filter() { private var original: ArrayList<T> = arrayListOf() private var filter: SimpleAdapterFilter<T> = DefaultFilter() private var list: ArrayList<T> = arrayListOf() private var values: ArrayList<T> = arrayListOf() fun setFilter(filter: SimpleAdapterFilter<T>): ArrayFilter { original = items this.filter = filter return this } override fun performFiltering(constraint: CharSequence?): Filter.FilterResults { val results = Filter.FilterResults() if (constraint == null || constraint.isBlank()) { synchronized(lock) { list = original } results.values = list results.count = list.size } else { synchronized(lock) { values = original } val result = ArrayList<T>() for (value in values) { if (constraint!=null && constraint.trim().isNotEmpty() && value != null) { if (filter.onFilterItem(constraint, value)) { result.add(value) } } else { value?.let { result.add(it) } } } results.values = result results.count = result.size } return results } override fun publishResults(constraint: CharSequence, results: Filter.FilterResults) { items = results.values as? ArrayList<T> ?: arrayListOf() notifyDataSetChanged() onFilterObjectCallback?.handle(results.count) } } class DefaultFilter<T> : SimpleAdapterFilter<T> { override fun onFilterItem(contains: CharSequence, item: T): Boolean { val valueText = item.toString().toLowerCase() if (valueText.startsWith(contains.toString())) { return true } else { val words = valueText.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() for (word in words) { if (word.contains(contains)) { return true } } } return false } } }

Y extienda el adaptador abstracto con métodos de implementos

TasksAdapter.kt

import android.annotation.SuppressLint import kotlinx.android.synthetic.main.task_item_layout.view.* class TasksAdapter(private val listener:TasksListener? = null) : SimpleAbstractAdapter<Task>() { override fun getLayout(): Int { return R.layout.task_item_layout } override fun getDiffCallback(): DiffCallback<Task>? { return object : DiffCallback<Task>() { override fun areItemsTheSame(oldItem: Task, newItem: Task): Boolean { return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: Task, newItem: Task): Boolean { return oldItem.items == newItem.items } } } @SuppressLint("SetTextI18n") override fun bindView(item: Task, viewHolder: VH) { viewHolder.itemView.apply { val position = viewHolder.adapterPosition val customer = item.customer val customerName = if (customer != null) customer.name else "" tvTaskCommentTitle.text = customerName + ", #" + item.id tvCommentContent.text = item.taskAddress ivCall.setOnClickListener { listener?.onCallClick(position, item) } setOnClickListener { listener?.onItemClick(position, item) } } } interface TasksListener : SimpleAbstractAdapter.OnViewHolderListener<Task> { fun onCallClick(position: Int, item: Task) } }

Adaptador Init

mAdapter = TasksAdapter(object : TasksAdapter.TasksListener { override fun onCallClick(position: Int, item:Task) { } override fun onItemClick(position: Int, item:Task) { } }) rvTasks.adapter = mAdapter

y llenar

mAdapter?.addAll(tasks)

agregar filtro personalizado

mAdapter?.setFilter(object : SimpleAbstractAdapter.SimpleAdapterFilter<MoveTask> { override fun onFilterItem(contains: CharSequence, item:Task): Boolean { return contains.toString().toLowerCase().contains(item.id?.toLowerCase().toString()) } })

filtrar datos

mAdapter?.filter("test")


Dependencias

compile ''com.android.support:appcompat-v7:25.3.1'' compile ''com.android.support:design:25.3.1'' compile ''com.android.support:multidex:1.0.1'' compile ''com.android.support:cardview-v7:25.3.1'' compile ''com.android.support:support-v4:25.3.1'' compile ''com.lguipeng.bubbleview:library:1.0.0'' compile ''com.larswerkman:HoloColorPicker:1.5'' compile ''com.mcxiaoke.volley:library-aar:1.0.0''

Una clase para artículo de clic

import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildPosition(childView)); return true; } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }

RecyclerView de segunda clase

import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.android.volley.DefaultRetryPolicy; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; public class SLByTopics extends Fragment { public static ArrayList<MByTopics> byTopicsMainArrayList=new ArrayList<>(); TabRefreshReceiver tabRefreshReceiver; RecyclerView recyclerView; SAdpByTopics sAdpByTopics; public ArrayList<MByTopics> mByTopicsArrayList=new ArrayList<>(); ProgressDialog progressDialog; public SLByTopics(){ } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.sl_fragment_by_topics, container, false); progressDialog = new ProgressDialog(getActivity()); if (IsOnline.isNetworkAvailable(getActivity())) { getCategoryTree(); } else{ IsOnline.showNoInterNetMessage(getActivity()); } tabRefreshReceiver = new TabRefreshReceiver(); LocalBroadcastManager.getInstance(getContext()).registerReceiver(tabRefreshReceiver, new IntentFilter("BY_TOPICS")); setUpView(view); return view; } private void setUpView(View view) { recyclerView=(RecyclerView)view.findViewById(R.id.by_topics_list_recyclerView); LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getActivity()); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); } @Override public void onResume() { super.onResume(); recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, final int position) { if (mByTopicsArrayList.get(position).getChild().size()>0){ Intent intent = new Intent(getActivity(), SByTopicCategory.class); intent.putExtra("selectedCategoryName",mByTopicsArrayList.get(position).getCatname()); intent.putExtra("jsonData",mByTopicsArrayList.get(position).getMainTopicJson()); startActivity(intent); getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out); }else { Intent intent = new Intent(getActivity(), SByCategoryQuestionList.class); intent.putExtra("selectedSubCategoryName",mByTopicsArrayList.get(position).getCatname()); intent.putExtra("catID",mByTopicsArrayList.get(position).getId()); startActivity(intent); getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out); } } })); } private class TabRefreshReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.detach(SLByTopics.this).attach(SLByTopics.this).commit(); LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(tabRefreshReceiver); } catch (Exception e) { e.printStackTrace(); } } } private void getCategoryTree() { progressDialog.setMessage("Please Wait..."); progressDialog.setCancelable(false); progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, Const.HOSTNAME + Const.STUDENT_GET_CATEGORY_TREE, new Response.Listener<String>() { @SuppressLint("LongLogTag") @Override public void onResponse(String response) { try { JSONObject object = new JSONObject(response); String status = object.getString("status"); int i = Integer.parseInt(status); switch (i) { case 0: progressDialog.dismiss(); // Toast.makeText(getActivity(), "getCategorySuccess", Toast.LENGTH_SHORT).show(); Log.e("getCategoryTree Response", "getCategoryTree Response : " + response); try { byTopicsMainArrayList.clear(); JSONArray info = object.getJSONArray("info"); if (info.length() > 0) { for (i = 0; i < info.length(); i++) { JSONObject data = info.getJSONObject(i); MByTopics mByTopics = new MByTopics(); mByTopics.setId(data.getString("id")); mByTopics.setCatname(data.getString("catname")); mByTopics.setMainTopicJson(data.toString()); JSONArray topicChildren = data.getJSONArray("children"); ArrayList<SMByTopicCategory> byChildrenArrayList = new ArrayList<>(); for (int j = 0; j < topicChildren.length(); j++) { JSONObject topicChildrenData = topicChildren.getJSONObject(j); SMByTopicCategory smByTopicCategory = new SMByTopicCategory(); smByTopicCategory.setId(topicChildrenData.getString("id")); smByTopicCategory.setCatname(topicChildrenData.getString("catname")); smByTopicCategory.setChildTopicJson(topicChildrenData.toString()); JSONArray topicChildrenQuestion = topicChildrenData.getJSONArray("children"); ArrayList<SMByTopicSubCategory> byChildrenSubArrayList = new ArrayList<>(); for (int k = 0; k < topicChildrenQuestion.length(); k++) { JSONObject topicChildrenSubData = topicChildrenQuestion.getJSONObject(k); SMByTopicSubCategory smByTopicSubCategory = new SMByTopicSubCategory(); smByTopicSubCategory.setId(topicChildrenSubData.getString("id")); smByTopicSubCategory.setCatname(topicChildrenSubData.getString("catname")); smByTopicSubCategory.setChildSubTopicJson(topicChildrenSubData.toString()); byChildrenSubArrayList.add(smByTopicSubCategory); } smByTopicCategory.setQuestions(byChildrenSubArrayList); byChildrenArrayList.add(smByTopicCategory); } mByTopics.setChild(byChildrenArrayList); byTopicsMainArrayList.add(mByTopics); } mByTopicsArrayList.clear(); mByTopicsArrayList=byTopicsMainArrayList; sAdpByTopics=new SAdpByTopics(mByTopicsArrayList,getActivity()); recyclerView.setAdapter(sAdpByTopics); sAdpByTopics.notifyDataSetChanged(); } }catch (Exception e){ e.printStackTrace(); } break; default: progressDialog.dismiss(); // Toast.makeText(getActivity(), "getCategoryError : " + response, Toast.LENGTH_SHORT).show(); Log.e("getCategoryTree Not Response", "getCategoryTree Uploading Not Response : " + response); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { progressDialog.dismiss(); Log.e("getCategoryTree Error :","getCategoryTree Error :"+error.getMessage()); // Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show(); } }){ };/* { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); // map.put("uid", String.valueOf(ConfigManager.getUserId())); return map; } };*/ stringRequest.setRetryPolicy(new DefaultRetryPolicy( 0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); requestQueue.add(stringRequest); } }

Clase de adaptador para artículo de reciclador

import android.app.Activity; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; public class SAdpByTopics extends RecyclerView.Adapter<RecyclerView.ViewHolder> { ArrayList<MByTopics> topicsArrayList=new ArrayList<>(); Activity activity; public SAdpByTopics(ArrayList<MByTopics> topicsArrayList,Activity activity){ this.topicsArrayList=topicsArrayList; this.activity=activity; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemeView= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_by_topic_list,parent,false); RecyclerView.ViewHolder holder=new Holder(itemeView); holder.setIsRecyclable(false); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final Holder classHolder = (Holder) holder; try{ classHolder.txt_topic_name.setText(topicsArrayList.get(position).getCatname()); }catch (Exception e){ e.printStackTrace(); } } @Override public int getItemCount() { return topicsArrayList.size(); } class Holder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView txt_topic_name; public Holder(View itemView) { super(itemView); txt_topic_name = (TextView) itemView.findViewById(R.id.txt_topic_name); } @Override public void onClick(View v) { } } }

Clase de módulo

public class MByTopics { String id; String topicName; String catname; String MainTopicJson; ArrayList<SMByTopicCategory> child; ArrayList<SMByTopicSubCategory> questions; public void setId(String id){ this.id=id; } public String getId(){ return id; } public void setCatname(String catname) { this.catname = catname; } public String getCatname() { return catname; } public void setTopicName(String topicName) { this.topicName = topicName; } public String getTopicName() { return topicName; } public void setChild(ArrayList<SMByTopicCategory> child) { this.child = child; } public String getMainTopicJson() { return MainTopicJson; } public void setMainTopicJson(String mainTopicJson) { MainTopicJson = mainTopicJson; } public ArrayList<SMByTopicCategory> getChild() { return child; } public void setQuestions(ArrayList<SMByTopicSubCategory> questions) { this.questions = questions; } public ArrayList<SMByTopicSubCategory> getQuestions() { return questions; } public ArrayList<MByTopics> getByTopicList() { ArrayList<MByTopics> mByTopicsArrayList = new ArrayList<>(); for (int i=0;i<11;i++){ MByTopics mQuestionBankCategory=new MByTopics(); if (i==1 || i== 5|| i==9){ mQuestionBankCategory.setTopicName("Microeconomics"); }else if (i==2 || i== 10|| i==6) { mQuestionBankCategory.setTopicName("Macroeconomics"); }else { mQuestionBankCategory.setTopicName("Current Isssues"); } mByTopicsArrayList.add(mQuestionBankCategory); } return mByTopicsArrayList; } }