ListView 没有正确显示项目

ListView not showing items properly

我正在创建一个应用程序来从 phone.I 中获取 txt 文件的名称,将所有数据提取到数组列表中并将其添加到适配器中。但问题是 listview 没有首先显示项目 properly.At,只有第一个项目显示,当我上下滚动更多项目 appear.Although 我在行项目中添加了一个静态图像并且显示正确,即使我能够在 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;
    }
}
}

问题是,您正在 else 案例中设置数据。因此,当 if 案例评估为 true 时,将不会有任何数据集,您的列表视图将显示一个空行。将 getView 方法更改为:

@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);
     }
     holder      = (ViewHolder) rowView.getTag();
     String name = files.get(arg0).substring(files.get(arg0).lastIndexOf("/")+1,files.get(arg0).length());
     holder.cardId.setText(name);
     return rowView;
}