【问题标题】:Access ArrayList from Custom Adapter从自定义适配器访问 ArrayList
【发布时间】:2012-08-28 02:07:59
【问题描述】:

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

我有一个可以点击的列表视图,这是我在客户适配器(onclick 所在的位置)中完成的。当用户单击它时,他们将输入一个标题(文本),它将更新主活动中的一个数组列表(字符串)。

我已经阅读了有关此主题的其他一些问题,但我不知道如何使这项工作发挥作用。

我没有看到需要发布代码 sn-p 因为它只是一个基本的数组列表(字符串)和一个列表视图的自定义适配器。如果需要代码,我可以发布。谢谢!

这里部分适配器代码:

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();
            }
        }

点击监听

    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");
        }
    });

【问题讨论】:

  • 你具体想做什么?您是否尝试将值传递给适配器或其他东西?
  • 基本上我有一个显示照片缩略图和标题文本的列表视图,我需要使列表视图可点击(已经完成),点击它会创建一个对话框,用户可以在其中输入标题。当用户在对话框上单击确定时,它将使用输入的标题更新主活动中的数组列表,然后更新列表视图以反映添加的标题。

标签: java android arraylist


【解决方案1】:

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

如果您为您的问题提供了代码 sn-p 也会很有帮助。

【讨论】:

    【解决方案2】:

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


    您正在尝试在您的Adapter 的整行上设置一个简单的OnClickListener,但可以访问您的活动成员。为什么不在你的ListView 中设置一个OnItemClickListener,它已经可以访问你想要的列表?

    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
            ...
        }
    }
    

    希望有帮助!

    【讨论】:

    • 我在尝试您的建议时收到此错误。 The method setOnItemClickListener(AdapterView.OnItemClickListener) in the type AdapterView&lt;ListAdapter&gt; is not applicable for the arguments (new OnItemClickListener(){})
    • 您是否导入了相应的文件? import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;(在 Eclipse 中只需按 Ctrl+Shift+O。)
    • 谢谢,我认为 Eclipse 已经为我做了这件事......我们知道假设的作用。谢谢!
    • 因此代码编译但应用程序无法识别我对列表视图的点击。想法?
    • 不识别是什么意思?请发布您的 OnItemClickListener。
    猜你喜欢
    • 2011-02-14
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多