【问题标题】:How do I create an ArrayList of imges from drawable and display it in fragment ListView?如何从 drawable 创建图像的 ArrayList 并将其显示在片段 ListView 中?
【发布时间】:2016-01-12 21:23:49
【问题描述】:

我在片段中有图像,我想在片段ListView 中显示。

这是我尝试过的,你能猜出我的代码有什么问题吗?

我制作了一个整数 ArrayList 的可绘制图像

 ArrayList<Integer> ex1 = new ArrayList<Integer>();
    ex1.add(R.drawable.a);
    ex1.add(R.drawable.b);
    ex1.add(R.drawable.c);
    ex1.add(R.drawable.d);

并尝试将其传递给片段,就像我们传递任何 String ArrayList 一样

我在这样的主要活动中声明

public static final String Data = "list";

然后

    bundle = new Bundle();
    bundle.putIntegerArrayList(DATA, ex1);
    Fragment fragment = new ExFragment();
    fragment.setArguments(arguments);
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.replace(R.id.container, fragment);
    ft.addToBackStack("");
    ft.commit();

然后在片段类中

private ArrayList<Integer> images = new ArrayList<>();

在片段的创建中

 if (getArguments() != null) {
        images = getArguments().getIntegerArrayList(MainMenu.DATA);
    }

在 oncreateview 中

View rootView = inflater.inflate(R.layout.fragment_ex, container, false);
    ListView listView = (ListView) rootView.findViewById(R.id.listview);
    ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, R.id.text1, images);
    listView.setAdapter(adapter);

但它给了我NullPointerException

java.lang.NullPointerException
         at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:395)
         at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
         at android.widget.AbsListView.obtainView(AbsListView.java:2724)
         at android.widget.ListView.makeAndAddView(ListView.java:1811)
         at android.widget.ListView.fillDown(ListView.java:697)
         at android.widget.ListView.fillFromTop(ListView.java:763)
         at android.widget.ListView.layoutChildren(ListView.java:1641)
         at android.widget.AbsListView.onLayout(AbsListView.java:2549)
         at android.view.View.layout(View.java:15762)
         at android.view.ViewGroup.layout(ViewGroup.java:4867)

如果我从 Integer 更改为 String 并放入 String ArrayList,则此代码与 Strign ArrayList 完美搭配

【问题讨论】:

  • 尝试使用 android.R.id.text1 作为 ArrayAdapter 构造函数中的第三个参数
  • @daentech 它适用于字符串数组,尽管如此
  • 我想你忘了打电话给fragment.setArguments(bundle);
  • @Rami 我确实调用了它,它错过了复制粘贴在这里,很抱歉让我更新问题。

标签: java android listview android-fragments arraylist


【解决方案1】:

Java 类自定义适配器

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter{

    String [] Text;
    int [] Image;
    Context context;

    private static LayoutInflater inflater=null;
    public CustomAdapter(MainActivity mainActivity, String[] TextItem, int[] mainImages) {
        Text = TextItem;
        context = mainActivity;
        Image = mainImages;
        inflater = ( LayoutInflater )context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    // Get number of items in list
    public int getCount() {
        return Text.length;
    }

    @Override
    // Get position of item in list
    public Object getItem(int position) {
        return position;
    }

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

    public class Holder
    {
        TextView tv;
        ImageView img;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        Holder holder=new Holder();
        View rowView;

        rowView = inflater.inflate(R.layout.YOURCUSTOMXML, null);

        /** Get relevant view
         * Set image/text resource, based on list name, based on list position
         */
        holder.img=(ImageView) rowView.findViewById(R.id.IMAGEIDINCUSTOMXML);
        holder.img.setImageResource(Image[position]);

        holder.tv=(TextView) rowView.findViewById(R.id.TEXTIDINCUSTOMXML);
        holder.tv.setText(Text[position]);

        return rowView;
    }

}

此类让您可以使用自定义 XML 布局创建自己的 ListAdapter。
当您将适配器加载到 ListView 时,您可以在片段中调用它而不是 android.R.layout.simple_list_item_1

【讨论】:

  • 非常感谢您的努力,但是如果我只想一个接一个地显示几张图片,我的自定义 xml 应该包含什么?
  • @Anders 列表适配器获取单个 XML 文件并将其重新用于每个项目。因此,无论您希望单个项目看起来像什么。我的只是ImageViewTextView 内的TextView(我从线性更改)。我将背景设置为与我的活动不同的颜色。另外:如果您想根据项目的位置处理点击,我认为您最终将不得不使用此方法。
  • 所以我可以在 xml 中定义一个 ImageView 并将其放入 IMAGEIDINCUSTOMXML 中?非常感谢 :) 我会尽快处理它,并会回来找你,我真的很感谢你的努力 :) 我创建可绘制的 Arraylist 并将其传递给片段的方式是否正确?
  • 我不太了解片段,因为我还没有使用过它们。但是,如果您可以将原始列表加载到片段中,您应该也可以这样做,因为这只是同一事物的定制版本。但是,是的。还有三件事: 1. 如果您根本不使用任何文本,您将需要从适配器中取出文本内容,否则您将获得另一个异常。 2. 您可以随意命名您的 XML,只要确保将 YOURCUSTOMXML 替换为 XML 名称即可。并确保无论您的ImageView id 是什么,都用它替换IMAGEIDINCUSTOMXML
  • and 3: 'int[] mainImages' 从您的listview 显示的活动中调用。您可能必须将适配器中mainimages 的名称更改为您@ 987654334@ 在您的活动中。 (ex1 再次查看您的代码。)
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多