2016-12-27 34 views
0

我正努力從自定義列表中獲取不止一個值。
由於getItem(int pos),我可以從中獲得「主」值,但由於我爲一行存儲了多個值(行的意思是CustomListTableView中),我希望能夠獲得相應的值到我能夠拔出的標籤。從類擴展獲取ListView自定義朋友ArrayAdapter

我敢肯定,這比我做的更簡單,所以我希望以前有人做過。

我有一個CustomList類,

public class CustomList extends ArrayAdapter<String>{ 

    private final Activity context; 
    private final String[] labels; 
    private final Integer[] imageId; 
    private final String[] identifier; 
    public CustomList(Activity context, 
         String[] labels, Integer[] imageId, String[] id) { 
     super(context, R.layout.list_single, labels); 
     this.context = context; 
     this.labels = labels; 
     this.imageId = imageId; 
     this.identifier = id; 

    } 
    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView= inflater.inflate(R.layout.list_single, null, true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) rowView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 

     txtTitle.setText(labels[position]); 
     idTitle.setText(identifier[position]); 
     imageView.setImageResource(imageId[position]); 

     return rowView; 
    } 

    public String getKey(int position, int category) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView= inflater.inflate(R.layout.list_single, null, true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) rowView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 

     if (category == 1) { 
      return idTitle.getText().toString(); 
     } else if (category == 2) { 
      return "url:();"; 
     } else { 
      return this.getItem(position); 
     } 
    } 
} 

注意getKey是越來越值超出這個ListView/CustomList數據的累了,最後一次嘗試。
我不能因爲它的愛而以任何方式,形狀或形式調用該函數。

下面是我如何使用這個CustomList

CustomList adapter = new 
        CustomList(MainActivity.this, urls, images, identifiers); 
list=(ListView)findViewById(R.id.listView1); 
list.setAdapter(adapter); 

相當直截了當,現在後面的代碼 - 更具體的一個按鈕 - 我想訪問存儲在表中的數據。
我做這樣做如下:

(這是我碰到一個腦筋急轉彎)

list=(ListView)findViewById(R.id.listView1); 
ListView listView = (ListView)findViewById(R.id.listView1); 
ListAdapter table = listView.getAdapter(); 

for(int i = 0; i < table.getCount(); i++){ 
    Object row = table.getItem(i); 
    Log.i("Test", row.toString()); 
} 

我走出這是CustomList.labels[i]價值,這是不是所有的奇因爲我認爲這調用ArrayAdaptergetItem

我試着在getItem上做一個@Override,但是因爲它只需要一個參數,那就是position,我對Java的熟悉程度不夠,無法爲我工作。

任何想法我怎麼能得到listView1的每個行項目的imageIdidentifier變量?

如果你需要的list_single.xml這是listView1佈局(至少,這是我的這是什麼文件不解釋),那就是:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <TableRow> 
     <ImageView 
      android:id="@+id/img" 
      android:layout_width="50dp" 
      android:layout_height="50dp"/> 

     <TextView 
      android:id="@+id/identifier" 
      android:layout_width="wrap_content" 
      android:visibility="invisible" 
      android:layout_height="50dp" /> 

     <TextView 
      android:id="@+id/txt" 
      android:layout_width="wrap_content" 
      android:layout_height="50dp" /> 

    </TableRow> 
</TableLayout> 

回答

1

在這種情況下BaseAdapter比ArrayAdapter更好的選擇。

您可以在您的案例中創建帶有3個字段的域模型,在適配器內定義此模型的數組並從getItem中返回它們。

實現示例: https://guides.codepath.com/android/Using-a-BaseAdapter-with-ListView

在你的情況下,它會是這樣的

public class CustomListAdapter extends BaseAdapter { 

    public class DataObject { 
     private final String label; 
     private final Integer imageId; 
     private final String identifier; 

     public DataObject() {} 

     public DataObject(String label, Integer imageId, String identifier) { 
      this.label = label; 
      this.imageId = imageId; 
      this.identifier = identifier; 
     } 

     public String getLabel() { 
      return label; 
     } 

     public Integer getImageId() { 
      return imageId; 
     } 

     public String getIdentifier() { 
      return identifier; 
     } 
    } 


    private Context context; //context 
    private ArrayList<DataObject> items; //data source of the list adapter 

    //public constructor 
    public CustomListAdapter(Context context, ArrayList<DataObject> items) { 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); //returns total of items in the list 
    } 

    @Override 
    public DataObject getItem(int position) { 
     return items.get(position); //returns list item at the specified position 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // inflate the layout for each list row 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context). 
        inflate(R.layout.list_single, parent, false); 
     } 

     // get current item to be displayed 
     DataObject currentItem = getItem(position); 

     // get the TextView for item name and item description 
     TextView txtTitle = (TextView) convertView.findViewById(R.id.txt); 
     TextView idTitle = (TextView) convertView.findViewById(R.id.identifier); 
     ImageView imageView = (ImageView) convertView.findViewById(R.id.img); 

     //sets the text for item name and item description from the current item object 
     txtTitle.setText(currentItem.label); 
     idTitle.setText(currentItem.identifier); 
     imageView.setImageResource(currentItem.imageId); 

     // returns the view for the current row 
     return convertView; 
    } 
} 

UPDATE:

如果你仍然想從3個陣列可以使用構造適配器像這樣的附加構造函數。但也許更好地改變數據模型中的某些東西

public CustomList(Activity context, 
        String[] labels, Integer[] imageId, String[] id) { 
    this.context = context; 
    this.items = new ArrayList(labels.length); 

    for (int i = 0; i < labels.length; i++) { 
     this.items.add(new DataObject(labels[i], imageId[i], id[i])); 
    } 
} 
+0

可以提高使用ViewHolder模式這一解決方案https://developer.android.com/training/improving-layouts/smooth-scrolling.html# ViewHolder或RecyclerView –

+0

在問了一個愚蠢的問題後,我寫了一分鐘。這可能是一個很長的解決方法,但這裏是我做的:ArrayList itemsArrayList = new ArrayList (); CustomListAdapter moo = new CustomListAdapter(MainActivity.this,itemsArrayList); moo.getItem(0).getLabel();' - 如果有人想知道。 – Torxed

+0

好的不,我仍然不知道如何用實際的值來初始化它...如何/我在哪裏放置我的初始'String []標籤'例如? – Torxed

0

Java是面向對象的。製作對象。

class DataObject { 
    private final String label; 
    private final Integer imageId; 
    private final String identifier; 

    public DataObject() {} 
} 

使用public class CustomList extends ArrayAdapter<DataObject>{

您可選擇店內DataObject[]或更好List<DataObject>,但現在的getItem可以返回整個對象,然後把你從那些數據。

您可以使用adapter.add直接將數據添加到適配器/列表視圖