2012-11-08 25 views
0

我正在尝试创建一个listView,以便列表中的每个项目由TextView和一个(或多个)ImageView组成。使用带有组合元素的listView

到目前为止,我设法让listView与使用ArrayList<String>ArrayAdapter<String>适配器仅TextViews项目工作。

有没有办法实现我想要的?其他方式会更容易吗? (就像使用TableRows一样,但我不确定它们是否可以配置为具有onClickListener)

回答

1

用这样的布局创建`list_items.xml`:

<LinearLayout 
    android:orientation="horizontal" 
    [...] 
    <ImageView 
     [...] 
     android:id="@+id/myimage"/> 
    <TextView 
     [...]    
     android:id="@+id/mytext"/> 
</LinearLayout> 

然后创建一个BaseAdapter:

class MyAdapter extends BaseAdapter { 

    private Context context; 
    private LayoutInflater inflater; 
    private ViewHolder holder; 
    private ArrayList<HashMap<String, String>> data; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> data) { 
     this.context = context; 
     this.data = data; 
     inflater = LayoutInflater.from(context); 
    } 

    // Below the Magic 
    public View getView(int position, View convertView, ViewGroup parent) { 
     inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

      if(convertView == null || convertView.getTag() == null) { 
       // Here you load the list_items.xml an inflate your Layout with it 
       convertView = inflater.inflate(R.layout.list_items, null); 

       holder = new ViewHolder(); 
       holder.text = (TextView) convertView.findViewById(R.id.mytext); 
       holder.image = (ImageView) convertView.findViewById(R.id.myimage); 

       convertView.setTag(holder); 

      } else {    
       holder = (ViewHolder) convertView.getTag(); 
      } 

      // We get the HashMap for our current Position in the ListView 
      row = data.get(position); 

      if(row != null) { 
       holder.text.setText(row.get("test")); 
       // Below could be setImageBitmap, setImageResource,... 
       // depends on how you get your image 
       holder.image.setImageBitmap(getImage(row.get("image")); 
      } 

      return convertView; 
     } 

     class ViewHolder { 
      TextView text; 
      ImageView image; 
     } 

} 

public getImage(String image) { 
     // Get your image from where you want it SD, drawable, internet) 
} 

的称呼它:

MyAdapter myAdapter = new MyAdapter(this, data); 
myListView.setAdapter(myAdapter); 

我我假设你将数据传递给一个包含每行HashMap的ArrayList:

#ListItem1 = data(0) - data.get(0).get("title"), data.get(0).get("image") 
    #ListItem2 = data(1) - data.get(1).get("title"), data.get(1).get("image") 
2

您应该使用自定义List视图。 http://www.androidpeople.com/android-custom-listview-tutorial-part-1。看看链接。

@Override 
    public int getItemViewType(int position) 
    { 
    int type; 
    if (ID.get(position)== 0){ 
    type = TYPE_ITEM1; //type 0 for image 
    } 
    else if (ID.get(position) == 1){ 
    type = TYPE_ITEM2; //type 1 for text 
    }else { 
    type = TYPE_ITEM3; //type 2 for videos 
} 
return type; 
} 
@Override 
    public int getViewTypeCount() { 
return 3; //three different layouts to be inflated 
} 
1

您可以通过提供您的ListView的Arraydapter自定义视图(你可以扩展一个ArrayAdapter来创建你自己的)。在另一个问题上,是的,可以使TableRows可点击(例如,您可以在XML布局文件中执行此操作)。