Marketcap fixes and improvements

- Add rank
- Fix marketcap not displaying for NANO and BCN
- Add crash catcher for some not well support cryptocurrencies
This commit is contained in:
Tanguy Herbron 2018-04-22 18:34:55 +02:00
parent 97dc6df33a
commit c431b18d36
8 changed files with 313 additions and 27 deletions

View File

@ -90,6 +90,9 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private PreferencesManager preferencesManager; private PreferencesManager preferencesManager;
private BinanceManager binanceManager; private BinanceManager binanceManager;
private boolean isSnapshotUpdated;
private boolean isTickerUpdated;
private boolean displayLineChart; private boolean displayLineChart;
private Button lineChartButton; private Button lineChartButton;
@ -147,6 +150,9 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
databaseManager = new DatabaseManager(this); databaseManager = new DatabaseManager(this);
preferencesManager = new PreferencesManager(this); preferencesManager = new PreferencesManager(this);
isSnapshotUpdated = false;
isTickerUpdated = false;
displayLineChart = true; displayLineChart = true;
viewFlipper = findViewById(R.id.vfCurrencyDetails); viewFlipper = findViewById(R.id.vfCurrencyDetails);
@ -231,6 +237,17 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
.setMovementMethod(LinkMovementMethod.getInstance()); .setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.txtViewPercentageCoinEmited)) ((TextView) findViewById(R.id.txtViewPercentageCoinEmited))
.setText("Percentage of coin emited : " + numberConformer(currency.getMinedCoinSupply() / currency.getMaxCoinSupply() * 100) + "%"); .setText("Percentage of coin emited : " + numberConformer(currency.getMinedCoinSupply() / currency.getMaxCoinSupply() * 100) + "%");
if(currency.getMarketCapitalization() != 0)
{
((TextView) findViewById(R.id.txtViewMarketCapitalization))
.setText(PlaceholderManager.getValueString(numberConformer(currency.getMarketCapitalization()), this));
}
if(currency.getRank() != 0)
{
((TextView) findViewById(R.id.txtViewRank))
.setText(String.valueOf(currency.getRank()));
}
if(currency.getMaxCoinSupply() == 0) if(currency.getMaxCoinSupply() == 0)
{ {
@ -251,6 +268,24 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
currency.updateSnapshot(this, new Currency.CurrencyCallBack() { currency.updateSnapshot(this, new Currency.CurrencyCallBack() {
@Override @Override
public void onSuccess(final Currency currency) { public void onSuccess(final Currency currency) {
isSnapshotUpdated = true;
dataCounter();
}
});
currency.updateTicker(this, preferencesManager.getDefaultCurrency(), new Currency.CurrencyCallBack() {
@Override
public void onSuccess(Currency currency) {
isTickerUpdated = true;
dataCounter();
}
});
}
private void dataCounter()
{
if(isTickerUpdated && isSnapshotUpdated)
{
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -258,7 +293,6 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
} }
}); });
} }
});
} }
private void setupActionBar() private void setupActionBar()

View File

@ -44,6 +44,7 @@ import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.PercentFormatter; import com.github.mikephil.charting.formatter.PercentFormatter;
import com.nauk.coinfolio.DataManagers.BalanceManager; import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.MarketCapManager; import com.nauk.coinfolio.DataManagers.MarketCapManager;
import com.nauk.coinfolio.DataManagers.PreferencesManager; import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator; import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;

View File

@ -32,6 +32,7 @@ import com.nauk.coinfolio.Activities.HomeActivity;
import com.nauk.coinfolio.Activities.SettingsActivity; import com.nauk.coinfolio.Activities.SettingsActivity;
import com.nauk.coinfolio.DataManagers.BalanceManager; import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.PreferencesManager; import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator; import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;
import com.nauk.coinfolio.PlaceholderManager; import com.nauk.coinfolio.PlaceholderManager;
@ -62,6 +63,7 @@ public class Summary extends Fragment {
private SwipeRefreshLayout refreshLayout; private SwipeRefreshLayout refreshLayout;
private Dialog loadingDialog; private Dialog loadingDialog;
private String defaultCurrency; private String defaultCurrency;
private CurrencyTickerList currencyTickerList;
private TextView toolbarSubtitle; private TextView toolbarSubtitle;
private CollapsingToolbarLayout toolbarLayout; private CollapsingToolbarLayout toolbarLayout;
@ -73,6 +75,7 @@ public class Summary extends Fragment {
private int iconCounter; private int iconCounter;
private float totalValue; private float totalValue;
private boolean detailsChecker; private boolean detailsChecker;
private boolean tickersChecker;
protected float totalFluctuation; protected float totalFluctuation;
private long lastTimestamp; private long lastTimestamp;
@ -88,10 +91,12 @@ public class Summary extends Fragment {
layoutGenerator = new HomeLayoutGenerator(getActivity()); layoutGenerator = new HomeLayoutGenerator(getActivity());
refreshLayout = fragmentView.findViewById(R.id.swiperefreshsummary); refreshLayout = fragmentView.findViewById(R.id.swiperefreshsummary);
toolbarSubtitle = fragmentView.findViewById(R.id.toolbarSubtitle); toolbarSubtitle = fragmentView.findViewById(R.id.toolbarSubtitle);
currencyTickerList = new CurrencyTickerList(getActivity());
totalValue = 0; totalValue = 0;
totalFluctuation = 0; totalFluctuation = 0;
lastTimestamp = 0; lastTimestamp = 0;
tickersChecker = false;
defaultCurrency = preferencesManager.getDefaultCurrency(); defaultCurrency = preferencesManager.getDefaultCurrency();
@ -277,6 +282,11 @@ public class Summary extends Fragment {
{ {
currencyLayout.addView(currencyView.get(i)); currencyLayout.addView(currencyView.get(i));
} }
if(loadingDialog.isShowing())
{
loadingDialog.dismiss();
}
} }
}); });
} }
@ -285,13 +295,18 @@ public class Summary extends Fragment {
newRunnable.run(); newRunnable.run();
} }
private void countCoins(boolean isCoin, boolean isDetails) private void countCoins(boolean isCoin, boolean isDetails, boolean isTickers)
{ {
if(isCoin) if(isCoin)
{ {
coinCounter++; coinCounter++;
} }
if(isTickers)
{
tickersChecker = true;
}
if(isDetails) if(isDetails)
{ {
detailsChecker = true; detailsChecker = true;
@ -299,7 +314,7 @@ public class Summary extends Fragment {
if(balanceManager.getTotalBalance() != null) if(balanceManager.getTotalBalance() != null)
{ {
if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker) if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker && tickersChecker)
{ {
IconDownloader iconDownloader = new IconDownloader(); IconDownloader iconDownloader = new IconDownloader();
iconDownloader.execute(); iconDownloader.execute();
@ -500,6 +515,8 @@ public class Summary extends Fragment {
{ {
final Currency localCurrency = balanceManager.getTotalBalance().get(i); final Currency localCurrency = balanceManager.getTotalBalance().get(i);
localCurrency.setTickerId(currencyTickerList.getTickerIdForSymbol(localCurrency.getSymbol()));
updateChartColor(localCurrency); updateChartColor(localCurrency);
loadCurrency(localCurrency); loadCurrency(localCurrency);
@ -514,11 +531,6 @@ public class Summary extends Fragment {
} }
}); });
if(loadingDialog.isShowing())
{
loadingDialog.dismiss();
}
return null; return null;
} }
@ -626,11 +638,17 @@ public class Summary extends Fragment {
@Override @Override
protected Void doInBackground(Void... params) protected Void doInBackground(Void... params)
{ {
currencyTickerList.update(new BalanceManager.IconCallBack() {
@Override
public void onSuccess() {
countCoins(false, false, true);
}
});
balanceManager.updateDetails(new BalanceManager.IconCallBack() { balanceManager.updateDetails(new BalanceManager.IconCallBack() {
@Override @Override
public void onSuccess() public void onSuccess()
{ {
countCoins(false, true); countCoins(false, true, false);
} }
}); });
@ -647,8 +665,7 @@ public class Summary extends Fragment {
balance.get(i).updatePrice(getActivity(), defaultCurrency, new Currency.CurrencyCallBack() { balance.get(i).updatePrice(getActivity(), defaultCurrency, new Currency.CurrencyCallBack() {
@Override @Override
public void onSuccess(Currency currency) { public void onSuccess(Currency currency) {
countCoins(true, false); countCoins(true, false, false);
Log.d("coinfolio", "History " + currency.getSymbol());
} }
}); });
} }
@ -658,7 +675,7 @@ public class Summary extends Fragment {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
countCoins(false, false); countCoins(false, false, false);
} }
}); });
} }

View File

@ -42,6 +42,7 @@ import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart; import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDetailsList; import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDetailsList;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.PreferencesManager; import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.DataManagers.WatchlistManager; import com.nauk.coinfolio.DataManagers.WatchlistManager;
import com.nauk.coinfolio.PlaceholderManager; import com.nauk.coinfolio.PlaceholderManager;
@ -73,6 +74,9 @@ public class Watchlist extends Fragment {
private long lastTimestamp; private long lastTimestamp;
private PreferencesManager preferencesManager; private PreferencesManager preferencesManager;
private String defaultCurrency; private String defaultCurrency;
private CurrencyTickerList currencyTickerList;
private boolean tickerUpdated;
private boolean detailsUpdated;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
@ -85,6 +89,15 @@ public class Watchlist extends Fragment {
lastTimestamp = 0; lastTimestamp = 0;
defaultCurrency = preferencesManager.getDefaultCurrency(); defaultCurrency = preferencesManager.getDefaultCurrency();
currencyTickerList = new CurrencyTickerList(getActivity());
tickerUpdated = false;
currencyTickerList.update(new BalanceManager.IconCallBack() {
@Override
public void onSuccess() {
tickerUpdated = true;
checkUpdatedData();
}
});
watchlistManager = new WatchlistManager(getContext()); watchlistManager = new WatchlistManager(getContext());
@ -212,14 +225,15 @@ public class Watchlist extends Fragment {
} }
lastTimestamp = System.currentTimeMillis()/1000; lastTimestamp = System.currentTimeMillis()/1000;
detailsUpdated = false;
watchlistManager.updateWatchlist(); watchlistManager.updateWatchlist();
currencyDetailsList.update(new BalanceManager.IconCallBack() { currencyDetailsList.update(new BalanceManager.IconCallBack() {
@Override @Override
public void onSuccess() { public void onSuccess() {
WatchlistUpdater watchlistUpdater = new WatchlistUpdater(); detailsUpdated = true;
watchlistUpdater.execute(); checkUpdatedData();
} }
}); });
} }
@ -232,6 +246,15 @@ public class Watchlist extends Fragment {
} }
} }
private void checkUpdatedData()
{
if(tickerUpdated && detailsUpdated)
{
WatchlistUpdater watchlistUpdater = new WatchlistUpdater();
watchlistUpdater.execute();
}
}
private void generateCards() private void generateCards()
{ {
final List<View> watchlistViews = new ArrayList<View>(); final List<View> watchlistViews = new ArrayList<View>();
@ -516,6 +539,7 @@ public class Watchlist extends Fragment {
protected Void doInBackground(Void... voids) { protected Void doInBackground(Void... voids) {
for(final Currency currency : watchlistManager.getWatchlist()) for(final Currency currency : watchlistManager.getWatchlist())
{ {
currency.setTickerId(currencyTickerList.getTickerIdForSymbol(currency.getSymbol()));
currency.setId(getCurrencyId(currency.getSymbol())); currency.setId(getCurrencyId(currency.getSymbol()));
currency.updatePrice(getActivity(), preferencesManager.getDefaultCurrency(), new Currency.CurrencyCallBack() { currency.updatePrice(getActivity(), preferencesManager.getDefaultCurrency(), new Currency.CurrencyCallBack() {
@Override @Override

View File

@ -19,6 +19,7 @@ import java.util.List;
public class Currency implements Parcelable { public class Currency implements Parcelable {
private int id; private int id;
private String tickerId;
private String name; private String name;
private String symbol; private String symbol;
private double value; private double value;
@ -38,6 +39,7 @@ public class Currency implements Parcelable {
private String proofType; private String proofType;
private int totalSupply; private int totalSupply;
private double marketCapitalization; private double marketCapitalization;
private int rank;
private List<String> socialMediaLinks; private List<String> socialMediaLinks;
//private String proofType //private String proofType
@ -152,7 +154,29 @@ public class Currency implements Parcelable {
dataRetriver.updateSnapshot(id, new CurrencyDataRetriever.CurrencyCallBack() { dataRetriver.updateSnapshot(id, new CurrencyDataRetriever.CurrencyCallBack() {
@Override @Override
public void onSuccess(Currency currencyInfo) { public void onSuccess(Currency currencyInfo) {
Currency.this.mergeWith(currencyInfo); //Currency.this.mergeWith(currencyInfo);
Currency.this.proofType = currencyInfo.proofType;
Currency.this.algorithm = currencyInfo.algorithm;
Currency.this.description = currencyInfo.description;
Currency.this.maxCoinSupply = currencyInfo.maxCoinSupply;
Currency.this.minedCoinSupply = currencyInfo.minedCoinSupply;
callBack.onSuccess(Currency.this);
}
});
}
public void updateTicker(android.content.Context context, String toSymbol, final CurrencyCallBack callBack)
{
dataRetriver = new CurrencyDataRetriever(context);
dataRetriver.updateTickerInfos(tickerId, toSymbol, new CurrencyDataRetriever.CurrencyCallBack() {
@Override
public void onSuccess(Currency currencyInfo) {
//Currency.this.mergeWith(currencyInfo);
Currency.this.marketCapitalization = currencyInfo.marketCapitalization;
Currency.this.rank = currencyInfo.rank;
callBack.onSuccess(Currency.this); callBack.onSuccess(Currency.this);
} }
@ -355,6 +379,30 @@ public class Currency implements Parcelable {
this.proofType = proofType; this.proofType = proofType;
} }
public double getMarketCapitalization() {
return marketCapitalization;
}
public void setMarketCapitalization(double marketCapitalization) {
this.marketCapitalization = marketCapitalization;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getTickerId() {
return tickerId;
}
public void setTickerId(String tickerId) {
this.tickerId = tickerId;
}
private void updateDayFluctuation() private void updateDayFluctuation()
{ {
if(historyMinutes != null) if(historyMinutes != null)
@ -412,6 +460,7 @@ public class Currency implements Parcelable {
dest.writeList(this.historyMinutes); dest.writeList(this.historyMinutes);
dest.writeParcelable(this.icon, flags); dest.writeParcelable(this.icon, flags);
dest.writeInt(this.chartColor); dest.writeInt(this.chartColor);
dest.writeString(this.tickerId);
} }
protected Currency(Parcel in) { protected Currency(Parcel in) {
@ -426,6 +475,7 @@ public class Currency implements Parcelable {
in.readList(this.historyMinutes, CurrencyDataChart.class.getClassLoader()); in.readList(this.historyMinutes, CurrencyDataChart.class.getClassLoader());
this.icon = in.readParcelable(Bitmap.class.getClassLoader()); this.icon = in.readParcelable(Bitmap.class.getClassLoader());
this.chartColor = in.readInt(); this.chartColor = in.readInt();
this.tickerId = in.readString();
} }
public static final Parcelable.Creator<Currency> CREATOR = new Parcelable.Creator<Currency>() { public static final Parcelable.Creator<Currency> CREATOR = new Parcelable.Creator<Currency>() {

View File

@ -33,6 +33,7 @@ public class CurrencyDataRetriever {
private String dayHistoryUrl = "https://min-api.cryptocompare.com/data/histoday"; private String dayHistoryUrl = "https://min-api.cryptocompare.com/data/histoday";
private String priceUrl = "https://min-api.cryptocompare.com/data/pricemultifull?fsyms="; private String priceUrl = "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=";
private String snapshotUrl = "https://www.cryptocompare.com/api/data/coinsnapshotfullbyid/?id="; private String snapshotUrl = "https://www.cryptocompare.com/api/data/coinsnapshotfullbyid/?id=";
private String tickerUrl = "https://api.coinmarketcap.com/v1/ticker/";
private RequestQueue requestQueue; private RequestQueue requestQueue;
@ -45,12 +46,49 @@ public class CurrencyDataRetriever {
requestQueue = Volley.newRequestQueue(context); requestQueue = Volley.newRequestQueue(context);
} }
public void updateTickerInfos(String currencyName, final String toSymbol, final CurrencyCallBack callBack)
{
final String requestUrl = tickerUrl + currencyName + "/?convert=" + toSymbol;
StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccess(processTicker(response, toSymbol));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callBack.onSuccess(new Currency());
}
});
requestQueue.add(stringRequest);
}
private Currency processTicker(String response, String toSymbol)
{
Currency currency = new Currency();
response = response.substring(1, response.length()-1);
try {
JSONObject jsonObject = new JSONObject(response);
currency.setMarketCapitalization(jsonObject.getDouble("market_cap_" + toSymbol.toLowerCase()));
currency.setRank(jsonObject.getInt("rank"));
} catch (JSONException e) {
e.printStackTrace();
}
return currency;
}
public void updateSnapshot(int id, final CurrencyCallBack callBack) public void updateSnapshot(int id, final CurrencyCallBack callBack)
{ {
final String requestUrl = snapshotUrl + id; final String requestUrl = snapshotUrl + id;
Log.d("coinfolio", "Update snapshot for " + id);
StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl, StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl,
new Response.Listener<String>() { new Response.Listener<String>() {
@Override @Override
@ -61,7 +99,7 @@ public class CurrencyDataRetriever {
new Response.ErrorListener() { new Response.ErrorListener() {
@Override @Override
public void onErrorResponse(VolleyError error) { public void onErrorResponse(VolleyError error) {
callBack.onSuccess(new Currency());
} }
}); });

View File

@ -0,0 +1,101 @@
package com.nauk.coinfolio.DataManagers.CurrencyData;
import android.util.Log;
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 com.nauk.coinfolio.DataManagers.BalanceManager;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.LinkedHashMap;
import java.util.regex.Pattern;
/**
* Created by Guitoune on 22/04/2018.
*/
public class CurrencyTickerList {
final private static String TICKERLISTURL = "https://api.coinmarketcap.com/v1/ticker/?limit=0";
private RequestQueue requestQueue;
private LinkedHashMap<String, String> coinTickersHashmap;
private android.content.Context context;
public CurrencyTickerList(android.content.Context context)
{
this.context = context;
requestQueue = Volley.newRequestQueue(context);
}
public void update(final BalanceManager.IconCallBack callBack)
{
coinTickersHashmap = new LinkedHashMap<>();
StringRequest strRequest = new StringRequest(Request.Method.GET, TICKERLISTURL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.length() > 0) {
processTickerListResult(response, callBack);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(strRequest);
}
public String getTickerIdForSymbol(String symbol)
{
String tickerId = null;
try {
JSONObject jsonObject = new JSONObject(coinTickersHashmap.get(symbol));
tickerId = jsonObject.getString("id");
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
}
return tickerId;
}
public void processTickerListResult(String response, BalanceManager.IconCallBack callBack)
{
response = response.substring(1, response.length() - 1);
String[] strTable = response.split(Pattern.quote("},"));
for(int i = 0; i < strTable.length; i++)
{
strTable[i] += "}";
try {
JSONObject jsonObject = new JSONObject(strTable[i]);
switch (jsonObject.getString("symbol"))
{
case "MIOTA":
coinTickersHashmap.put("IOT", strTable[i]);
break;
case "NANO":
coinTickersHashmap.put("XRB", strTable[i]);
break;
default:
coinTickersHashmap.put(jsonObject.getString("symbol"), strTable[i]);
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
callBack.onSuccess();
}
}

View File

@ -443,13 +443,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_weight="0.5" android:orientation="horizontal">
android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical"
android:layout_weight="0.5">
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
@ -460,7 +460,28 @@
<TextView <TextView
android:id="@+id/txtViewMarketCapitalization" android:id="@+id/txtViewMarketCapitalization"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"
android:text="--"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="0.5">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Rank"
android:textStyle="bold"/>
<TextView
android:id="@+id/txtViewRank"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="--"/>
</LinearLayout> </LinearLayout>