Java 某些图像未在ImageView中显示
我创建了一个短信应用程序,我想显示联系人的照片,我通过以下方式获得了输入流:Java 某些图像未在ImageView中显示,java,android,listview,android-studio,Java,Android,Listview,Android Studio,我创建了一个短信应用程序,我想显示联系人的照片,我通过以下方式获得了输入流: public InputStream openPhoto(long contactId) { Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContr
public InputStream openPhoto(long contactId) {
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor cursor = getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
if (cursor == null) {
return null;
}
try {
if (cursor.moveToFirst()) {
byte[] data = cursor.getBlob(0);
if (data != null) {
return new ByteArrayInputStream(data);
}
}
} finally {
cursor.close();
}
return null;
}
然后我显示如下:
Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
imageContact.setImageBitmap(bmp);
下面是发生的情况:
首先,当我运行我的应用程序时,当我向下滚动时,会显示一些图像,但当我向上滚动到顶部,然后返回到末尾时,图像会消失
正如你所看到的,我的列表中没有第一张图片,只有最后一张
所以我的第一个问题是,为什么我的联系人“Nico Aragon”和“Elouudie”的第一张照片没有显示出来?
第二个问题,为什么当我的listView“刷新”最后一个图像时会消失/
这是我的自定义listView适配器
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:descendantFocusability="blocksDescendants"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/tvContact"
android:layout_gravity="center_horizontal"
android:layout_alignTop="@+id/im_photoContact"
android:layout_alignLeft="@+id/lastSms"
android:layout_alignStart="@+id/lastSms" />
<ImageView
android:contentDescription="@string/photoContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/im_photoContact"
android:minWidth="50dp"
android:minHeight="50dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginBottom="10dp"
android:maxHeight="50dp"
android:maxWidth="50dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/lastSms"
android:ellipsize="end"
android:maxWidth="300dp"
android:maxLines="1"
android:singleLine="true"
android:textColor="#c4c4c4"
android:textSize="15dp"
android:layout_alignBottom="@+id/im_photoContact"
android:layout_toRightOf="@+id/im_photoContact"
android:layout_toEndOf="@+id/im_photoContact"
android:layout_marginLeft="10dp" />
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/new_message"
android:id="@+id/im_new_message"
android:layout_marginRight="10dp"
android:layout_marginTop="25dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
设置适配器的位置:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String packageName = MainActivity.this.getPackageName();
if (!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)) {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName);
startActivity(intent);
}
toolbar = (Toolbar) findViewById(R.id.toolbar);
ListView lv = (ListView) findViewById(R.id.ListView01);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false); //enlever le titre originel
getSupportActionBar().setHomeButtonEnabled(true); // ajout du bouton retour
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // ajout du bouton retour
listContact = new ArrayList<>();
idList = new ArrayList<>();
getInfoMain();
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String persoId = listContact.get(position).id;
String numero = listContact.get(position).address;
String contact = listContact.get(position).contact;
String body = listContact.get(position).body;
Intent intent = new Intent(MainActivity.this, PrintMessage.class);
intent.putExtra("id", persoId);
intent.putExtra("numero", numero);
intent.putExtra("contact", contact);
markMessageRead(ctx, numero, body);
startActivity(intent);
}
});
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最后一个字符串packageName=MainActivity.this.getPackageName();
如果(!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)){
意向意向=新意向(Telephony.Sms.Intents.ACTION\u CHANGE\u DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA\u包名称,packageName);
星触觉(意向);
}
toolbar=(toolbar)findviewbyd(R.id.toolbar);
ListView lv=(ListView)findViewById(R.id.ListView01);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayShowTitleEnabled(false);//初始标题
getSupportActionBar().setHomeButtonEnabled(true);//布顿街
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//一个关于bouton retour的文件
listContact=新的ArrayList();
idList=newarraylist();
getInfoMain();
低压设置适配器(适配器);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
String persoId=listContact.get(position.id);
字符串numero=listContact.get(position).address;
String contact=listContact.get(position.contact);
字符串体=listContact.get(position).body;
意向意向=新意向(MainActivity.this、PrintMessage.class);
意图。putExtra(“id”,persoId);
意向。额外(“数字”,数字);
意向。额外(“联系”,联系);
markMessageRead(ctx、数字、正文);
星触觉(意向);
}
});
}
listMessage.get(position).photo=contain
这是openPhoto的结果,这是一个inputStream,将ContactAdapter.java的getView()替换为以下代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RecordHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.contact_items, parent, false);
holder = new RecordHolder();
holder.tvContact = (TextView) layoutItem.findViewById(R.id.tvContact);
holder.lastSms = (TextView) layoutItem.findViewById(R.id.lastSms);
holder.imageContact = (ImageView) layoutItem.findViewById(R.id.im_photoContact);
holder.newMsg = (ImageView) layoutItem.findViewById(R.id.im_new_message);
convertView.setTag(holder);
} else {
holder = (RecordHolder) convertView.getTag();
}
if (listMessage.get(position).photo != null) {
Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
holder.imageContact.setImageBitmap(bmp);
} else {
holder.imageContact.img.setImageResource(R.drawable.contacticon);
}
if (!listMessage.get(position).contact.equals("no"))
tvContact.setText(listMessage.get(position).contact);
else
holder.tvContact.setText(listMessage.get(position).address);
if (listMessage.get(position).read == 0) {
holder.newMsg.setBackgroundResource(R.drawable.new_message);
} else
holder.newMsg.setBackgroundResource(0);
holder.lastSms.setText(listMessage.get(position).body);
//On retourne l'item créé.
return convertView;
}
在getView()外部创建记录持有者
static class RecordHolder {
TextView tvContact, lastSms;
ImageView imageContact , newMsg;
}
好吧,好吧,我解决了我的问题。 我的方法openPhoto(取自android的官方文档)返回一个InputStream,我将其更改了一个字节[]。然后我打印它:
Bitmap bmp = BitmapFactory.decodeByteArray(listMessage.get(position).photo, 0, listMessage.get(position).photo.length);;
holder.imageContact.setImageBitmap(bmp);
但我不知道为什么它会起作用。。如果有人能解释我
谢谢:)您能在这里包含ListView适配器的代码吗?我更新了它。对不起,这是第三个代码。我不想在这里使用xml代码。我想要ListView适配器的java代码。哦,对不起,我想现在没问题了。你的问题中包含了很多细节,但这完全让人困惑。你从哪里得到了
mContext
?我想这是活动的背景,但我不明白:/。我不能做类似于Context ctx=this
将其重命名为Context的事情,因为您在ContactAdapter.java的构造函数中得到了它。太愚蠢了,对不起。。但总是一样的://。调试时,我得到了图像的输入流,当我到达if(listMessage.get(position).photo!=null){Bitmap bmp=BitmapFactory.decodeStream(listMessage.get(position).photo);imageContact.setImageBitmap(bmp);}否则{imageContact.setImageBitmap(null);}
我进入“if”中我用InputStream设置了图像,但没有显示它:/studpid是什么?我的问题是“你从哪里获得McContext?”
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RecordHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.contact_items, parent, false);
holder = new RecordHolder();
holder.tvContact = (TextView) layoutItem.findViewById(R.id.tvContact);
holder.lastSms = (TextView) layoutItem.findViewById(R.id.lastSms);
holder.imageContact = (ImageView) layoutItem.findViewById(R.id.im_photoContact);
holder.newMsg = (ImageView) layoutItem.findViewById(R.id.im_new_message);
convertView.setTag(holder);
} else {
holder = (RecordHolder) convertView.getTag();
}
if (listMessage.get(position).photo != null) {
Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
holder.imageContact.setImageBitmap(bmp);
} else {
holder.imageContact.img.setImageResource(R.drawable.contacticon);
}
if (!listMessage.get(position).contact.equals("no"))
tvContact.setText(listMessage.get(position).contact);
else
holder.tvContact.setText(listMessage.get(position).address);
if (listMessage.get(position).read == 0) {
holder.newMsg.setBackgroundResource(R.drawable.new_message);
} else
holder.newMsg.setBackgroundResource(0);
holder.lastSms.setText(listMessage.get(position).body);
//On retourne l'item créé.
return convertView;
}
static class RecordHolder {
TextView tvContact, lastSms;
ImageView imageContact , newMsg;
}
Bitmap bmp = BitmapFactory.decodeByteArray(listMessage.get(position).photo, 0, listMessage.get(position).photo.length);;
holder.imageContact.setImageBitmap(bmp);