IvanReed IvanReed - 13 days ago 5
Java Question

android setAdapter doesnt trigger getView or doesnt build ListView

Too many times asked but i cant find the issue in my own code.

As others, i have a one ArrayList and i need to display it.

The problem is that ListView isnt visible when activity get lauched, i dont know why.

Here is my code:

layout: activity_dashboard_screen.xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ly_dashboard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.ciroreed.war_horizon.ui.Dashboard_screen" >

<TextView
android:id="@+id/tv_dashboard_display_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="username"
tools:ignore="HardcodedText" />

<TableRow
android:id="@+id/row_dashboard_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end" >

</TableRow>

<TableRow
android:id="@+id/row_dashboard_2"
android:layout_width="fill_parent"
android:layout_height="match_parent" >

<ListView
android:id="@+id/lv_dashboard_matchlist"
android:layout_width="fill_parent"
android:layout_height="match_parent" />

</TableRow>




Custom class that extends BaseAdapter: MatchAdapter.java

package com.ciroreed.war_horizon;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.TwoLineListItem;

import com.ciroreed.war_horizon.data.Match;

public class MatchAdapter extends BaseAdapter {

private Context con;
private ArrayList<Match> MATCHLIST;


public MatchAdapter(Context appcontext, ArrayList<Match> matchlist){
con = appcontext;
MATCHLIST = matchlist;

}

..............

@Override
public View getView(int position, View convertView, ViewGroup parent) {
TwoLineListItem tll;

if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) con
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
tll = (TwoLineListItem) inflater.inflate(
android.R.layout.simple_list_item_2, parent);
} else {
tll = (TwoLineListItem) convertView;
}

TextView text1 = tll.getText1();
TextView text2 = tll.getText2();

text1.setText("VS "+MATCHLIST.get(position).getEnemy_name());
text2.setText("turno: "+MATCHLIST.get(position).isPlayerTurn());

return tll;
}

}


And here is the activity when may run it:

package com.ciroreed.war_horizon.ui;

import java.util.concurrent.ExecutionException;

import org.json.JSONException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.ciroreed.war_horizon.Controller;
import com.ciroreed.war_horizon.MatchAdapter;
import com.ciroreed.war_horizon.R;

public class Dashboard_screen extends Activity implements OnClickListener{

private TextView tv_dashboard_username;
private ListView lv_dashboard_matchlist;

private MatchAdapter MATCHLIST_adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard_screen);

init();
}

private void init() {
// TODO Auto-generated method stub
tv_dashboard_username = (TextView)findViewById(R.id.tv_dashboard_display_username);
lv_dashboard_matchlist = (ListView)findViewById(R.id.lv_dashboard_matchlist);


try {
if(Controller.getCurrentMatches()){

MATCHLIST_adapter = new MatchAdapter(getApplicationContext(), Controller.MATCHLIST);

Toast.makeText(getApplicationContext(), "Partidas cargadas correctamente", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "Error al cargar las partidas", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

MATCHLIST_adapter.notifyDataSetChanged();
lv_dashboard_matchlist.setAdapter(MATCHLIST_adapter);

}


When i excecute, .. well, this is NOT the main activity. It runs as spected but and the ArrayList contains one element (at least)..

Please dont ask about how the previous code works like "Controller.getCurrentMatches()" IE that method gets a json with data from a remote server, excepts the code relative to the ListAdapter everything else was tested before and works fine.

Answer

From http://www.vogella.com/tutorials/AndroidListView/article.html

Chapter: 13. Tutorial: How to display two items in a ListView

package de.vogella.android.listactivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class MyTwoListItemsActivity extends ListActivity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ArrayList<Map<String, String>> list = buildData();
    String[] from = { "name", "purpose" };
    int[] to = { android.R.id.text1, android.R.id.text2 };

    SimpleAdapter adapter = new SimpleAdapter(this, list,
        android.R.layout.simple_list_item_2, from, to);
    setListAdapter(adapter);
  }

  private ArrayList<Map<String, String>> buildData() {
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    list.add(putData("Android", "Mobile"));
    list.add(putData("Windows7", "Windows7"));
    list.add(putData("iPhone", "iPhone"));
    return list;
  }

  private HashMap<String, String> putData(String name, String purpose) {
    HashMap<String, String> item = new HashMap<String, String>();
    item.put("name", name);
    item.put("purpose", purpose);
    return item;
  }

} 

This isn't the accurate response to this issue, but it solved my problem.

Comments