これから、行の制御と強調表示について尋ねました。答えの 1 つはカスタム アダプターに基づくもので、これを行う方法に関する一連のリンクが提供されました。これを回避しようとしているときに、リンクされた投稿にリストされているように、最初にヌルポインター例外を取得するという問題に遭遇しました。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);
しかし、リストは表示されますが、複数のファイルが含まれるフォルダーに移動すると、ファイルとフォルダーが重複しているように見えます。
EDIT 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;
}