【问题标题】:Custom Adapter for ListView with semi-complex list item具有半复杂列表项的 ListView 的自定义适配器
【发布时间】:2013-09-18 22:31:21
【问题描述】:

我正在尝试制作一个基本上包含“半复杂”歌曲项目列表的 Activity。一个列表项的输出可以找到here。我在网上找到了一个很好的例子来创建这样的东西,这可能在下面。

但是,ArrayAdapters 显然只能用于 SIMPLE TextViews(这基本上是我从 LogCat 得到的错误),并且我有 3 个 TextViews 我必须控制,其中一个的颜色以及图像。所以代码不会编译。我研究了 ListAdapters,但下划线结构与 ArrayAdapter 完全不同,远非一对一的翻译。

我应该怎么做,怎么用?我现在迷路了!

仅供参考,在 LogCat 中我得到以下信息(注意,我从下面的代码中删除了 LogCat 代码......这是在 SimpleSongAdapter 的构造函数中的超级调用之后放入的)......

这是我的SimpleSongAdapter 课程

public class SimpleSongAdapter extends ArrayAdapter<SimpleSong> {

    Context context;
    int layoutResourceID;
    SimpleSong song[] = null;

    public SimpleSongAdapter(Context context, int resource, SimpleSong[] data) {
        super(context, resource, data);

        this.layoutResourceID = resource;
        this.context = context;
        this.song = data;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        super.getView(position, convertView, parent);

        View row = convertView;
        SimpleSongHolder songHolder = null;

        if (row == null) {

            LayoutInflater newView = ((Activity) context).getLayoutInflater();
            row = newView.inflate(this.layoutResourceID, parent, false);

            ExtractLayoutResources(parent, row, songHolder);

            row.setTag(songHolder);

        } else {

            songHolder = (SimpleSongHolder) row.getTag();

        }

        SetLayoutResource(songHolder, position);

        return row;

    }

    private void SetLayoutResource(SimpleSongHolder songHolder, int position) {

        SimpleSong currentSong = song[position];

        songHolder.imgSongThumbnail.setImageResource(currentSong.thumbnail);
        songHolder.txtSongName.setText(currentSong.songName);
        songHolder.txtGroupName.setText(currentSong.groupName);

        String metaText = "";
        int colorID = 0;

        // switch statement to set metaText and colorID

        songHolder.txtSongMetaInfo.setText(metaText);
        songHolder.txtSongMetaInfo.setTextColor(colorID);
    }

    private void ExtractLayoutResources(ViewGroup parent, View row, SimpleSongHolder songHolder) {

        songHolder = new SimpleSongHolder();

        songHolder.imgSongThumbnail = (ImageView) row.findViewById(R.id.imgSongThumbnail);
        songHolder.txtSongName = (TextView) row.findViewById(R.id.txtSongName);
        songHolder.txtGroupName = (TextView) row.findViewById(R.id.txtGroupName);
        songHolder.txtSongMetaInfo = (TextView) row.findViewById(R.id.txtSongMetaInfo);

    }

    private static class SimpleSongHolder {

        ImageView imgSongThumbnail;
        TextView txtSongName;
        TextView txtGroupName;
        TextView txtSongMetaInfo;

    }
}

我在SimpleSong 上课

public class SimpleSong {

public int thumbnail;
    public String songName;
    public String groupName;
    public String songMetaInfo;

    public RemixType remixType;

    public SimpleSong(String songName, String groupName) {

        this.songName = songName;
        this.groupName = groupName;

    }

// Sets to set other attributes

MainActivity我有

public class MainActivity extends Activity {

    private ListView listView;

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

        SimpleSong songs[] = new SimpleSong[] { 
            // new SimpleSong mock object list
        };

        listView = (ListView) findViewById(R.id.songView);

        View listHeader = (View) getLayoutInflater().inflate(R.layout.list_header, null);
        SimpleSongAdapter songAdapter = new SimpleSongAdapter(this, R.layout.list_item, songs);

        listView.addHeaderView(listHeader);
        listView.setAdapter(songAdapter);

    }

【问题讨论】:

  • 只是为了澄清......问题似乎是使用 ArrayAdapter。我现在正在尝试获取有关 LogCat 错误的更多信息

标签: android listview custom-controls android-arrayadapter


【解决方案1】:

你正在调用这个构造函数:

public ArrayAdapter (Context context, int resource, T[] objects)

希望资源 id 是 TextView 的 id,但您传递的是布局的 id。

您需要改用以下构造函数:

public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

然后这样称呼它:

SimpleSongAdapter songAdapter = new SimpleSongAdapter(this, R.layout.list_item, 0, songs);

【讨论】:

  • 我让它以另一种方式工作(使用 BaseAdapter),但这还能工作吗?我有 3 个不同的 TextView 需要填充……其中一个需要修改文本颜色。
  • BaseAdapter 应该是理想的选择。这应该仍然有效,因为我们忽略了 textview 参数并在 getView 中填充了 3 个 textview。我没有尝试过这个解决方案,只是我的想法。
  • 我发布了另一个与此相关的问题,但与布局问题有关....目前没有很多活动 - stackoverflow.com/questions/18884937/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2012-09-20
  • 2013-05-21
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多