2015-04-23 2 views
0

Это более ранний вопрос: ImageButton within row of ListView android not working Но после предложений от SO гуру было предложено задать новый вопрос. Проблема в том, что у меня есть пользовательский адаптер, который не показывает никаких данных. Я изучил другие вопросы, но не нашел решения.пользовательский адаптер не показывает никаких предметов

В моей основной деятельности у меня есть несколько кнопок, один из них: ToDo, должен создать строку, которая отображает данные из базы данных SQLite, и в зависимости от некоторых факторов (в основном, даты) он показывает тип светофора который хранится как способный к переносу.

Часть элементов в этой строке представляет собой кнопку изображения, которую я хочу, чтобы пользователь мог щелкнуть, и изображение должно измениться. Пользователь должен также иметь возможность щелкнуть по фактической строке и начать новую деятельность.

Проблема заключается в том, что отображается НЕТ ДАННЫХ.

Итак, вот мой код:

public class MainActivity extends Activity { 
    // definitions etc ... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // definitions etc ... 
    } 

    public void ToDo(View v){ // the user has clicked in the ToDo button 
    IgroDatabaseHelper helper = new IgroDatabaseHelper(getBaseContext()); // create instance of SQLIte database 
    numRows = helper.NumEntries("ToDo"); // Get the number of rows in table 
    int i = 1; 
    ArrayList<RowItem> rowItems = new ArrayList<>(); 
    RowItem myItem1; 
    while (i <= numRows){ 
     // get items from database 
     // depending on value select different drawable 
     // put data into List Array of RowItem 
     myItem1 = new RowItem(TheWhat, R.drawable.teamworka, R.drawable.redtrafficlight, R.drawable.checkbox, TheWhenBy); 
        rowItems.add(myItem1); 
     // 
     i = i+ 1; 
    } 

    ListView yourListView = (ListView) findViewById(R.id.list); 
    CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, R.layout.todo_row, rowItems); 
    yourListView.setAdapter(customAdapter); 
} 

CustomListViewAdapter выглядит следующим образом:

public class CustomListViewAdapter extends ArrayAdapter<RowItem> { 

Context context; 
ArrayList<RowItem> _rowItems; 

public CustomListViewAdapter(Context context, int resourceId, 
     ArrayList<RowItem> rowItems) { 

    super(context, resourceId); 
    this.context = context; 
    _rowItems = rowItems; 
    System.out.println("I am in the custom Adapter class "+ _rowItems); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    System.out.println("This is the get view"); 
    View row = convertView; 
    RowItem item = _rowItems.get(position); 

    // you can now get your string and drawable from the item 
    // which you can use however you want in your list 
    String columnName = item.getColumnName(); 
    int drawable = item.getDrawable(); 
    if (row == null) { 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = mInflater.inflate(R.layout.todo_row, parent, false); 

    } 

    ImageButton chkDone = (ImageButton) row.findViewById(R.id.chkDone); 
    chkDone.setOnClickListener(new View.OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       View parentRow = (View) v.getParent(); 
       ListView listView = (ListView) parentRow.getParent(); 
       final int position = listView.getPositionForView(parentRow); 
       System.out.println("I am in position "+ position); 
      } 
    }); 

    return row; 
} 
} 

RowItem класса выглядит следующим образом:

public class RowItem { 
    private String _heading; 
    private int _icon; 
    private int _lights; 
    private int _chkdone; 
    private String _date; 


    public RowItem(String heading, int icon, int lights, int chkDone, String date) { 
     _heading = heading; 
     _icon = icon; 
     _lights = lights; 
     _chkdone = chkDone; 
     _date = date; 

     System.out.println("adding stuff to my rows"); 
     System.out.println("my column Name is " + heading); 
     System.out.println("My drawable int is "+ icon); 

    } 

    public String getColumnName() { 
     System.out.println("column Names is "+ _heading); 
     return _heading; 
    } 

    public int getDrawable() { 
     return _icon; 
    } 

    public int getLights(){ 
     return _lights; 
    } 

    public int getchkDone(){ 
     return _chkdone; 
    } 

    public String getDate(){ 
     return _date; 
    } 
} 

Я, очевидно, что-то отсутствует, как я упоминал ранее, данные не показываются. Я знаю, что есть два элемента строки, которые передаются в CustomListViewAdapter. Но я также знаю, что представление getView внутри CustomListViewAdapter фактически не вызвано.

Надеюсь, у меня есть достаточно информации/кода, но если вы чувствуете, что мне нужно что-то объяснить, скажите, пожалуйста.

Спасибо всем заблаговременно!

+1

Что делает ваш getCount()? – r2DoesInc

+0

Я не думаю, что у меня есть getCount() ... – user3079872

+1

попробуйте добавить его в свой пользовательский адаптер, а затем: '@Override public int getCount() { return _rowItems.size(); } @Override public Object getItem (int i) { return _rowItems.get (i); } @Override public long getItemId (int i) { return i; } 'не уверены, нужны ли остальные, но не должны помешать их добавить :) – Klotor

ответ

1

Я не вижу метод getCount(). Вы должны переопределить это следующим образом:

@Override 
    public int getCount() { 
     return _rowItems.getCount(); 
    } 

Кроме того, вызов super(context, resourceId, rowItems); также должен это исправить.

+0

ваш последний комментарий о вызове 'super (context, resourceId, rowItems);' означает, что он не сбой. Я думаю, мне нужно будет задать еще один вопрос, потому что теперь происходит то, что, когда я нажимаю на строку, он считает, что это строка из массива, созданного при вызове класса. Таким образом, основная активность имеет несколько созданных ListArrays, один из которых создается при создании основной активности. – user3079872

+0

спасибо, все работает как ожидалось сейчас! – user3079872

0

В вашем ListView не было объектов для отображения. Если вы используете свой собственный массив, вы должны переопределить метод getCount(), чтобы указать количество элементов, которые вы хотите отобразить.

+0

Большое спасибо, да, мне не хватало функцию getCount(). Сейчас он работает. Огромное спасибо! – user3079872

Смежные вопросы