Android 图像Uri未显示在listview和警报对话框中

Android 图像Uri未显示在listview和警报对话框中,android,listview,Android,Listview,谢谢你阅读我的问题。因为我的问题是图像uri没有显示,所以我确保上传的小尺寸图像不超过6KB。所以这里的问题不是图像的大小 我在下面有一个屏幕截图,让您对这里发生的事情有一个大致的了解: 这是我的AddStudent.xml,允许用户添加新项目 添加的项目将显示在my Main活动的列表视图中。如你所见,我先添加了安吉丽娜·朱莉,图像仍在附件中,当我添加另一个名叫布拉德·皮特的人时,第一张图像没有显示,以此类推。只有最后添加的项目才会显示图像 当我尝试筛选搜索时,列表中的所有图像都不会显示。我有

谢谢你阅读我的问题。因为我的问题是图像uri没有显示,所以我确保上传的小尺寸图像不超过6KB。所以这里的问题不是图像的大小

我在下面有一个屏幕截图,让您对这里发生的事情有一个大致的了解:

这是我的AddStudent.xml,允许用户添加新项目

添加的项目将显示在my Main活动的列表视图中。如你所见,我先添加了安吉丽娜·朱莉,图像仍在附件中,当我添加另一个名叫布拉德·皮特的人时,第一张图像没有显示,以此类推。只有最后添加的项目才会显示图像

当我尝试筛选搜索时,列表中的所有图像都不会显示。我有一个上下文菜单,当用户长按该项时,将显示一个显示、编辑和删除选项

问题还在于,当我显示项目时,图像不在那里,以及当我编辑时。setImageUri似乎不起作用

你能告诉我我做错了什么以及如何解决它吗?谢谢

AddStudentActivity.java

public class AddStudentActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemSelectedListener {

    ListView lv;
    ImageView studImage;
    Uri studImageUri;
    EditText lastname, firstname;
    String selectedCourse;
    Spinner course;
    Button btnsave, btncancel;
    CustomAdapter adapter;
    private int pos;
    private static final int PICK_IMAGE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_student);

        //
        String [] courselist = this.getResources().getStringArray(R.array.course_list);

        //
        studImage = (ImageView) findViewById(R.id.addstudentimage);
        lastname = (EditText) findViewById(R.id.editTextLastname);
        firstname = (EditText) findViewById(R.id.editTextFirstname);
        course = (Spinner) findViewById(R.id.spinnerCourse);
        btnsave = (Button) findViewById(R.id.btn_save);
        btncancel = (Button) findViewById(R.id.btn_cancel);

        //adding an event listeners to the elements
        studImage.setOnClickListener(this);
        btnsave.setOnClickListener(this);
        btncancel.setOnClickListener(this);
        course.setOnItemSelectedListener(this);

        //checking if there is an edit action invoked
        Bundle b = this.getIntent().getExtras();
        if(b != null){
            Uri image = b.getParcelable("image");
            String lastname = b.getString("lastname");
            String firstname = b.getString("firstname");
            String newcourse = b.getString("course");

                for(int i=0; i< courselist.length; i++)
                    if (courselist[i].equals(newcourse)){
                        pos=i;
                        break;
                    }
                //
                    this.studImage.setImageURI(image);
                    this.lastname.setText(lastname);
                    this.firstname.setText(firstname);
                    this.course.setSelection(pos);
        }
    }


    //on click listeners for the buttons and imageview
    @Override
    public void onClick(View v) {
        int id = v.getId();

        switch (id){
            case R.id.addstudentimage:
                Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                startActivityForResult(gallery, PICK_IMAGE);
                break;
            case R.id.btn_save:
                String lname = lastname.getText().toString();
                String fname = firstname.getText().toString();
                String newCourse = course.getSelectedItem().toString();

                if(!studImage.equals(R.drawable.user) && !lastname.equals(" ") && !firstname.equals("") && !course.getSelectedItem().toString().trim().equals(0)){
                    Intent intent = new Intent(); //blind intent

                    intent.putExtra("image", this.studImageUri);
                    intent.putExtra("lastname", lname);
                    intent.putExtra("firstname", fname);
                    intent.putExtra("course", newCourse);

                    this.setResult(Activity.RESULT_OK, intent);
                    finish();
                }else{
                    Toast.makeText(getApplicationContext(), "Please fill in all fields", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_cancel:
                studImage.setImageResource(R.drawable.user);
                lastname.setText("");
                firstname.setText("");
                course.setSelection(0);
                break;
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode != 0){
            if(data != null){
                studImageUri = data.getData();
                studImage.setImageURI(studImageUri);
            }
        }else {

        }
    }

    //on click listeners for the spinners
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        int sid = parent.getId();

        switch (sid){
            case R.id.spinnerCourse:
                selectedCourse = this.course.getItemAtPosition(position).toString();
                break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    ArrayList<Student> studentArrayList = new ArrayList<>();
    ArrayList<Student> findlist = new ArrayList<>();

    CustomAdapter adapter;
    private Uri imageUri;

    ListView lv;
    AlertDialog.Builder show_builder;
    AlertDialog dialog;

    LinearLayout layout;
    ImageView imageView;
    TextView stud_lname, stud_fname, stud_course;

    AdapterView.AdapterContextMenuInfo info;

    //
    EditText txtsearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.student_listview);
        txtsearch = (EditText) findViewById(R.id.textsearch);

        adapter = new CustomAdapter(this, studentArrayList);
        lv.setAdapter(adapter);
        final CustomAdapter mAdapter = new CustomAdapter(this, findlist);

        registerForContextMenu(lv);
        lv.setOnItemClickListener(this);

        //
        show_builder = new AlertDialog.Builder(this);

        txtsearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                findlist.clear();

                String s1 = s.toString();
                Pattern pattern = Pattern.compile(s1);
                    for (int i=0; i<studentArrayList.size(); i++){
                        String find = studentArrayList.get(i).getStudfname().toLowerCase();
                        Matcher matcher = pattern.matcher(find);
                        if(matcher.find()){
                            findlist.add(studentArrayList.get(i));
                            lv.setAdapter(mAdapter);
                            adapter.notifyDataSetChanged();
                        }//end if
                    }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    //for menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }else if(id == R.id.action_add){
            Intent add = new Intent(MainActivity.this, AddStudentActivity.class);
            startActivityForResult(add, 0);
        }
        return super.onOptionsItemSelected(item);
    }
    //inflate the menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.addmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    //handles the onclick listener for the listview
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == Activity.RESULT_OK){
            Bundle b = data.getExtras();
            imageUri = b.getParcelable("image");
            String lastname = b.getString("lastname");
            String firstname = b.getString("firstname");
            String course = b.getString("course");

            Student student = new Student(imageUri, lastname, firstname, course);
            //
            switch(requestCode){
                case 0: //request for adding student information
                    studentArrayList.add(student);
                    lv.setAdapter(adapter);
                    Toast.makeText(getApplicationContext(), "New student successfully added!", Toast.LENGTH_SHORT).show();
                    break;
                case 1: //request for editing student information
                    studentArrayList.set(info.position, student);
                    Toast.makeText(this, "Student updated!", Toast.LENGTH_SHORT).show();
                    break;
            }
            adapter.notifyDataSetChanged();

        }else{

        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        this.getMenuInflater().inflate(R.menu.contextmenu, menu);
        info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        menu.setHeaderTitle(studentArrayList.get(info.position).getStudlname()+","
                            +studentArrayList.get(info.position).getStudfname());
    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int id = item.getItemId();

        switch (id){
            case R.id.show: //display an alert dialog box
                this.imageView = new ImageView(this);
                this.stud_lname = new TextView(this);
                this.stud_fname = new TextView(this);
                this.stud_course = new TextView(this);

                this.imageView.setImageURI(studentArrayList.get(info.position).getUriImage());
                this.show_builder.setTitle(studentArrayList.get(info.position).getStudlname()+", "
                        +studentArrayList.get(info.position).getStudfname());

                this.layout = new LinearLayout(this);
                this.layout.setOrientation(LinearLayout.VERTICAL);
                this.layout.addView(imageView);
                this.layout.addView(stud_lname);
                this.layout.addView(stud_fname);
                this.layout.addView(stud_course);

                this.show_builder.setView(layout);
                this.show_builder.setNeutralButton("OKAY", null);

                this.dialog = this.show_builder.create();
                this.dialog.show();
                break;
            case R.id.edit: //edit student information by calling the AddStudentActivity
                Intent intent = new Intent(MainActivity.this, AddStudentActivity.class);
                Student student = studentArrayList.get(info.position);
                intent.putExtra("image", student.getUriImage());
                intent.putExtra("lastname", student.getStudlname());
                intent.putExtra("firstname", student.getStudfname());
                intent.putExtra("course", student.getStudcourse());
                this.startActivityForResult(intent, 1);
                break;
            case R.id.delete: //delete student information
                this.studentArrayList.remove(info.position);
                this.adapter.notifyDataSetChanged();
                lv.setAdapter(adapter);
                Toast.makeText(this, "Student deleted!", Toast.LENGTH_LONG).show();
                break;
        }

        return super.onContextItemSelected(item);
    }
}
MainActivity.java

public class AddStudentActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemSelectedListener {

    ListView lv;
    ImageView studImage;
    Uri studImageUri;
    EditText lastname, firstname;
    String selectedCourse;
    Spinner course;
    Button btnsave, btncancel;
    CustomAdapter adapter;
    private int pos;
    private static final int PICK_IMAGE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_student);

        //
        String [] courselist = this.getResources().getStringArray(R.array.course_list);

        //
        studImage = (ImageView) findViewById(R.id.addstudentimage);
        lastname = (EditText) findViewById(R.id.editTextLastname);
        firstname = (EditText) findViewById(R.id.editTextFirstname);
        course = (Spinner) findViewById(R.id.spinnerCourse);
        btnsave = (Button) findViewById(R.id.btn_save);
        btncancel = (Button) findViewById(R.id.btn_cancel);

        //adding an event listeners to the elements
        studImage.setOnClickListener(this);
        btnsave.setOnClickListener(this);
        btncancel.setOnClickListener(this);
        course.setOnItemSelectedListener(this);

        //checking if there is an edit action invoked
        Bundle b = this.getIntent().getExtras();
        if(b != null){
            Uri image = b.getParcelable("image");
            String lastname = b.getString("lastname");
            String firstname = b.getString("firstname");
            String newcourse = b.getString("course");

                for(int i=0; i< courselist.length; i++)
                    if (courselist[i].equals(newcourse)){
                        pos=i;
                        break;
                    }
                //
                    this.studImage.setImageURI(image);
                    this.lastname.setText(lastname);
                    this.firstname.setText(firstname);
                    this.course.setSelection(pos);
        }
    }


    //on click listeners for the buttons and imageview
    @Override
    public void onClick(View v) {
        int id = v.getId();

        switch (id){
            case R.id.addstudentimage:
                Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                startActivityForResult(gallery, PICK_IMAGE);
                break;
            case R.id.btn_save:
                String lname = lastname.getText().toString();
                String fname = firstname.getText().toString();
                String newCourse = course.getSelectedItem().toString();

                if(!studImage.equals(R.drawable.user) && !lastname.equals(" ") && !firstname.equals("") && !course.getSelectedItem().toString().trim().equals(0)){
                    Intent intent = new Intent(); //blind intent

                    intent.putExtra("image", this.studImageUri);
                    intent.putExtra("lastname", lname);
                    intent.putExtra("firstname", fname);
                    intent.putExtra("course", newCourse);

                    this.setResult(Activity.RESULT_OK, intent);
                    finish();
                }else{
                    Toast.makeText(getApplicationContext(), "Please fill in all fields", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_cancel:
                studImage.setImageResource(R.drawable.user);
                lastname.setText("");
                firstname.setText("");
                course.setSelection(0);
                break;
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode != 0){
            if(data != null){
                studImageUri = data.getData();
                studImage.setImageURI(studImageUri);
            }
        }else {

        }
    }

    //on click listeners for the spinners
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        int sid = parent.getId();

        switch (sid){
            case R.id.spinnerCourse:
                selectedCourse = this.course.getItemAtPosition(position).toString();
                break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    ArrayList<Student> studentArrayList = new ArrayList<>();
    ArrayList<Student> findlist = new ArrayList<>();

    CustomAdapter adapter;
    private Uri imageUri;

    ListView lv;
    AlertDialog.Builder show_builder;
    AlertDialog dialog;

    LinearLayout layout;
    ImageView imageView;
    TextView stud_lname, stud_fname, stud_course;

    AdapterView.AdapterContextMenuInfo info;

    //
    EditText txtsearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.student_listview);
        txtsearch = (EditText) findViewById(R.id.textsearch);

        adapter = new CustomAdapter(this, studentArrayList);
        lv.setAdapter(adapter);
        final CustomAdapter mAdapter = new CustomAdapter(this, findlist);

        registerForContextMenu(lv);
        lv.setOnItemClickListener(this);

        //
        show_builder = new AlertDialog.Builder(this);

        txtsearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                findlist.clear();

                String s1 = s.toString();
                Pattern pattern = Pattern.compile(s1);
                    for (int i=0; i<studentArrayList.size(); i++){
                        String find = studentArrayList.get(i).getStudfname().toLowerCase();
                        Matcher matcher = pattern.matcher(find);
                        if(matcher.find()){
                            findlist.add(studentArrayList.get(i));
                            lv.setAdapter(mAdapter);
                            adapter.notifyDataSetChanged();
                        }//end if
                    }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    //for menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }else if(id == R.id.action_add){
            Intent add = new Intent(MainActivity.this, AddStudentActivity.class);
            startActivityForResult(add, 0);
        }
        return super.onOptionsItemSelected(item);
    }
    //inflate the menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.addmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    //handles the onclick listener for the listview
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == Activity.RESULT_OK){
            Bundle b = data.getExtras();
            imageUri = b.getParcelable("image");
            String lastname = b.getString("lastname");
            String firstname = b.getString("firstname");
            String course = b.getString("course");

            Student student = new Student(imageUri, lastname, firstname, course);
            //
            switch(requestCode){
                case 0: //request for adding student information
                    studentArrayList.add(student);
                    lv.setAdapter(adapter);
                    Toast.makeText(getApplicationContext(), "New student successfully added!", Toast.LENGTH_SHORT).show();
                    break;
                case 1: //request for editing student information
                    studentArrayList.set(info.position, student);
                    Toast.makeText(this, "Student updated!", Toast.LENGTH_SHORT).show();
                    break;
            }
            adapter.notifyDataSetChanged();

        }else{

        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        this.getMenuInflater().inflate(R.menu.contextmenu, menu);
        info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        menu.setHeaderTitle(studentArrayList.get(info.position).getStudlname()+","
                            +studentArrayList.get(info.position).getStudfname());
    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int id = item.getItemId();

        switch (id){
            case R.id.show: //display an alert dialog box
                this.imageView = new ImageView(this);
                this.stud_lname = new TextView(this);
                this.stud_fname = new TextView(this);
                this.stud_course = new TextView(this);

                this.imageView.setImageURI(studentArrayList.get(info.position).getUriImage());
                this.show_builder.setTitle(studentArrayList.get(info.position).getStudlname()+", "
                        +studentArrayList.get(info.position).getStudfname());

                this.layout = new LinearLayout(this);
                this.layout.setOrientation(LinearLayout.VERTICAL);
                this.layout.addView(imageView);
                this.layout.addView(stud_lname);
                this.layout.addView(stud_fname);
                this.layout.addView(stud_course);

                this.show_builder.setView(layout);
                this.show_builder.setNeutralButton("OKAY", null);

                this.dialog = this.show_builder.create();
                this.dialog.show();
                break;
            case R.id.edit: //edit student information by calling the AddStudentActivity
                Intent intent = new Intent(MainActivity.this, AddStudentActivity.class);
                Student student = studentArrayList.get(info.position);
                intent.putExtra("image", student.getUriImage());
                intent.putExtra("lastname", student.getStudlname());
                intent.putExtra("firstname", student.getStudfname());
                intent.putExtra("course", student.getStudcourse());
                this.startActivityForResult(intent, 1);
                break;
            case R.id.delete: //delete student information
                this.studentArrayList.remove(info.position);
                this.adapter.notifyDataSetChanged();
                lv.setAdapter(adapter);
                Toast.makeText(this, "Student deleted!", Toast.LENGTH_LONG).show();
                break;
        }

        return super.onContextItemSelected(item);
    }
}
CustomAdapter.java

public class CustomAdapter extends BaseAdapter {

    Context context;
    //data container
    ArrayList<Student> list;
    LayoutInflater inflater;

    //contructor


    public CustomAdapter(Context context, ArrayList<Student> list) {
        this.context = context;
        this.list = list;
        this.inflater = LayoutInflater.from(context);
    }

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

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

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

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

        ViewHolder holder;
        if(convertView == null){
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.custom_layout, parent, false);
            holder.iv = (ImageView) convertView.findViewById(R.id.imageView);
            holder.lname = (TextView) convertView.findViewById(R.id.textLastname);
            holder.fname= (TextView) convertView.findViewById(R.id.textFirstname);
            holder.course = (TextView) convertView.findViewById(R.id.textCourse);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        //inflate
        holder.iv.setImageURI(list.get(position).getUriImage());
        holder.lname.setText(list.get(position).getStudlname());
        holder.fname.setText(list.get(position).getStudfname());
        holder.course.setText(list.get(position).getStudcourse());

        return convertView;
    }

    //creating a static class
    static class ViewHolder{
        ImageView iv;
        TextView lname, fname,course;
    }
}

更新:我已经解决了我的问题。我了解到这里的问题是我使用了行动选择。我刚从以下位置更改了代码:

Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
startActivityForResult(gallery, PICK_IMAGE);
致:


字符串imageUri=b.getParcelableimage@JohnJoe imageUri是我已经声明的Uri。在我的模型中,图像设置为Uri,但你的应用看起来很酷:很好,你修复了: