繁体   English   中英

如何将ImageView数组添加到ArrayAdapter以获得Listview

[英]How to add ImageView array to ArrayAdapter for a Listview

我有一个自定义的行布局,其中包含用于列表视图的Imageview和TextView。 我可以将代表每一行的字符串数组添加到ArrayAdater,但无法填充行ImageViews。

我尝试过创建一个ImageView数组并按如下方式添加到ArrayAdaptor中(因为我看不到将两个Arrays作为参数的ArrayAdpter构造函数):

// a string array holding the list items
    String classes[] = { "My Profile", "Splash", "Log A Dive", "Search Dives",
            "Weather: Magic Seaweed", "Irish Tides", "International Tides", "Dive PLanner" };// each class is a menu Actiitem

    ImageView images[]={(ImageView) findViewById(R.drawable.logdive),(ImageView) findViewById(R.drawable.logdive2),
            (ImageView) findViewById(R.drawable.logdive3),
            (ImageView) findViewById(R.drawable.search),(ImageView) findViewById(R.drawable.weather),
            (ImageView) findViewById(R.drawable.tides),(ImageView) findViewById(R.drawable.tides)
            ,(ImageView) findViewById(R.drawable.logdive3)};

ArrayAdapter listadaptor = new ArrayAdapter<String>(MainMenu.this,
                R.layout.single_list_row, R.id.title, classes);
        listadaptor.add(images);
setListAdapter(cutsomAdaptor);

Logcat堆栈跟踪:

01-02 05:10:45.480:E / AndroidRuntime(891):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.mooney.diveapp / com.mooney.diveapp.MainMenu}:java.lang.NullPointerException

我正在分享我的代码,这将有助于解决您的问题..为此,我创建了三个类,第一个是Nameing类。

公共类命名{

int image1;
String name;

public void setImage1(int image1) {
    this.image1 = image1;
}

public int getImage1() {
    return image1;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

第二类是适配器类

公共类适配器扩展BaseAdapter {

ArrayList<Object> item;
public Activity context;
public LayoutInflater inflater;
Context c;

public Adapter(ArrayList<Object> item, Activity context) {

    this.item = item;
    this.context = context;
    this.inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return item.size();
}

@Override
public Object getItem(int position) {
    return item.get(position);
}

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

class ViewHolder {
    ImageView image1;
    TextView name;
}

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

    ViewHolder holder;

    holder = new ViewHolder();
    convertView = inflater.inflate(R.layout.activity_main, null);
    holder.image1 = (ImageView) convertView.findViewById(R.id.image1);
    holder.name = (TextView) convertView.findViewById(R.id.name);

    convertView.setTag(holder);

    holder = (ViewHolder) convertView.getTag();
    final Nameing n = (Nameing) item.get(position);
    holder.image1.setImageResource(n.getImage1());
    holder.name.setText(n.getName());

    holder.name.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(context, n.getName(), Toast.LENGTH_SHORT).show();

        }
    });

    return convertView;

}

}

第三类是MainActivity。

公共类MainActivity扩展了Activity {

private ListView list;

private ArrayList<Object> item = new ArrayList<Object>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    list = (ListView) findViewById(R.id.list1);

    Arraylist();

    Adapter ad = new Adapter(item, MainActivity.this);
    list.setAdapter(ad);

}

private void Arraylist() {
    AddOjectToList1(R.drawable.image1, "name");
    AddOjectToList1(R.drawable.image2, "name");
    AddOjectToList1(R.drawable.image3, "name");
    AddOjectToList1(R.drawable.image4, "name");
    AddOjectToList1(R.drawable.image5, "name");
    AddOjectToList1(R.drawable.image6, "name");
    AddOjectToList1(R.drawable.image7, "name");

}

void AddOjectToList1(int image1, String name) {

    Nameing n = new Nameing();
    n.setImage1(image1);
    n.setName(name);
    item.add(n);
}

}

适配器的重点是将一组数据链接到一组视图(这些视图是由AdapterView创建的,即ListView)-您没有给它提供一组视图。

在这种情况下,您需要覆盖填充布局的ArrayAdapter的getView方法。 您需要一个数据集,该数据集可以表示一个String和一个int(用于可绘制资源ID),类似于Pair (不理想,但为了简单起见):

ArrayList<Pair<String, Integer>> classes = new ArrayList<Pair<String, Integer>>();
classes.add(Pair.create("My Profile", R.drawable.myProfile));
// add all items
ArrayAdapter listadaptor = new ArrayAdapter<Pair<String, Integer>>(MainMenu.this,
            R.layout.single_list_row, R.id.title, classes) {
    public View getView(int position, View convertView, ViewGroup container) {
        if(convertView == null) {
            convertView = LayoutInflator.from(getContext()).inflate(R.layout.single_list_row, container, false);
        }
        TextView title = (TextView) convertView.findViewById(R.id.title);
        Pair<String, Integer> item = getItem(position);
        title.setText(item.first);
        title.setCompoundDrawables(item.second, 0, 0, 0);
        return convertView;
    }
 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM