我在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
会被单挑出来。任何帮助都将不胜感激。
编辑:
下面是发送请求以强调
TextView
s的函数。@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/