我在aTextViews中有4个GridView,在给定的Fragment中有一个自定义适配器。我的mainActivity通过TimerTask得到通知,以更新正确的TextView文本颜色。这对所有TextViews都很好,除了应用程序首次启动时的第一个。之后,它将像TextViews中的其他部分一样正常工作。
在所讨论的Fragment中:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.short_press_info_fragment, container, false);
    GridView grid = (GridView) view.findViewById(R.id.grid_view);
    infoAdapter = new ShortPressInfoAdapter(mKeyInfo, getActivity());
    grid.setAdapter(infoAdapter);
    return view;
}

在适配器中:
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if(convertView == null) {
        Log.d("GRID_VIEW", "inflating");
        LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.grid_item, null);
        TextView text = texts[position] = (TextView) v.findViewById(R.id.gridItemText);
        Log.d("GRID_VIEW", "creating view");
        text.setText(mKeyInfo[position]);
        switch(position) {
        case 0:
            text.setBackgroundColor(mContext.getResources().getColor(R.color.blue));
            break;
        case 1:
            text.setBackgroundColor(mContext.getResources().getColor(R.color.yellow));
            break;
        case 2:
            text.setBackgroundColor(mContext.getResources().getColor(R.color.green));
            break;
        case 3:
            text.setBackgroundColor(mContext.getResources().getColor(R.color.red));
            break;
        default:
            break;
        }
    }
    return v;
}

总的来说:
public void emphasizeShort(final PressID p, final boolean b) {
runOnUiThread(new Runnable() {
  @Override
  public void run() {
    if(b) {
      Log.d(TAG, "setting short " + p + " to black");
      getShortTextView(p).setTextColor(getResources().getColor(R.color.black));
    }
    else {
      Log.d(TAG, "setting short " + p + " to white");
      getShortTextView(p).setTextColor(getResources().getColor(R.color.white));
    }
  }
});
}

日志显示了相同的输出,无论应用程序启动时我试图更改哪个Activity,但第一个TextView是唯一没有更改的输出。
什么会导致TextView在应用程序启动时而不是之后忽略更改?从这段代码中,我不明白为什么第一个View会被单挑出来。
任何帮助都将不胜感激。
编辑:
下面是发送请求以强调TextViews的函数。
@Override
public boolean onTouch(final View v, final MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) { // button pressed
    pressTime = System.currentTimeMillis();
    timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        Log.d("TIMER_TASK", "short press "
            + (System.currentTimeMillis() - pressTime));
        mFourButtonListener.onShortPress(buttonID);
      }
    }, SHORT_PRESS_DELAY);
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        Log.d("TIMER_TASK", "long press "
            + (System.currentTimeMillis() - pressTime));
        mFourButtonListener.onLongPress(buttonID);
      }
    }, LONG_PRESS_DELAY);
    return true;
  } else if (event.getAction() == MotionEvent.ACTION_UP) {
    duration = System.currentTimeMillis() - pressTime;
    timer.cancel();
    timer.purge();
    if (duration >= SHORT_PRESS_DELAY && duration < LONG_PRESS_DELAY)
      mFourButtonListener.onShortRelease(buttonID);
    else if (duration >= LONG_PRESS_DELAY)
      mFourButtonListener.onLongRelease(buttonID);
    return true;
  }
  return false;
}
}

我快绝望了。

最佳答案

这里有很多丢失的代码,但是如果在应用程序首次启动时出现问题,那么问题可能是由启动时不可靠的runOnUiThread引起的。(也就是说,并不是所有发布的任务都能保证运行。)
添加类级别Handler变量

Handler h;

并在onCreate
h = new Handler();

然后使用h.post()而不是runOnUiThread

关于android - GridView中的特定TextView未在app init上更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19993630/

10-09 01:38