我正在开发一个自助服务终端应用程序(某些应用程序可用)。我制作了一个列表视图,显示了手机上安装的所有应用程序。在此列表中,我希望用户选择允许在自助服务终端中使用的应用程序。如果用户选择一行(显示1个应用程序),则需要更改颜色并将其放在单独的列表中(allowedAppList)。
奇怪的是,当用户按下列表项时,颜色会正确更改。但它会改变也会改变它下面每个第8个项目的颜色。
当按下列表项时,我也会记录(查看代码),它只会更改单击列表项的容差,而不会更改下面的每个第8项。
请帮帮我
//我只添加了点击列表项的代码
private void addClickListener(){
allowedApps = new ArrayList<AppDetail>();
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
boolean isAllowed;
public void onItemClick(AdapterView<?> av, View v, int pos,
long id) {
isAllowed = apps.get(pos).allowed;
if (isAllowed == false){
apps.get(pos).allowed = true;
Log.i("ALLOWED", apps.get(pos).name.toString());
v.setBackgroundResource(R.color.green);
}else if (isAllowed == true) {
apps.get(pos).allowed = false;
Log.i("NOT ALLOWED", apps.get(pos).name.toString());
v.setBackgroundResource(R.color.white);
}
}
});
修改 适配器代码(我加载安装的应用程序)
private PackageManager manager;
private List<AppDetail> apps;
private void loadApps(){
manager = getPackageManager();
apps = new ArrayList<AppDetail>();
Intent i = new Intent(Intent.ACTION_MAIN, null);
i.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
for(ResolveInfo ri:availableActivities){
AppDetail app = new AppDetail();
app.label = ri.loadLabel(manager);
app.name = ri.activityInfo.packageName;
app.icon = ri.activityInfo.loadIcon(manager);
app.allowed = false;
apps.add(app);
}
Log.i("applist", apps.toString());
}
private ListView list;
private void loadListView(){
list = (ListView)findViewById(R.id.apps_list);
ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this,
R.layout.list_item,
apps) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = getLayoutInflater().inflate(R.layout.list_item, null);
}
ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
appIcon.setImageDrawable(apps.get(position).icon);
TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
appLabel.setText(apps.get(position).label);
TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
appName.setText(apps.get(position).name);
if (apps.get(position).allowed == true){
convertView.setBackgroundColor(getResources().getColor(R.color.green));
}
return convertView;
}
};
list.setAdapter(adapter);
}
答案 0 :(得分:1)
问题是ListView中的行视图会被回收。因此,解决方案是在该行后面的AppDetail对象上设置一个布尔属性,以指示它已被单击,并在Adapter的getView()函数中设置背景颜色。 相关代码看起来像这样:
public void onItemClick(AdapterView<?> av, View v, int pos,
long id) {
[...]
((AppDetail) av.getAdapter().getItem(pos)).setClicked(true);
[...]
}
并在你的适配器
public View getView(final int position, final View convertView, final ViewGroup parent) {
[...]
convertView.setBackgroundColor(getResources().getColor(apps.getPosition(position).isClicked() ? R.color.green : R.color.white));
[...]
}