从这里我问了关于控制和突出一行的问题。其中一个答案是基于自定义适配器,我得到了一系列关于如何做到这一点的链接。当我试图解决这个问题时,我首先遇到了一个问题,得到了我链接的帖子中列出的空指针异常。我很快发现 getview 方法是导致此问题的原因,并尝试通过阅读此处有关此问题的其他帖子来解决此问题。到目前为止,我已经停止了错误,但现在列表视图为空。我的活动是扩展列表视图,我的代码基于这篇关于创建文件资源管理器的文章:文件资源管理器链接
在此示例的 GetDir 方法中,我调用自定义适配器,然后在 getview 中执行以下操作:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewnull = convertView;
if (viewnull == null) {
LayoutInflater vrow;
vrow = LayoutInflater.from(getContext());
viewnull = vrow.inflate(R.layout.row, null);
}
if (currpos == position) {
((TextView)viewnull).setBackgroundColor(Color.BLUE);
}
return viewnull;
}
因为我不打算自定义列表的实际视图,所以我只需要能够列出文件夹和文件并允许其他帖子中给出的代码工作,但直到我可以让列表工作,我我无法再进一步了。
编辑 适配器设置如下:
fl = new FileListAdapter(this,R.layout.row,itemi);
setListAdapter(fl);
我确实尝试在 getview 中设置文本视图,如下所示:
TextView rowtext = (TextView)viewnull.findViewById(R.id.rowtext);
编辑 2 整个适配器代码:
public class FileListAdapter extends ArrayAdapter<String> {
private List<String> itemsll; // Probably not needed
public FileListAdapter(Context context, int row,
List<String> iteml) {
super(context,row,iteml);
// TODO Auto-generated constructor stub
this.itemsll = iteml; // like wise probably not needed
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewnull = convertView;
if (viewnull == null) {
LayoutInflater vrow;
vrow = LayoutInflater.from(getContext());
viewnull = vrow.inflate(R.layout.row, null);
String currow = itemsll.get(position);
TextView rowtext = (TextView)viewnull.findViewById(R.id.rowtext);
}
if (currpos == position) {
((TextView)viewnull).setBackgroundColor(Color.BLUE);
}
return viewnull;
}
public void setSelectedPosition( int pos )
{
currpos = pos; // selectedPos is global variable to handle clicked position
// inform the view of this change
notifyDataSetChanged();
}
}
编辑 3:getDiri 方法:
private void getdiri(String dirpathi) {
mypathi.setText("Current Folder:"+dirpathi);
getcurpathi = dirpathi;
itemi = new ArrayList<String>();
pathi = new ArrayList<String>();
fullpathi = new ArrayList<String>();
File fi = new File(dirpathi);
File[] filesi = fi.listFiles();
if(!dirpathi.equals(rooti))
{
itemi.add(rooti);
pathi.add(rooti);
itemi.add("../");
pathi.add(fi.getParent());
}
for(int i=0; i < filesi.length; i++)
{
File filei = filesi[i];
if(!filei.isHidden() && filei.canRead()){
if(filei.isDirectory()){
pathi.add(filei.getPath());
itemi.add(filei.getName() + "/");
} else {
itemi.add(filei.getName());
pathi.add(filei.getName());
}
}
}
fl = new FileListAdapter(this,R.layout.row,itemi);
setListAdapter(fl);
}
编辑4:除了这个问题,我发现列表没有显示文件夹或文件的描述,行是空白的,但是如果单击它们会移动到文件夹中,即使它现在有针对它的描述。
编辑5:向 getview 添加代码
我现在添加了以下内容:
rowtext.setText(currow);
后 :
String currow = itemsll.get(position);
TextView rowtext = (TextView)viewnull.findViewById(R.id.rowtext);
但是,尽管我现在得到了列表,但如果我进入一个包含多个文件的文件夹,它似乎会重复文件和文件夹。
编辑6:现在整理出来,整个 getView 方法现在是:
public class FileListAdapter extends ArrayAdapter<String> {
private List<String> itemsll;
public FileListAdapter(Context context, int row,
List<String> iteml) {
super(context,row,iteml);
// TODO Auto-generated constructor stub
this.itemsll = iteml;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewnull = convertView;
if (viewnull == null) {
LayoutInflater vrow;
vrow = LayoutInflater.from(getContext());
viewnull = vrow.inflate(R.layout.row, null);
}
String currow = itemsll.get(position);
TextView rowtext = (TextView)viewnull.findViewById(R.id.rowtext);
rowtext.setText(currow);
if (currpos == position) {
rowtext.setBackgroundColor(Color.BLUE);
}
return viewnull;
}