Java ArrayAdapter仅在列表视图中显示上次添加的缩略图
在我的应用程序中,我有一个显示员工的列表视图,每个项目都有自己的名称、电子邮件和缩略图。除了缩略图,一切都很好。My ArrayAdapter不是将所有员工档案图片显示为缩略图,而是如下所示: 显示所有默认图片,当用户未为特定员工选择任何图片时,会自动选择默认图片。默认图片位于drawable文件夹中:android。resource://com.witchking.modiryar/ +R.drawable.default\u pic; 是否将上次插入的员工图片显示为缩略图 如果我回到上一个活动并返回列表,列表甚至不会显示最后一张图片。 如果我有两个或更多的员工具有相同的图片,并且我再次创建了另一个具有相同图片的员工,列表将显示具有与上次插入的员工图片相同图片的所有员工! 下面是一张图片,让您更好地了解我面临的问题: 我的适配器问题: 员工哈利·波特添加了默认图片 员工佛罗多·巴金斯添加了名为A的图片 返回主要活动并返回此活动后的员工列表 员工钢铁侠添加了名为B的图片 员工超人再次添加了名为A的图片 这是我的密码: ArrayAdapter getView方法:Java ArrayAdapter仅在列表视图中显示上次添加的缩略图,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,在我的应用程序中,我有一个显示员工的列表视图,每个项目都有自己的名称、电子邮件和缩略图。除了缩略图,一切都很好。My ArrayAdapter不是将所有员工档案图片显示为缩略图,而是如下所示: 显示所有默认图片,当用户未为特定员工选择任何图片时,会自动选择默认图片。默认图片位于drawable文件夹中:android。resource://com.witchking.modiryar/ +R.drawable.default\u pic; 是否将上次插入的员工图片显示为缩略图 如果我回到上一个活
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View myView = convertView;
String path ="android.resource://com.witchking.modiryar/" + R.drawable.default_pic;
Uri uri = null;
if (myView == null)
{
LayoutInflater layoutInflater;
layoutInflater = LayoutInflater.from(getContext());
myView = layoutInflater.inflate(R.layout.item_listviewitem, null);
}
PersonHandler myPerson = getItem(position);
if (myPerson != null){
TextView firstLine = (TextView) myView.findViewById(R.id.firstLine);
TextView secondLine = (TextView) myView.findViewById(R.id.secondLine);
ImageView profilePicture = (ImageView) myView.findViewById(R.id.icon);
if (myPerson.getPersonProfilePictureUrl() != null){
uri = Uri.parse(myPerson.getPersonProfilePictureUrl());
}else {
uri = Uri.parse(myPerson.getPersonProfilePictureUrl());
}
firstLine.setText(myPerson.getPersonFullName());
profilePicture.setImageURI(uri);
switch (personType)
{
case 'S': //person type student
secondLine.setText(myPerson.getPersonStudentNumber());
break;
case 'E': //person type employee
secondLine.setText(myPerson.getPersonEmail());
break;
case 'M': //person type Masters
secondLine.setText(myPerson.getPersonEmail());
break;
}
}
return myView;
}
PersonHandler是一个类,用于根据不同活动中的人员类型处理查询。下面是getPersonList方法:
public List<PersonHandler> getPersonList(SQLiteDatabase sqldb, char personType){
Cursor cursor;
String fullName = null;
String stdNumber = null;
String email = null;
String query = null;
String path = "android.resource://com.witchking.modiryar/" + R.drawable.exclamation;
String[] columnName = new String[3];
List<PersonHandler> listPerson=new ArrayList<PersonHandler>();
/*
* dar in ghesmat query motenaseb ba personType
* ejra migardad
* query selected by person type
*/
switch (personType) {
case 'S':
query = "select * from " + "tbl_Students";
break;
case 'E':
query = "select * from " + "tbl_Employees";
break;
case 'M':
query = "select * from " + "tbl_Master";
break;
}
cursor = sqldb.rawQuery(query, null);
/*
* dar in ghesmat barname check mikonad ke agar cursor khali bood
* yani hich daneshjoo, karmand, ya ostadi add nashode
* pas bar asase personType tasmim migirad ke peyghame monaseb ra namayesh dahad
* checking if cursor is null and displaying proper message
* the message is added as an item in list
*/
int cnt = cursor.getCount();
if (cursor.getCount() <= 0){
PersonHandler newPerson=new PersonHandler();
newPerson.setPersonProfilePictureUrl(path);
switch (personType) {
case 'S':
fullName = "هیچ دانشجویی اضافه نشده";
stdNumber = "از منو گزینه دانشجوی جدید را انتخاب نمایید";
newPerson.setPersonFullName(fullName);
newPerson.setPersonStudentNumber(stdNumber);
break;
case 'E':
fullName = "هیچ کارمندی اضافه نشده";
email = "از منو گزینه کارمند جدید را انتخاب نمایید";
newPerson.setPersonFullName(fullName);
newPerson.setPersonEmail(email);
break;
case 'M':
fullName = "هیچ استادی اضافه نشده";
email = "از منو گزینه استاد جدید را انتخاب نمایید";
newPerson.setPersonFullName(fullName);
newPerson.setPersonEmail(email);
break;
}
listPerson.add(newPerson);
/*
* dar in ghesmat bar asase personType barname tasmim migirad
* ke field haye monasb ra bar asase query voroodi az cursor
* farakhani konad
* if cursor is not null, app selects proper columns based on person type
*/
}else {
cursor.moveToFirst();
while (!cursor.isAfterLast()){
PersonHandler newPerson=new PersonHandler();
switch (personType) {
case 'S':
newPerson.setPersonFirstName(cursor.getString(1)); //First Name Column
newPerson.setPersonLastName(cursor.getString(2)); //Last Name Column
newPerson.setPersonEmail(cursor.getString(5)); //Email or StudentNumber Column
newPerson.setPersonProfilePictureUrl(cursor.getString(7)); //Picture Url Column
break;
case 'E':
newPerson.setPersonFirstName(cursor.getString(1)); //First Name Column
newPerson.setPersonLastName(cursor.getString(2)); //Last Name Column
newPerson.setPersonEmail(cursor.getString(3)); //Email or StudentNumber Column
newPerson.setPersonProfilePictureUrl(cursor.getString(7)); //Picture Url Column
break;
case 'M':
newPerson.setPersonFirstName(cursor.getString(1)); //First Name Column
newPerson.setPersonLastName(cursor.getString(2)); //Last Name Column
newPerson.setPersonEmail(cursor.getString(3)); //Email or StudentNumber Column
newPerson.setPersonProfilePictureUrl(cursor.getString(7)); //Picture Url Column
break;
}
newPerson.setPersonFullName(newPerson.getPersonFirstName() + " " + newPerson.getPersonLastName());
listPerson.add(cursor.getPosition(), newPerson);
cursor.moveToNext();
newPerson = null;
}
}
return listPerson;
}
最后是我在活动中的onCreate方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_employees);
context = this;
SQLiteDatabase myDB = openOrCreateDatabase("ModirYar.db", MODE_PRIVATE, null);
char personType = 'E';
PersonHandler EmployeePerson = new PersonHandler();
List<PersonHandler> myPerson = new ArrayList<PersonHandler>();
myPerson = EmployeePerson.getPersonList(myDB, personType);
//get the list view reference
listViewEmployeesList = (ListView) findViewById(R.id.lstView_Employees);
sampleListAdapter myAdapter = new sampleListAdapter(this, R.layout.item_listviewitem, myPerson);
myAdapter.personType = personType;
listViewEmployeesList.setAdapter(myAdapter);
}
我真的很困惑。是什么导致了这个问题?
提前感谢…尝试使用通用图像加载器从drawable加载图像。 像这样的:
ImageLoader.getInstance().displayImage(context, "drawable://" + uri, profilePicture);
uri中只有资源id。使用通用图像加载器。@vipulmittal我实际上已经发布了一个关于毕加索更好的解决方案的答案,相信我,我自己也曾是UIL的粉丝,但后来我意识到OP不是从互联网上加载的。你是对的。但是,如果所有图像都是可绘制的,那么只需设置ImageResourcer.drawable.Equiremon就足够了。UIL也可以使用可绘制的图像,请检查下面的代码。感谢您的回复@vipulmittal不,并非所有图像都是可绘制的,唯一可绘制的图像是默认图像,即波特的图像。其他由用户从库中选择。UIL也适用于此吗?实际上我是UIL新手,我应该将UIL设置放在适配器构造函数中吗?我已经这样做了,然后替换了profilePicture.setImageURIuri;使用imageLoader.displayImageuri.toString,profilePicture;在getView方法中。但应用程序崩溃了。它说不幸的是,应用程序停止了工作。我猜这是profilePicture的逻辑错误。我跟踪了它,但无法找出错误发生的地方。我甚至将path变量传递给它的stringuri参数,但即使使用drawable中的默认图片,仍然没有结果。