我有一个listview,它使用自定义适配器来处理各个视图,来自数据库中的信息。我想要做的是禁用该列表视图中的某些项目(它是一个基本的进程系统,即用户完成模块1,然后模块2被解锁)。
我已经看到在这里和那里提到我的适配器类中的 areAllItemsEnabled()和 isEnabled()方法。我遇到的问题是, areAllItemsEnabled()似乎没问题,但 isEnabled()方法基本上启用/禁用整个列表视图,而不是单个项目。感谢任何帮助,提前谢谢。
适配器类:
public class ModuleAdapter extends ArrayAdapter<Module> {
Context context;
int layoutResourceId;
Module data[];
public ModuleAdapter(Context context, int layoutResourceId,
Module data[]) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ModuleHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ModuleHolder();
holder.modJapTitle = (TextView)row.findViewById(R.id.moduleJapTitle);
holder.modEngTitle = (TextView)row.findViewById(R.id.moduleEngTitle);
holder.modComp = (TextView)row.findViewById(R.id.moduleCompletion);
holder.modRating = (RatingBar)row.findViewById(R.id.moduleScore);
row.setTag(holder);
}
else
{
holder = (ModuleHolder)row.getTag();
}
Module module = data[position];
holder.modJapTitle.setText(module.moduleJapaneseTitle);
holder.modEngTitle.setText(module.moduleEnglishTitle);
holder.modComp.setText(module.moduleCompletionRate);
holder.modRating.setRating(module.moduleRating);
return row;
}
static class ModuleHolder
{
TextView modEngTitle;
TextView modJapTitle;
TextView modComp;
RatingBar modRating;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
}
活动实施:
ModuleAdapter moduleData = new ModuleAdapter(this, R.layout.module_box_item, module_data);
moduleData.areAllItemsEnabled();
moduleData.isEnabled(0);
ListView listView1 = (ListView)findViewById(R.id.moduleListContainer);
listView1.setClickable(true);
listView1.setAdapter(moduleData);
listView1.setCacheColorHint(Color.TRANSPARENT);
listView1.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int temp = position + 1;
Intent i = new Intent(Story.this, SkitSelect.class);
i.putExtra("moduleToGet", temp);
startActivity(i);
}
});
各个项目的视图说明:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/moduleBox"
android:id="@+id/moduleBoxSingle"
android:focusableInTouchMode="false"
android:clickable="false"
android:focusable="false" >
<TextView
android:id="@+id/moduleJapTitle"
style="@style/moduleTitleJap" />
<TextView
android:id="@+id/moduleCompletion"
android:layout_above="@+id/moduleSepartor"
style="@style/moduleCompletion" />
<View
android:id="@+id/moduleSepartor"
android:layout_below="@+id/moduleJapTitle"
style="@style/moduleSeperator" />
<TextView
android:id="@+id/moduleEngTitle"
android:layout_below="@+id/moduleSepartor"
style="@style/moduleTitleEng" />
<RatingBar
android:id="@+id/moduleScore"
android:layout_below="@+id/moduleSepartor"
style="@style/moduleRating"
android:layout_alignParentRight="true" />
</RelativeLayout>
答案 0 :(得分:1)
好的,我想出来了。方法很简单:
public boolean isEnabled(int position) {
if (position == 2) {
return false
}
return true;
}
必须在自定义适配器中设置。未从活动中的实现调用。这是问题,因为我试图做一些像mycustomadapter.isEnabled(2)这样的错误。
希望这有助于其他人。
答案 1 :(得分:0)
but the isEnabled() method basically enables/disables the entire listview, not the individual item.
它将给出当前行的状态。
public boolean isEnabled(int position) {
return super.isEnabled(position);
};
但你想做什么?你是否启用/禁用
(adapter.getView(position, convertView, parent)).setEnabled(false);