Android:如何使用扩展布局类作为ListView行?

怀斯基

我正在创建一个简单的国际象棋钟型计时器应用程序。我正在尝试显示玩家及其离开的时间ListView我正在使用扩展RelativeLayout到这些行的自定义视图,例如,我可以给它提供依次突出显示播放器的方法。

行布局类:

public class GameTimerView extends RelativeLayout {

    private TextView nameView;
    private TextView timerView;
    public GameTimerView(Context context) {
        super(context);

        LayoutInflater inflater = LayoutInflater.from(context);
        inflater.inflate(R.layout.timer_view, this);

        loadViews();
    }

    ...

    private void loadViews() {
        nameView = (TextView)findViewById(R.id.nameView);
        timerView = (TextView)findViewById(R.id.timerView);
    }

    public void setName(String name) {
        nameView.setText(name);
    }

    public void setTime(long timeInMillis) {
        timerView.setText(String.format("%02d:%02d",
                TimeUnit.MILLISECONDS.toMinutes(timeInMillis),
                TimeUnit.MILLISECONDS.toSeconds(timeInMillis) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeInMillis))
        ));
    }

    public void setActive() {
        this.nameView.setTextColor(Color.GREEN);
    }

    public void setInactive() {
        nameView.setTextColor(Color.BLACK);
    }
}

行布局XML(timer_view.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/nameView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/timerView"
        android:text="@string/player_default_name" />

    <TextView
        android:id="@+id/timerView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="@string/zero_time" />

</RelativeLayout>

适配器:

public class playerArrayAdapter extends ArrayAdapter<Player> {
    private final Context context;
    private final ArrayList<Player> players;

    public playerArrayAdapter(Context context, ArrayList<Player> values) {
        super(context, R.layout.timer_view, values);
        this.context = context;
        this.players = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        GameTimerView playerView = new GameTimerView(context);
        players.get(position).setTimerView(playerView);

        return playerView;
    }
}

播放器类的setTimerView函数:

public void setTimerView(GameTimerView timer) {
    this.timerView = timer;
    this.timerView.setName(this.name);
    this.timerView.setTime(this.totalCountDown);
    this.timerView.setInactive();
}

在活动的onCreate方法中:

playerArrayAdapter playersAdapter = new playerArrayAdapter(
        getApplicationContext(),
        game.getPlayers()
);

ListView playersView = (ListView) findViewById(R.id.playerList);
playersView.setAdapter(playersAdapter);

最初,这似乎可行,并且所需的玩家名称和时间已正确呈现到列表中。但是,如果以后再以编程方式调用Player.timerView.setActive(),则什么也不会发生。

看过数十个ListViews的自定义适配器的示例后,似乎没有一个以这种方式使用它-视图总是直接在中膨胀Apdater.getView()我想要扩展视图类的灵活性,但是显然我做错了。

那么,对ListView使用自定义视图类的正确方法是什么?

安托万·马克斯(Antoine Marques)

首先,给充气时GameTimerView,您会感到RelativeLayout内心深处。

其次,回答问题:最好不要在每次对的调用上重新创建视图ArrayAdapter.getView(),而是playerArrayAdapter通过添加如下所示的缓存来进行修改

private List<View> views;

public playerArrayAdapter(Context context, ArrayList<Player> values) {
    super(context, R.layout.timer_view, values);
    views = new ArrayList<View>(values.length);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View playerView;
    if (position < views.size()) {
        playerView = views.get(position);
        if (playerView != null)
            return playerView;
    } else {
        while (views.size() < position)
            views.add(null);
    }
    playerView = new GameTimerView(context);
    views.add(position, playerView);
    players.get(position).setTimerView(playerView);
    return playerView;
}

如果此操作成功解决了您的问题,则意味着在以前,将播放器设置为活动状态时,ListView将再次获取所有视图以进行渲染,重新创建视图,然后删除所有以前的状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何定义扩展布局的AttributeSet参数

来自分类Dev

如何在Android的框架布局上显示可扩展布局?

来自分类Dev

如何多次扩展布局但在其列表视图中使用不同的数据?

来自分类Dev

使用绑定扩展布局时,MVVMCross异常

来自分类Dev

Laravel 4-使用刀片模板扩展布局

来自分类Dev

在扩展布局时以编程方式使用“toRightOf”

来自分类Dev

输入框的可扩展布局

来自分类Dev

使用深层URL路径时Express res.render中断会扩展布局

来自分类Dev

在条件@if 内扩展布局导致布局重复

来自分类Dev

如何在不覆盖布局部分的脚本的情况下扩展布局 (Laravel 5.8)

来自分类Dev

如何在可扩展的ListView Android中使用编辑文本作为搜索框?

来自分类Dev

无法在“骨干木偶”中扩展布局视图

来自分类Dev

扩展布局时出现不确定的变量错误

来自分类Dev

如何在活动类中使用自定义类(扩展了View类)以绘制路径而不更改android中主布局的其他部分

来自分类Dev

扩展布局时,我们是否必须编写fos_user_content的内容?

来自分类Dev

屏幕处于横向模式时的扩展布局显示半黑屏

来自分类Dev

Jinja扩展布局模板时不呈现任何内容

来自分类Dev

Android在ListView行中充气新布局

来自分类Dev

自定义子布局的可扩展ListView android

来自分类Dev

如何使用Delphi XE5扩展Android类

来自分类Dev

如何使用delphi xe5扩展android类

来自分类Dev

如何使用PHP类扩展?

来自分类Dev

如何使用 JPype 作为其与 Java 的接口机制在 Python 中扩展 Java 类?

来自分类Dev

使用列表作为观察扩展行

来自分类Dev

ListView的动态行布局

来自分类Dev

如何使用自定义行和标题布局预览Android ListView

来自分类Dev

如何在java类中以编程方式使用<merge>标签而不在android中使用xml布局?

来自分类Dev

Android ListView:如何使用buttonclick添加一行

来自分类Dev

在android java类中使用Kotlin扩展

Related 相关文章

  1. 1

    如何定义扩展布局的AttributeSet参数

  2. 2

    如何在Android的框架布局上显示可扩展布局?

  3. 3

    如何多次扩展布局但在其列表视图中使用不同的数据?

  4. 4

    使用绑定扩展布局时,MVVMCross异常

  5. 5

    Laravel 4-使用刀片模板扩展布局

  6. 6

    在扩展布局时以编程方式使用“toRightOf”

  7. 7

    输入框的可扩展布局

  8. 8

    使用深层URL路径时Express res.render中断会扩展布局

  9. 9

    在条件@if 内扩展布局导致布局重复

  10. 10

    如何在不覆盖布局部分的脚本的情况下扩展布局 (Laravel 5.8)

  11. 11

    如何在可扩展的ListView Android中使用编辑文本作为搜索框?

  12. 12

    无法在“骨干木偶”中扩展布局视图

  13. 13

    扩展布局时出现不确定的变量错误

  14. 14

    如何在活动类中使用自定义类(扩展了View类)以绘制路径而不更改android中主布局的其他部分

  15. 15

    扩展布局时,我们是否必须编写fos_user_content的内容?

  16. 16

    屏幕处于横向模式时的扩展布局显示半黑屏

  17. 17

    Jinja扩展布局模板时不呈现任何内容

  18. 18

    Android在ListView行中充气新布局

  19. 19

    自定义子布局的可扩展ListView android

  20. 20

    如何使用Delphi XE5扩展Android类

  21. 21

    如何使用delphi xe5扩展android类

  22. 22

    如何使用PHP类扩展?

  23. 23

    如何使用 JPype 作为其与 Java 的接口机制在 Python 中扩展 Java 类?

  24. 24

    使用列表作为观察扩展行

  25. 25

    ListView的动态行布局

  26. 26

    如何使用自定义行和标题布局预览Android ListView

  27. 27

    如何在java类中以编程方式使用<merge>标签而不在android中使用xml布局?

  28. 28

    Android ListView:如何使用buttonclick添加一行

  29. 29

    在android java类中使用Kotlin扩展

热门标签

归档