ListView 中一个 TextView 中的两个数组

Posted

技术标签:

【中文标题】ListView 中一个 TextView 中的两个数组【英文标题】:Two arrays in one TextView in a ListView 【发布时间】:2012-10-22 13:37:44 【问题描述】:

我有一个问题很想得到答案。

我有两个数组,比如说:

String[] name = "Name Nameson", "Second Name";
String[] number = "111 11 111", "222 22 222";

我希望我的 ListView 将两个 TextView 合并到一个项目中。(我试图用图片来说明这一点)。

我设法得到 f.ex。我的名字数组通过一个简单的方法进入列表视图

lv.setAdapter(new ArrayAdapter<String>(this, R.layout.single_name, name));

我的 main.xml 和我的 ListView 在其中,single_name.xml 和 single_number.xml 在我的布局文件夹中。

由于我是这个网站的新手,所以我不允许添加图片,我将在这里尝试说明:


标题


(第一项)

名字Nameson

111 11 111


(第二项)

第二个名字

222 22 222


这取决于联系人的数量。

任何帮助将不胜感激:)

提前致谢!

【问题讨论】:

【参考方案1】:

您将需要构建一个自定义适配器以及一个自定义视图来表示列表中的每一行。

这是一个简单的列表视图适配器示例,其中包含 2 个文本视图和一个图像视图。根据您的需要进行修改以包含您的标题并取出图像视图

package com.aquarius.customlistviewproject;


public class CustomListViewAdapter extends BaseAdapter


 private ArrayList<String> album_names;

private ArrayList<String> num_photos;

 public Activity context;

public LayoutInflater inflater;

 public CustomListViewAdapter(Activity context, ArrayList<String> album_names ,     ArrayList<String> num_photos)

super();
this.album_names = album_names;
this.num_photos = num_photos;
this.context = context;
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);




public Object getItem(int position) 
    // TODO Auto-generated method stub
    return null;


public long getItemId(int position) 
    // TODO Auto-generated method stub
    return 0;


public int getCount() 
    // TODO Auto-generated method stub
    return album_names.size();


public class ViewHolder

    ImageView thumbnail;
    TextView  title;
    TextView photos;


public View getView(int position, View convertView, ViewGroup parent) 

    ViewHolder holder;

    if(convertView == null)
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.listview_row, null);

        holder.thumbnail = (ImageView)convertView.findViewById(R.id.imgViewLogo);
        holder.title = (TextView)convertView.findViewById(R.id.txtViewTitle);
        holder.photos = (TextView)convertView.findViewById(R.id.txtViewDescription);


        convertView.setTag(holder);
    

    else
        holder = (ViewHolder)convertView.getTag();
        holder.thumbnail.setImageResource(R.drawable.imgview_drawable);

        holder.title.setText(album_names.get(position));
        holder.photos.setText(num_photos.get(position));
    return convertView;

【讨论】:

感谢您的快速回复。我还有一个问题。这个类真的会在屏幕上做点什么,还是我需要另一个用这个来更新 UI 的类? 这只是您将用于适配器的代码。您仍然需要一个 Activity 类来负责设置数据源、实例化适配器并将数据设置到列表中。不过,这一切都很简单,幸运的是,哈哈。在我的博客上查看本教程。 jadebyfield.blogspot.com 你可以忽略所有花哨的 xml 东西,只关注适配器类和为你设置一切的活动。希望这对人有所帮助,干杯。 感谢 Jade,我简要浏览了您关于自定义列表视图的博客,实际上它看起来很棒而且很简单。非常感谢! 哇。这是真棒玉。再次非常感谢。花了我一小时又一小时搜索的东西在你的博客上完成得如此简单。【参考方案2】:

您必须构建自己的适配器。

你可以修改这个以供你使用,它使用viewholder模式来提高性能。

public class WifiListAdapter extends BaseAdapter 

    private ArrayList<Wifi> entries;
    private Location location;
    private boolean withDistance;

    public static class ViewHolder
        public TextView ssid;
        public TextView crypt;
        public TextView distance;

    

    public WifiListAdapter(ArrayList<Wifi> entries, Location location) 
        this.entries = entries;
        this.location = location;
        withDistance = true;
    

    public int getCount() 
        return entries.size();
    

    public Wifi getItem(int position) 
        return entries.get(position);
    


    public long getItemId(int position) 
        return position;
    

    public View getView(int position, View convertView, ViewGroup parent) 
        View vi = convertView;
        ViewHolder holder;
        if(convertView == null)
            vi =  MyApplication.getLayoutInflater().inflate(R.layout.wifi_list_item, null);
            holder = new ViewHolder();
            holder.ssid = (TextView)vi.findViewById(R.id.wifi_list_ssid);
            holder.crypt = (TextView)vi.findViewById(R.id.wifi_list_crypt);
            holder.distance = (TextView)vi.findViewById(R.id.wifi_list_distance);

            vi.setTag(holder);


        
        else
            holder = (ViewHolder)vi.getTag();
        
        Wifi wifi = entries.get(position);

        holder.ssid.setText(wifi.ssid);

        StringBuilder cryptString = new StringBuilder(20);

        if(wifi.wep == 1)
            cryptString.append("WEP ");
        if(wifi.wpa == 1)
            cryptString.append("WPA ");
        if(wifi.wpa2 == 1)
            cryptString.append("WPA2 ");
        if(wifi.wps == 1)
            cryptString.append("WPS ");
        if(wifi.ess == 1)
            cryptString.append("ESS");


        String distanceString;
        if(withDistance) 
            float[] results = new float[1];
            Location.distanceBetween(location.getLatitude(), location.getLongitude(), wifi.lat, wifi.lng, results);
            distanceString = MyApplication.formatDistance(results[0]);
         else
            distanceString = "unknown";

        holder.distance.setText(distanceString);

        holder.crypt.setText(cryptString.toString().trim());
        //holder.distance.setText(results[0] + "");


        holder.ssid.setTag(position);
        holder.crypt.setTag(position);
        holder.distance.setTag(position);


        return vi;
    


【讨论】:

【参考方案3】:

你需要创建一个自定义的适配器

ArrayAdapter<HashMap<String,String>>

【讨论】:

以上是关于ListView 中一个 TextView 中的两个数组的主要内容,如果未能解决你的问题,请参考以下文章

动态更改 ListView 中的 TextView 字体颜色

ListView 中的可选 TextView(缺少动画)

ListView 不可点击,行中的所有小部件都是 TextView

如何将数据从一个 Activity 中的 ListView 传递到另一个 Activity 上的 TextView?

为 ListView 的多行中的多个 TextView 设置 onClickListener

遍历 ListView 中的所有 TextView