尝试找出一种很好的方法来查找列表视图中的项目的资源ID。
所以基本上我从网站上提取数据并将它们添加到我的Android应用程序列表视图中。目前我有一个占位符图像和两个文本字段。目的是在从网站上提取初始文本数据(包括每个单独图像的URL)后,我将再次通过列表启动异步任务以下载图像,然后将其显示在列表视图中。
但是如何在列表视图中找到每个ImageView的资源ID?
在我阅读教程和思考的冒险中,我已经掌握了它,但实际上没有,我遇到了基于BaseAdapter创建自己的Adapter类的概念。我想我得到了它的结构,但我不知道它对我的情况有用(如果它甚至有用吗?)
任何人都知道如何处理这个问题?
...
ArrayList<HashMap<String, String>> allUserList;
ListView listview_usersId;
...
allUserList = new ArrayList<HashMap<String,String>>();
listview_usersId = (ListView) findViewById(R.id.listview_users);
...
private void UpdateUserListWithContent() {
ListAdapter adapter = new SimpleAdapter(
UserlistActivity.this,
allUserList,
R.layout.list_userliststyle,
new String[]{TAG_ID, TAG_USERNAME},
new int[]{R.id.list_userliststyle_id, R.id.list_userliststyle_username});
// updating listview
listview_usersId.setAdapter(adapter);
}
我有点希望得到类似的东西......
theIdIWant = myListView[position].magicalFunctionThatKnowsWhatResourceIWant(imageView).resourceId()
如果这有意义吗?
答案 0 :(得分:1)
从您的问题开始,您希望从每个行项目的网址加载图片。在我看来,使用基于BaseAdapter的自定义适配器会更好。实际上,您不需要通过其资源ID单独引用每个ImageView。列表视图实际上会回收行,这样就不必为列表中的每个项创建视图,以节省宝贵的内存。此外,对于每个视图项,资源ID保持不变(R.id.exampleimageview)。
这是一个适配器的简短实现,可以从JSON数组加载项目并使用Picasso库(这是一个很好的库,用于从Internet上加载图像)将图像加载到该行的图像视图:
public class JSONListAdapter extends BaseAdapter{
private Context mContext;
private JSONArray data;
public JSONListAdapter(Context mContext,JSONArray data){
this.mContext=mContext;
this.data=data;
}
@Override
public int getCount() {
return data.length();
//return number of rows in your list
}
@Override
public Object getItem(int position) {
return dataList[position];
//return items for each position
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=inflater.inflate(R.layout.row_layout, null);
}
String row=data.get(position);
((TextView)convertView.findViewById(R.id.example_textview)).setText(row.getString("title"));
//Now to load image which is stored in imgurl to your view.
String imageURL=row.getString("imgurl");
//Use Picasso library to load image to this image view
ImageView myImageView=(ImageView) convertView.findViewById(R.id.exampleimageview);
Picasso.with(mContext).load(imageURL).into(myImageView);
return convertView;
}
}
我希望我对此很清楚。但是,对于这个,你需要将picasso作为库添加到你的项目中。假设您使用的是Android Studio,只需添加compile&#39; com.squareup.picasso:picasso:2.4.0&#39; - 对你的依赖。
感谢。
答案 1 :(得分:1)
要从服务器获取图像并将其设置在ImageView上,我建议使用Picasso或Volley,但是对于您的第二个,当您要编辑某个项目时,获取视图的ID是完全有效的那个行让我们想要编辑列表中第3个项目的图像并为此:
要使用位置获取视图,请使用以下方法:
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
如果我有什么不妥,请提及。
答案 2 :(得分:0)
意图是在拉出初始文本数据之后 从网站(包括每个单独图像的URL),我 然后将再次通过列表启动异步任务进行下载 图像,然后将其显示在列表视图中。
这不是一个好主意。
您必须在getView
中实施SimpleAdapter
,然后启动AsyncTask以在那里下载图片。这样,任务将仅在需要时启动:当滚动后项目变得可见时,基本上。
另外,我建议您查看Picasso library而不是实现自己的AsyncTask。它也有一个缓存,因此提高了性能,只需要在线代码。