Android ListView未正确显示项目

Android ListView未正确显示项目,android,android-listview,android-adapter,Android,Android Listview,Android Adapter,我正在创建一个从手机中获取txt文件名的应用程序。我将所有数据提取到arraylist中,并将其添加到适配器中。但问题是listview没有正确显示项目。起初,只有第一个项目显示,当我上下滚动时,会显示更多项目。虽然我在行项目中添加了一个静态图像,并且该图像显示正确,但即使我能够在listview上的toast消息中获取当时名称不可见的项目的文件名。我正在发布我的代码,检查一下,告诉我出了什么问题 public class MainActivity extends AppCompatActivi

我正在创建一个从手机中获取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;
    }
}
}
public类MainActivity扩展了AppCompatActivity{
私有文件sdcardObj=新文件(Environment.getExternalStorageDirectory().getAbsolutePath());
private ArrayList filelist=new ArrayList();
私有列表视图列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
列表=(ListView)findViewById(R.id.listfiles);
LongOperation LongOperation=新的LongOperation();
longOperation.execute();
}
私有类LongOperation扩展了异步任务{
进行对话进行对话;
@凌驾
受保护的字符串doInBackground(字符串…参数){
列表文件(sdcardObj,文件列表);
返回“已执行”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
progressDialog.disclose();
MyListAdapter MyListAdapter=新的MyListAdapter(MainActivity.this,filelist);
列表.设置适配器(myListAdapater);
}
@凌驾
受保护的void onPreExecute(){
progressDialog=新建progressDialog(MainActivity.this);
progressDialog.setMessage(“请稍候。正在加载文件列表”);
progressDialog.setCancelable(假);
progressDialog.show();
}
@凌驾
受保护的void onProgressUpdate(void…值){}
}
私有无效列表文件(文件SD卡、ArrayList文件列表){
if(sdcard.isDirectory()){
File[]files=sdcard.listFiles();
试一试{
用于(文件f:文件){
如果(!f.isDirectory()){
if(f.getName().endsWith(“.txt”)| | f.getName().endsWith(“.docx”)| | f.getName().endsWith(“.rtf”)){
//Log.d(“文件”,f.getName());
this.filelist.add(f.getAbsolutePath());
}
}
否则{
this.listFiles(f,this.filelist);
}
}
}捕获(例外e){
//TODO自动生成的捕捉块
//e、 printStackTrace();
}
}
}
静态类视窗夹{
公共文本视图;
}
类MyListAdapter扩展了BaseAdapter{
ArrayList文件=新的ArrayList();
充气机布局;语境;
公共MyListAdapter(上下文,ArrayList cardListForDisplay){
超级();
this.files=cardListForDisplay;
this.context=context;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回文件.size();
}
@凌驾
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回arg0;
}
@凌驾
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int arg0,视图视图,视图组父级){
视图行视图=视图;
视窗座;
if(rowView==null){
holder=新的ViewHolder();
充气器=((MainActivity)上下文).getLayoutFlater();
rowView=充气机。充气(R.layout.list_项,父项,false);
holder.cardd=(TextView)rowView.findViewById(R.id.tv_name);
rowView.setTag(支架);
///storage/emulated/0/Android/data/com.gameloft.Android.ANMP.GloftFWHM/files/d_o_w_n_l_o_a_d_e_d.txt
}
否则{
holder=(ViewHolder)rowView.getTag();
字符串名称=files.get(arg0).substring(files.get(arg0).lastIndexOf(“/”)+1,files.get(arg0).length());
holder.carid.setText(名称);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Toast.makeText(MainActivity.this,files.get(position),Toast.LENGTH_LONG.show();
}
});
}
返回行视图;
}
}
}

问题是,您正在
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;
}

您所说的
未正确显示是什么意思?它被错误地定位了?调整大小或根本不显示?您的代码太长,无法在此处发布。你试过调试吗?我告诉过你正确显示列表大小,但没有为所有项目显示带有文件名的文本视图。开始时,仅为第一个项目显示,当我上下滚动时,它会随机显示更多项目是的,我能够看到toastAlso中每个项目的文件路径,不要在每次初始化列表项时从每个项循环引用列表的
getView
内部设置列表
onItemClickListener
。请将其移至
onCreate