从自定义适配器访问ArrayList

时间:2012-08-28 02:07:59

标签: java android arraylist

我要做的是从列表视图的客户适配器访问我的主要活动中的ArrayList。

我有一个listview,我正在点击,我在客户适配器(onclick所在的位置)中完成了。当用户点击它时,他们将输入一个标题(文本),它将更新主活动中的一个arraylist(字符串)。

我已经阅读了关于这个主题的一些其他问题,但我对如何使这项工作感到迷茫。

我没有看到发布代码片段的必要,因为它只是一个基本的arraylist(字符串)和listview的自定义适配器。如果需要代码我可以发布。谢谢!

这是适配器代码的一部分:

public class PhotoAdapter extends ArrayAdapter<Photo> {

    private final ArrayList<Photo> objects;

    public PhotoAdapter(Context context, int textViewResourceId,
            ArrayList<Photo> objects) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Photo i = objects.get(position);
        View v = convertView;

        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.listview_row, null);
                v.setClickable(true);
                v.setFocusable(true);
        }

以下是主要活动的代码

public ArrayList<Photo> m_photos = new ArrayList<Photo>();
public ArrayList<String> m_photo_captions = new ArrayList<String>();
private PhotoAdapter m_adapter;

this.list1 = (ListView) findViewById(R.id.lstPhotos);
        m_adapter = new PhotoAdapter(this, R.layout.listview_row, m_photos);
        LayoutInflater infalter = getLayoutInflater();
list1.setAdapter(m_adapter);

if (Intent.ACTION_SEND_MULTIPLE.equals(action)
                && intentGallery.hasExtra(Intent.EXTRA_STREAM)) {
            ArrayList<Parcelable> list = intentGallery
                    .getParcelableArrayListExtra(Intent.EXTRA_STREAM);
            for (Parcelable p : list) {
                Uri uri = (Uri) p;
                imagePath = getPath(uri);
                m_photos.add(new Photo(imagePath, ""));
                m_photo_locations.add(imagePath);
                m_photo_captions.add("");
                m_adapter.notifyDataSetChanged();
            }
        }

onclick听众

    list1.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            // Do whatever you want with m_photo_captions here
            Log.v("listview", "listview item clicked");
            appErrorAlert("test", "test");
        }
    });

2 个答案:

答案 0 :(得分:3)

您可以将要访问的ArrayList定义为全局实例变量,这样您就可以从自定义适配器中访问它。

如果您为问题提供了代码段,那也会很有帮助。

答案 1 :(得分:1)

现在您已经发布了代码,我建议采用与Mohamed A. Karim不同的方法。


您正试图在OnClickListener的整行上设置简单Adapter,但访问您的活动成员。为什么不在OnItemClickListener中设置一个ListView,而list1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // Do whatever you want with m_photo_captions here } }); 已经可以访问您想要的列表?

ListView

接下来删除阻止触摸事件到达getView()之前的所有内容。您还可以使public class PhotoAdapter extends ArrayAdapter<Photo> { LayoutInflater mInflater; public PhotoAdapter(Context context, int textViewResourceId, ArrayList<Photo> objects) { super(context, textViewResourceId, objects); mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { final Photo i = get(position); View v = convertView; if (v == null) { v = mInflater.inflate(R.layout.listview_row, null); // Initialize your ViewHolder here! } // Update your TextViews, ImageViews, etc here ... } } 更小更快,如下所示:

{{1}}

希望有所帮助!