我正在创建一个应用程序来从phone中获取txt文件的名称。我将所有数据提取到一个arraylist并将其添加到适配器。但问题是listview没有正确显示项目。首先,只有第一个项目出现,当我向上和向下滚动时,会出现更多项目。虽然我在行项目中添加了一个静态图像并且显示正确,但即便如此我能够在listview上的toast消息中获取名称当时不可见的项目的文件名。我发布我的代码检查它并告诉我的错误
public class MainActivity extends AppCompatActivity {
private File sdcardObj=new File(Environment.getExternalStorageDirectory().getAbsolutePath());
private ArrayList<String> filelist=new ArrayList<String>();
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list= (ListView) findViewById(R.id.listfiles);
LongOperation longOperation=new LongOperation();
longOperation.execute();
}
private class LongOperation extends AsyncTask<String, Void, String> {
ProgressDialog progressDialog;
@Override
protected String doInBackground(String... params) {
listFiles(sdcardObj,filelist);
return "Executed";
}
@Override
protected void onPostExecute(String result) {
progressDialog.dismiss();
MyListAdapater myListAdapater=new MyListAdapater(MainActivity.this,filelist);
list.setAdapter(myListAdapater);
}
@Override
protected void onPreExecute() {
progressDialog=new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Please Wait.Loading files list");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected void onProgressUpdate(Void... values) {}
}
private void listFiles(File sdcard,ArrayList<String> filelist) {
if(sdcard.isDirectory()){
File[] files = sdcard.listFiles();
try {
for (File f : files){
if(!f.isDirectory()) {
if(f.getName().endsWith(".txt")|| f.getName().endsWith(".docx")||f.getName().endsWith(".rtf")) {
// Log.d(" FILES",f.getName());
this.filelist.add(f.getAbsolutePath());
}
}
else {
this.listFiles(f,this.filelist);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
}
}
static class ViewHolder{
public TextView cardId;
}
class MyListAdapater extends BaseAdapter {
ArrayList<String>files=new ArrayList<>();
LayoutInflater inflater ; Context context;
public MyListAdapater(Context context,ArrayList<String> cardListForDisplay) {
super();
this.files = cardListForDisplay;
this.context=context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return files.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View view, ViewGroup parent) {
View rowView = view;
ViewHolder holder;
if(rowView==null){
holder=new ViewHolder();
inflater = ((MainActivity) context).getLayoutInflater();
rowView = inflater.inflate(R.layout.list_item, parent, false);
holder.cardId=(TextView)rowView.findViewById(R.id.tv_name);
rowView.setTag(holder);
// /storage/emulated/0/Android/data/com.gameloft.android.ANMP.GloftFWHM/files/d_o_w_n_l_o_a_d_e_d.txt
}
else{
holder=(ViewHolder) rowView.getTag();
String name=files.get(arg0).substring(files.get(arg0).lastIndexOf("/")+1,files.get(arg0).length());
holder.cardId.setText(name);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this,files.get(position), Toast.LENGTH_LONG).show();
}
});
}
return rowView;
}
}
}