【问题标题】:How to get group children view in expandable listview and countdown timer?如何在可扩展列表视图和倒数计时器中获取组子视图?
【发布时间】:2014-05-21 15:08:43
【问题描述】:

我遇到了这个问题,我有一个可扩展列表视图和一个倒数计时器。使用倒数计时器,我想扩展一个组并用剩余时间更新 textview。我没有在网上找到任何解决方案,这就是我在这里写的原因。

如何从计时器访问视图?

这是我的可扩展列表视图代码:

public class ExerciseListAdapter extends BaseExpandableListAdapter {

    private View childview, rowview;
    private List<List<Bitmap>> vajeImage;
    private ArrayList<ExerciseItem> headers;

    public ExerciseListAdapter(View ChView, View RView, List<List<Bitmap>> vaje, ArrayList<ExerciseItem> header) {
        this.childview = ChView;
        this.rowview = RView;
        this.vajeImage = vaje;
        this.headers = header;
    }

    @Override
    public int getGroupCount() {
        return headers.size();
    }

    @Override
    public int getChildrenCount(int i) {
        return vajeImage.get(i).size();
    }

    @Override
    public Object getGroup(int i) {
        return headers.get(i);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return vajeImage.get(groupPosition).get(childPosition);
    }

    @Override
    public long getGroupId(int i) {
        return i;
    }


    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.exercise_elv_row, viewGroup, false);
        TextView txHead = (TextView) view.findViewById(R.id.textViewExeHead);
        txHead.setText(headers.get(i).getIme());
        TextView txSub = (TextView) view.findViewById(R.id.textViewExeSub);
        txSub.setText(headers.get(i).getOpis());
        return view;
    }

    @Override
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.exercise_elv_child_item, viewGroup, false);
        ImageView imview = (ImageView) view.findViewById(R.id.imageviewChild);
        imview.setImageBitmap(vajeImage.get(i).get(i1));
        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return true;
    }


}

这是我的计时器代码

public class MyCountDownTimer extends CountDownTimer {
    int current=0;
    ExpandableListView EL;
    TextView timeText;
    public MyCountDownTimer(long startTime, long interval, ExpandableListView list) {
        super(startTime, interval);
        EL=list;
        list.expandGroup(current);

        //this returns null pointer exception on TextView tx           
        list.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                if(EL.isGroupExpanded(groupPosition)) {
                    TextView tx = (TextView) EL.getChildAt(groupPosition).findViewById(R.id.textViewTime);
                    tx.setText("2");
                }
            }
        });
    }

    @Override
    public void onFinish() {
        //timeText.setText("Time's up!");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        //timeText.setText("" + millisUntilFinished / 1000);
        Log.v("test","" + millisUntilFinished / 1000);
    }
}

编辑

这里我尝试访问我的适配器的公共方法,适配器类是公共的,方法是公共的,但没有找到

                if(EL.isGroupExpanded(groupPosition)) {
                    //epl.setChildViewData(groupPosition, 0, "2");

                   epl=(ExpandableListAdapter)EL.getExpandableListAdapter();
                    //cannot resolve method "notifyDataSetChanged
                   epl.notifyDataSetChanged();

【问题讨论】:

  • 你到底想要什么?在计时器结束时,所有孩子都应该展开??还是什么时候?
  • 当我创建新计时器时,选定的组应该扩展,它会这样做。我想更新该扩展组的子视图,但我无法访问它。
  • 你做了什么来访问它?你遇到了什么异常?
  • TextView tx 在我尝试设置字符串“2”时返回空异常。我什至不确定我应该如何访问扩展组子,这就是为什么我首先扩展选定的组,然后我尝试通过 ongroupexpand 监听器访问它,但它不起作用。
  • 您是否尝试在适配器内创建类?作为班上的班级。这样,从适配器访问变量会容易得多。

标签: android android-listview android-view countdowntimer


【解决方案1】:

您尝试访问的childview 不是在您拨打电话时创建的。因此,在您的setOnGroupExpandListener() 中,尚未创建子视图,因此您会遇到该异常,因此您必须等到所有视图都创建完成后才能进行修改

我建议您将值传递给适配器,以便它进行修改。像这样的

在您的ExerciseListAdapter 文件中添加此HashMap

private HashMap<String, String> mMapStuff =new HashMap<String, String>();   

还要在适配器中添加一个 this 方法

public void setChildViewData(int groupPosition, int childPosition, String value){
    mMapStuff.put(groupPosition+""+childPosition, value);
}

现在在您的 getChildView() 方法中

@Override
public View getChildView(int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

    Some Other Code 
    .....

    //Note this should be your last line before the return statement
    String msg = mMapStuff.get(groupPosition+""+childPosition);
    if(msg != null)
        txtListChild.setText(msg);
    return convertView;
}

现在在你的setOnGroupExpandListener() 中添加这一行

listAdapter.setChildViewData(groupPosition, 0, "2");

喜欢这个

//this returns null pointer exception on TextView tx           
list.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    @Override
    public void onGroupExpand(int groupPosition) {
        listAdapter.setChildViewData(groupPosition, 0, "2");
    }
});

让我知道这是否有效

【讨论】:

  • 出于某种奇怪的原因,我无法访问 setChildViewData 方法,尽管它是公开的...
  • 您遇到了什么错误?你的适配器类是公开的吗?你想在哪里访问它请粘贴代码
  • 查看我编辑的第一篇文章。适配器类是公开的,方法是公开的,真是奇怪的行为。
  • 您的解决方案完美运行!谢谢,我以前不熟悉可扩展列表视图的更新。
  • 你好@GirishNair 我想要这样的要求,我在可扩展列表的子部分中有一个音频播放器。在音频播放中,有播放/暂停按钮用于播放。如果我想打开其他可扩展列表,则关闭前一个孩子并且应该停止音频播放器。它工作正常,但问题是 播放/暂停按钮没有从暂停变为播放
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多