2017-09-12 34 views
1

顯示從CSV文件中讀取數據我是很新的在Android Studio中編程,並想使一個應用程序,我可以在工作中使用。基本思想是將產品列表從CSV文件導入到應用程序中,並將其顯示爲列表視圖,以便爲每個文件提供相關文檔。嘗試在ListView

該程序從沒有問題的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 + '\'' + 
      '}'; 
     } 
    } 

回答

0

當你正在使用您的列表項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; 
    } 
} 
+0

感謝您對R eply,我添加了ProdList1,因爲我沒有想法。然而,它仍然具有與之前相同的構造函數錯誤。我認爲它與我嘗試顯示的陣列類型有關,但我又是一個完整的noob。 –

+0

您正在使用ArrayAdapter作爲String對象,但您正在傳遞ProdSample類。您需要創建你在這種情況下,自己的陣列適配器 –

+0

見定製陣列適配器更新的答案使用ProdSample –