动态添加项目使用自定义适配器Android应用程序,以列表视图 [英] Dynamically add items to list view using custom adapter for Android app

查看:138
本文介绍了动态添加项目使用自定义适配器Android应用程序,以列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,现在我有一个自定义的适配器类,它的位置阵列,并将它们添加到ListView。这是所有罚款和花花公子,但我想这个初始化后的位置添加到这个列表视图。例如,有人可以添加位置,它会添加到该ListView控件。这是我的主要活动:

 包com.example.listviewtest;

进口android.app.Activity;
进口android.os.Bundle;
进口android.view.View;
进口android.widget.ListView;

公共类MainActivity延伸活动{

私人ListView控件ListView1的;

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    地点location_data [] =新的位置[]
    {
        新的位置(R.drawable.ic_launcher,位置1,水果!,2万里行,8-4周一至周五\ nclosed太阳),
        新的位置(R.drawable.ic_launcher,位置2,素食者!,2万里行,8-5),
        新的位置(R.drawable.ic_launcher,位置3,植物!,2万里行,8-5),
        新的位置(R.drawable.ic_launcher,位置4,花!,2万里行,8-5),
        新的位置(R.drawable.ic_launcher,位置5,烘焙食品!,2万里行,8-5)
    };

   LocationAdapter适配器=新LocationAdapter(这一点,
            R.layout.listview_item_row,location_data);

   //adapter.add(new位置(R.drawable.ic_launcher,位置6,素食者!,2万里行,8-5));


    是ListView1 =(ListView控件)findViewById(R.id.listView1);

    查看标题=(查看)getLayoutInflater()膨胀(R.layout.listview_header_row,空)。
    listView1.addHeaderView(头);

    listView1.setAdapter(适配器);
}
}
 

这工作。我想现在做这样的事情 adapter.add(新位置(R.drawable.ic_launcher,位置6,素食者!,2万里行,8-5)); 的阵列填充之后。

下面是我的LocationAdapter类:

 包com.example.listviewtest;

进口android.app.Activity;
进口android.content.Context;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.ArrayAdapter;
进口android.widget.ImageView;
进口android.widget.TextView;

公共类LocationAdapter扩展ArrayAdapter<地点> {

上下文语境;
INT layoutResourceId;
位置数据[] = NULL;

公共LocationAdapter(上下文的背景下,INT layoutResourceId,位置[]数据){
    超级(上下文,layoutResourceId,数据);
    this.layoutResourceId = layoutResourceId;
    this.context =背景;
    this.data =数据;
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    查看排= convertView;
    LocationHolder支架=无效;

    如果(行== NULL)
    {
        LayoutInflater充气=((活动)上下文).getLayoutInflater();
        行= inflater.inflate(layoutResourceId,父母,假);

        持有人=新LocationHolder();
        holder.imgIcon =(ImageView的)row.findViewById(R.id.imgIcon);
        holder.txtTitle =(TextView中)row.findViewById(R.id.txtTitle);
        holder.details =(TextView中)row.findViewById(R.id.details);
        holder.distance =(TextView中)row.findViewById(R.id.distance);
        holder.hours =(TextView中)row.findViewById(R.id.hours);

        row.setTag(保持器);
    }
    其他
    {
        支架=(LocationHolder)row.getTag();
    }

    位置的位置=数据[位置]
    holder.txtTitle.setText(location.title);
    holder.imgIcon.setImageResource(location.icon);
    holder.details.setText(location.details);
    holder.distance.setText(location.distance);
    holder.hours.setText(location.hours);

    返回行;
}

静态类LocationHolder
{
    ImageView的imgIcon;
    TextView的txtTitle;
    TextView的细节;
    TextView的距离;
    TextView的时间;
}
}
 

我如何能够实现这个任何想法?谢谢你。

解决方案
  1. 在您的适配器改变位置从阵列数据[]到 ArrayList和重写适当的构造
  2. 在 活动中,让您的可变数据的字段(ArrayList类型
  3. 当你添加一个位置,您可以使用data.add(位置)
  4. 然后你可以在你的适配器上调用notifyDatasetChanged()

例如code:<一href="http://androidadapternotifiydatasetchanged.blogspot.in/">http://androidadapternotifiydatasetchanged.blogspot.in/

So, right now I have a custom adapter class that takes in an array of Locations and adds them to a ListView. This is all fine and dandy, but I would like to add Locations to this listview after this initialization. For example, someone can "add a Location" and it will add it to this ListView. Here is my Main Activity:

package com.example.listviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;

public class MainActivity extends Activity {

private ListView listView1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Location location_data[] = new Location[]
    {
        new Location(R.drawable.ic_launcher, "Location 1", "Fruit!", "2 miles", "8-4 mon-fri\nclosed sun"),
        new Location(R.drawable.ic_launcher, "Location 2", "Veggies!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 3", "Plants!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 4", "Flowers!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 5", "Baked Goods!", "2 miles", "8-5")
    };

   LocationAdapter adapter = new LocationAdapter(this, 
            R.layout.listview_item_row, location_data);

   //adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5"));


    listView1 = (ListView)findViewById(R.id.listView1);

    View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);
    listView1.addHeaderView(header);

    listView1.setAdapter(adapter);
}
}

This works. I want to now do something like adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5")); AFTER filling it with the array.

Here is my LocationAdapter class:

package com.example.listviewtest;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class LocationAdapter extends ArrayAdapter<Location>{

Context context; 
int layoutResourceId;    
Location data[] = null;

public LocationAdapter(Context context, int layoutResourceId, Location[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    LocationHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new LocationHolder();
        holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
        holder.details = (TextView)row.findViewById(R.id.details);
        holder.distance = (TextView)row.findViewById(R.id.distance);
        holder.hours = (TextView)row.findViewById(R.id.hours);

        row.setTag(holder);
    }
    else
    {
        holder = (LocationHolder)row.getTag();
    }

    Location location = data[position];
    holder.txtTitle.setText(location.title);
    holder.imgIcon.setImageResource(location.icon);
    holder.details.setText(location.details);
    holder.distance.setText(location.distance);
    holder.hours.setText(location.hours);

    return row;
}

static class LocationHolder
{
    ImageView imgIcon;
    TextView txtTitle;
    TextView details;
    TextView distance;
    TextView hours;
}
}

Any ideas on how I can implement this? Thanks.

解决方案

  1. In your adapter change the Locations data[] from array to ArrayList and override the appropriate constructor
  2. In your activity, make your variable data a field (type ArrayList
  3. When you add a location you can use data.add(location)
  4. Then you can call notifyDatasetChanged() on your adapter

Example code: http://androidadapternotifiydatasetchanged.blogspot.in/

这篇关于动态添加项目使用自定义适配器Android应用程序,以列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆