【问题标题】:Trying to display data read from a CSV file in a ListView尝试在 ListView 中显示从 CSV 文件读取的数据
【发布时间】:2018-02-21 07:41:21
【问题描述】:

我对在 android studio 中编程非常陌生,并且想制作一个我可以在工作中使用的应用程序。基本思想是将产品列表从 CSV 文件导入应用程序,并将其显示为列表视图,这样我就可以为每个产品调出相关文档。

程序从 CSV 文件读取没有问题,但是当我尝试使用适配器查看 ListView 中的数据时,适配器总是说“无法解析构造函数”。我一直在寻找几天的答案,但我已经放弃了。有人能解释一下吗?

MainActivity.java

    package com.example.mblapplication;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;

    import static com.example.mblapplication.R.id.ProdList1;

    public class MainActivity extends AppCompatActivity {

    public List<ProdSample> productSamples = new ArrayList<>();

    public void readProdData() {
    InputStream is = getResources().openRawResource(R.raw.products);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );
    String line = "";
    try {
        // Step over headers
        reader.readLine();
        while ((line = reader.readLine()) != null) {
            Log.d("MBLApplication", "Line is: " + line);

            // Split by ","
            String[] tokens = line.split(",");

            // Read the data
            ProdSample sample = new ProdSample();
            if (tokens[0].length() > 0) {
                sample.setSAP(tokens[0]);
            } else {
                sample.setSAP("");
            }
            sample.setProdID(tokens[1]);
            sample.setWidth(tokens[2]);
            sample.setLooms(tokens[3]);
            productSamples.add(sample);

            Log.d("MBLApplication", "Just created: " + sample);

        }
    } catch (IOException e) {
        Log.wtf("MBLApplication, Error reading file on line " + line, e);
        e.printStackTrace();
    }
}

ListView listView;
//List<String> listItems = new ArrayList<>(5);
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    readProdData();
    ArrayAdapter<String> productAdapter = new ArrayAdapter<String>
            (MainActivity.this, android.R.layout.simple_list_item_1, ProdList1, productSamples); //ERROR HERE
    //listItems.add(0, "Hello");
    //listItems.add(1, "World");

    ListView listView = (ListView) findViewById(R.id.ProdList1);
    listView.setAdapter(productAdapter);
      }
    }

ProdSample.class

    package com.example.mblapplication;

    class ProdSample {
    private String SAP;
    private String ProdID;
    private String Width;
    private String Looms;

    public String getSAP() {
    return SAP;
    }

    public void setSAP(String SAP) {
    this.SAP = SAP;
    }

    public String getProdID() {
    return ProdID;
    }

    public void setProdID(String prodID) {
    this.ProdID = prodID;
    }

    public String getWidth() {
    return Width;
    }

    public void setWidth(String width) {
    this.Width = width;
    }

    public String getLooms() {
    return Looms;
    }

    public void setLooms(String looms) {
    Looms = looms;
    }

    @Override
    public String toString() {
    return "ProdSample{" +
            "SAP='" + SAP + '\'' +
            ", ProdID=" + ProdID +
            ", Width=" + Width +
            ", Looms='" + Looms + '\'' +
            '}';
      }
    }

【问题讨论】:

    标签: java android csv listview arraylist


    【解决方案1】:

    当您为列表项 android.R.layout.simple_list_item_1 使用 android 默认布局时,您不需要下一个参数 ProdList1。删除它

    CustomArrayAdapter<ProdSample> productAdapter = new CustomArrayAdapter<ProdSample>
            (MainActivity.this, android.R.layout.simple_list_item_1,  productSamples);
    

    否则,如果您使用了自己的列表项布局,那么

    CustomArrayAdapter<ProdSample> productAdapter = new CustomArrayAdapter<ProdSample>
            (MainActivity.this, R.id.your_textview_id_in_your_list_item_layout, productSamples);
    

    你列出的项目布局xml文件应该是那么

    // your_list_item_layout.xml    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/your_textview_id_in_your_list_item_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       />
    
    </LinearLayout>
    

    您的自定义数组适配器

    public class CustomArrayAdapter extends ArrayAdapter<ProdSample> {
    
    private static class ViewHolder {
        private TextView itemView;
    }
    
    public CustomArrayAdapter(Context context, int textViewResourceId, ArrayList<ProdSample> items) {
        super(context, textViewResourceId, items);
    }
    
    public View getView(int position, View convertView, ViewGroup parent) 
    {
    
        if (convertView == null) {
            convertView = LayoutInflater.from(this.getContext())
            .inflate(R.layout.your_list_item_layout, parent, false);
    
            viewHolder = new ViewHolder();
            viewHolder.itemView = (TextView) convertView.findViewById(R.id.your_textview_id_in_your_list_item_layout);
    
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        ProdSample sample = getItem(position);
        if (item!= null) {
    
            viewHolder.itemView.setText(sample.toString());
        }
    
        return convertView;
      }
    }
    

    【讨论】:

    • 感谢您的回复,由于我没有想法,我添加了 ProdList1。但是,它仍然具有与以前相同的构造函数错误。我认为这与我尝试显示的 Array 类型有关,但我还是个菜鸟。
    • 您正在将 ArrayAdapter 用于 String 对象,但您正在传递 ProdSample 类。在这种情况下,您需要创建自己的阵列适配器
    • 查看使用 ProdSample 的自定义阵列适配器的更新答案
    • 非常感谢,我设法找到了一个自定义适配器示例并将其调整为在我的应用程序中工作。
    • 如果这个答案帮助你解决了你的问题,那么请不要忘记接受它@MarkMitchell
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-04-20
    相关资源
    最近更新 更多