Skip to content

Instantly share code, notes, and snippets.

@charlesvdv
Created April 18, 2017 07:18
Show Gist options
  • Save charlesvdv/085c454e20ce7ddae600ec8ed4286f6b to your computer and use it in GitHub Desktop.
Save charlesvdv/085c454e20ce7ddae600ec8ed4286f6b to your computer and use it in GitHub Desktop.
example of recyclerview with click detail
package be.charlesvdv.weatherreport;
import android.content.Context;
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.TextView;
import java.util.ArrayList;
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemAdapterViewHolder> {
private static String TAG = ItemAdapter.class.getSimpleName();
private ArrayList<WeatherData> weatherData;
private ItemAdapterOnClickHandler clickHandler;
public ItemAdapter(ItemAdapterOnClickHandler clickHandler) {
this.clickHandler = clickHandler;
this.weatherData = new ArrayList<>();
}
public interface ItemAdapterOnClickHandler {
void onClick(WeatherData weatherData);
}
public void setChangedData(ArrayList<WeatherData> data) {
Log.d(TAG, "Data changed!");
this.weatherData = data;
notifyDataSetChanged();
}
public class ItemAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public final TextView timeTextView;
public ItemAdapterViewHolder(View view) {
super(view);
timeTextView = (TextView) view.findViewById(R.id.weather_item_time);
timeTextView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int adapterPos = getAdapterPosition();
clickHandler.onClick(weatherData.get(adapterPos));
}
}
@Override
public ItemAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.weather_item, parent, false);
Log.d(TAG, "ItemAdapterViewHolder initializing");
return new ItemAdapterViewHolder(view);
}
@Override
public void onBindViewHolder(ItemAdapterViewHolder holder, int pos) {
holder.timeTextView.setText(weatherData.get(pos).getTime() + "");
}
@Override
public int getItemCount() {
if (weatherData.isEmpty()) return 0;
return weatherData.size();
}
}
package be.charlesvdv.weatherreport;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.w3c.dom.Text;
public class WeatherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather);
Intent intent = getIntent();
WeatherData weatherData = (WeatherData) intent.getSerializableExtra("weather-data");
TextView tempDayTextView = (TextView) this.findViewById(R.id.weather_item_tempday);
TextView humidityTextView = (TextView) this.findViewById(R.id.weather_item_humidity);
TextView pressureTextView = (TextView) this.findViewById(R.id.weather_item_pressure);
tempDayTextView.setText(weatherData.getDayTemp() + "");
humidityTextView.setText(weatherData.getHumidity() + "");
pressureTextView.setText(weatherData.getPressure() + "");
}
}
package be.charlesvdv.weatherreport;
import android.app.LoaderManager;
import android.content.AsyncTaskLoader;
import android.content.Intent;
import android.content.Loader;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import org.json.JSONException;
import java.util.ArrayList;
public class WeatherListActivity extends AppCompatActivity
implements ItemAdapter.ItemAdapterOnClickHandler, LoaderManager.LoaderCallbacks<ArrayList<WeatherData>> {
private static String TAG = WeatherHandler.class.getSimpleName();
private static final int LOADER_MANAGER_ID = 22;
private RecyclerView recyclerView;
private ItemAdapter itemAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "test");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather_list);
recyclerView = (RecyclerView) findViewById(R.id.weather_items);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,
false);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
itemAdapter = new ItemAdapter(this);
recyclerView.setAdapter(itemAdapter);
Bundle b = new Bundle();
b.putString("URL", "https://andfun-weather.udacity.com/weather");
getLoaderManager().initLoader(LOADER_MANAGER_ID, b, this).forceLoad();
Log.d(TAG, "Starting the WeatherHandler");
}
@Override
public void onClick(WeatherData data) {
Intent intent = new Intent(this, WeatherActivity.class);
intent.putExtra("weather-data", data);
startActivity(intent);
}
@Override
public Loader<ArrayList<WeatherData>> onCreateLoader(int id, final Bundle args) {
return new AsyncTaskLoader<ArrayList<WeatherData>>(this) {
ArrayList<WeatherData> data;
@Override
protected void onStartLoading() {
if (data != null) {
deliverResult(data);
} else {
forceLoad();
}
}
@Override
public ArrayList<WeatherData> loadInBackground() {
String url = args.getString("URL");
try {
String result = NetworkHandler.getJSONFromUrl(url);
Log.d(TAG, "Data downloaded");
return WeatherHandler.parseWeatherData(result);
} catch (NetworkWeatherException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
Log.d(TAG, "Fail to download");
return null;
}
@Override
public void deliverResult(ArrayList<WeatherData> data) {
this.data = data;
super.deliverResult(data);
}
};
}
@Override
public void onLoadFinished(Loader<ArrayList<WeatherData>> loader, ArrayList<WeatherData> data) {
if (data.size() == 0 || data == null) {
Log.e(TAG, "Unable to fetch the data");
}
Log.d(TAG, "Setting changed data");
itemAdapter.setChangedData(data);
}
@Override
public void onLoaderReset(Loader<ArrayList<WeatherData>> loader) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment