【发布时间】:2012-04-15 23:18:05
【问题描述】:
Edit3:将代码交换为完整的可运行测试用例。
Edit2:添加了一些在五秒后更新按钮数量的代码。发生这种情况时,无论您使用什么布局,按钮都无法点击。
Edit1:这似乎取决于用于 ListView 的布局。我会进一步调查。
我想创建一次按钮,即缓存它们。由于各种原因,我无法使用提供的 convertView 并对其进行编辑(每一行最终都会包含几个组件,它们都是由另一个框架创建的)。
如果我创建一个如下所示的适配器,这似乎非常合理并且 imo 应该可以工作,那么只有在 ListView 之外并被滚动回的按钮是可点击的。
似乎按钮的可点击区域在首次显示时设置不正确。谁能解释一下为什么?
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
public class TestActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final ListView listView = new ListView(this);
final ArrayList<View> cachedButtons = new ArrayList<View>(Arrays.asList(new View[20]));
listView.setAdapter(new BaseAdapter() {
public View getView(int position, View convertView, ViewGroup parent)
{
if (cachedButtons.get(position) == null) {
Button b = new Button(parent.getContext());
b.setText("Button " + position);
b.setClickable(true);
cachedButtons.set(position, b);
}
return cachedButtons.get(position);
}
public int getCount() { return cachedButtons.size(); }
public Object getItem(int position) { return null; }
public long getItemId(int position) { return position; }
});
// Add a new button after five seconds
new Timer().schedule(new TimerTask() {
public void run()
{
runOnUiThread(new Runnable() {
public void run()
{
cachedButtons.addAll(Arrays.asList(new View[1])); // Add one more
((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();
Toast.makeText(listView.getContext(), "Now you can't press the buttons anymore", 0).show();
}
});
}
}, 5000);
// Doesn't work with these lines
LinearLayout layout = new LinearLayout(this);
layout.addView(listView);
setContentView(layout);
// Works with this, so no Layout works.
//setContentView(layout);
}
}
【问题讨论】:
-
我已经测试了您的代码并且所有按钮都是可点击的。也许这不是您的全部代码?此外,应使用适配器将数据绑定到
ListView而不是视图。 -
好的,我做了更多的测试。如果按钮被改变,我认为边界,一切都变得不可点击。一些布局管理器会更定期地执行此操作,而有些则不会。如果您添加我在原始帖子底部添加的代码,则在我的测试用例中,按钮在五秒钟后变得不可点击。