自定义适配器未显示任何项目

Posted

技术标签:

【中文标题】自定义适配器未显示任何项目【英文标题】:custom adapter isn't showing any items 【发布时间】:2015-07-01 23:33:13 【问题描述】:

这是上一个问题的后续: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;
    

我显然遗漏了一些东西,正如我之前提到的,没有显示任何数据。我知道有 2 行项目被传递给 CustomListViewAdapter。但我也知道 CustomListViewAdapter 中的 View getView 实际上并没有被调用。

我希望我已经提供了足够的信息/代码,但是如果您觉得我需要进一步解释,请说。

提前非常感谢大家!

【问题讨论】:

你的 getCount() 是做什么的? 我不认为我有 getCount() ... 尝试将其添加到您的自定义适配器然后:@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,我刚刚添加了您的代码,但在公共 Object getItem 方法上出现错误:'返回类型与 ArrayAdapter.getItem(int)' 不兼容' 哇!!我现在实际上得到了一些东西......它没有显示文本或图像。当我尝试单击一行时,它会崩溃。在同一个主要活动中,我有另一个显示不同项目的 ListView。它认为我是从这个列表中选择的......一旦不需要,我是否需要清除 ListView? 【参考方案1】:

我没有看到 getCount() 方法。你应该像这样覆盖它:

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

或者,调用super(context, resourceId, rowItems); 也应该修复它。

【讨论】:

您对调用“super (context, resourceId, rowItems);”的最后评论意味着它不会崩溃。我想我需要发布另一个问题,因为现在发生的事情是,当我单击一行时,它认为它是调用类时构建的数组中的一行。所以 Main Activity 有许多 ListArrays 被创建,其中一个是在 Main Activity 被创建时创建的。【参考方案2】:

您的 ListView 认为没有要显示的项目。如果您使用自己的数组,则必须重写 getCount() 方法以指示要显示的项目数。

【讨论】:

非常感谢,是的,我错过了 getCount() 函数。它现在正在工作。非常感谢!

以上是关于自定义适配器未显示任何项目的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 CursorAdapter 时 ListView 未显示在活动中

未调用自定义适配器 getView() 方法

片段中的自定义列表适配器

列表项布局未将项目显示为全宽

android自定义列表适配器不显示项目

自定义ListView,文本和图像未显示在“活动”中