从基本图库加载图像到自定义列表视图中的图像视图/

时间:2015-08-05 16:55:48

标签: android listview imageview

首先,我很抱歉我的英语不好。请原谅我。 :)..

我尝试制作一个自定义listView,其中包含ImageView,TextViews和Button。 因此,我想在listview中单击ImageView并从库中选择图像后更改图像。但是......对我来说真的很难。

在我的代码(customAdapter)中,Adapter类不是Activity,所以它不能直接调用startActivityForResult。所以我创建了新的Activity(它是GalleryImage.java)。并使用该类调用startActivity。但它没有用。我该怎么办......

(ImageView.setOnClickListner,PhoneBookAdapter的getView出现错误)

CustomAdapter源代码

//..skip import

public class PhoneBookAdapter extends BaseAdapter implements Filterable {

    ArrayList<Contact> m_people = new ArrayList<Contact>();
    ArrayList<Contact> m_filteredPeople = new ArrayList<Contact>();

    private ItemFilter mFilter = new ItemFilter();

    private class CustomHolder {

        ImageView m_photo;
        TextView m_name, m_phone;
        Button m_call, m_reserve;
    }

    public PhoneBookAdapter(ArrayList<Contact> people) {

        m_people = people;
        m_filteredPeople = people;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

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

        // final int pos = position;
        final Context context = parent.getContext();
        final TextView phone;
        final ImageView photo;
        TextView name;
        Button call, reserve;
        final int pos = position;

        CustomHolder holder = null;
        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.phonebook_list_item, parent,
                    false);

            photo = (ImageView) convertView.findViewById(R.id.iv_photo);
            name = (TextView) convertView.findViewById(R.id.tv_name);
            phone = (TextView) convertView.findViewById(R.id.tv_phonenumber);
            call = (Button) convertView.findViewById(R.id.btn_call);
            reserve = (Button) convertView.findViewById(R.id.btn_reserve);

            holder = new CustomHolder();
            holder.m_photo = photo;
            holder.m_name = name;
            holder.m_phone = phone;
            holder.m_call = call;
            holder.m_reserve = reserve;

            convertView.setTag(holder);
        } else {
            holder = (CustomHolder) convertView.getTag();

            photo = holder.m_photo;
            name = holder.m_name;
            phone = holder.m_phone;
            call = holder.m_call;
            reserve = holder.m_reserve;
        }

        //photo.setImageResource(m_filteredPeople.get(position).getImage());
        name.setText(m_filteredPeople.get(position).getName());
        phone.setText(m_filteredPeople.get(position).getNumber());

        photo.setOnClickListener(new OnClickListener() {

            Activity activity;
            int SELECT_IMAGE=90;
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(Intent.ACTION_PICK);                
                intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
                intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                GalleryImage gallery = new GalleryImage(SELECT_IMAGE, photo);
                gallery.startActivityForResult(intent, SELECT_IMAGE);

            }
        });

        call.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO make real phone call

                Toast.makeText(context, "call " + phone.getText(),
                        Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Intent.ACTION_CALL, Uri
                        .parse("tel:" + m_filteredPeople.get(pos).getNumber()));
                context.startActivity(intent);

            }
        });


        reserve.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "reserve " + phone.getText(),
                        Toast.LENGTH_SHORT).show();
            }
        });

        return convertView;
    }


    @Override
    public Filter getFilter() {
        return mFilter;
    }

    private class ItemFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString();
            FilterResults results = new FilterResults();
            final ArrayList<Contact> m_IFpeople = m_people;
            int count = m_IFpeople.size();
            final ArrayList<Contact> n_people = new ArrayList<Contact>();
            String filterableString;

            if (filterString != null
                    && filterString.trim().equalsIgnoreCase("") != true) {
                // Whitespace와 null 제거

                // for (int i = 0; i < count; i++) {
                // filterableString = m_IFpeople.get(i).getName();
                // if (filterableString.indexOf(filterString) >= 0) {
                // n_people.add(m_IFpeople.get(i));
                // }
                // }

                for (int i = 0; i < count; i++) {
                    filterableString = HangulUtils.getHangulInitialSound(
                            m_IFpeople.get(i).getName(), filterString);

                    if (filterableString.indexOf(filterString) >= 0) {
                        n_people.add(m_IFpeople.get(i));
                    }
                }

                results.values = n_people;
                results.count = n_people.size();
            } else {
                results.values = m_IFpeople;
                results.count = m_IFpeople.size();
            }

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {

            m_filteredPeople = (ArrayList<Contact>) results.values;
            notifyDataSetChanged();
        }
    }
}

GalleryImage.java(新活动)

//..skip import
public class GalleryImage extends Activity {

    final int REQ_CODE_SELECT_IMAGE;
    ImageView photo;

    public GalleryImage(int codeImage, ImageView m_photo) {
        REQ_CODE_SELECT_IMAGE = codeImage;
        photo = m_photo;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Intent intent = new Intent(Intent.ACTION_PICK);
        // intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
        // intent.setData(
        // android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        // startActivityForResult(intent, REQ_CODE_SELECT_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQ_CODE_SELECT_IMAGE && resultCode == Activity.RESULT_OK
                && data != null) {
            final Uri selectImageUri = data.getData();
            final String[] filePathColumn = { MediaStore.Images.Media.DATA };

            final Cursor imageCursor = this.getContentResolver()
                    .query(selectImageUri, filePathColumn, null, null, null);

            final int columnIndex = imageCursor.getColumnIndex(filePathColumn[0]);
            final String imagePath = imageCursor.getString(columnIndex);
            imageCursor.close();

            final Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        }
    }
}

感谢您的帮助。 :d

1 个答案:

答案 0 :(得分:0)

此处的解决方案不是创建Activity的新实例,而是能够访问Android Framework创建的现有实例。应用程序员永远不应该创建Activity的实例。

最佳方法是将Activity类型的参数添加到PhoneBookAdapter的构造函数中。如:

private Activity activity;

public PhoneBookAdapter(Activity activity, ArrayList<Contact> people) {
    this.activity = activity;
    m_people = people;
    m_filteredPeople = people;
}

您可以在此activity.startActivityForResult的实例上致电Activity

然后在创建适配器时传入Activity的实例。在Activity中,您只需传递此内容,在Fragment中,您可以通过调用getActivity()类的Fragment方法来获取实例。

至于处理已启动Activity的结果,您需要在显示列表的ActivityFragment中实现此功能。