如何从列表视图中的项目中查找资源ID?

时间:2015-02-23 08:53:42

标签: android listview android-listview android-resources

再次G'day!

尝试找出一种很好的方法来查找列表视图中的项目的资源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()

如果这有意义吗?

3 个答案:

答案 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个项目的图像并为此:

  1. 您只需要使用getview方法让列表在第3个位置获取视图。
  2. 使用findviewById找到imageview。
  3. 将任意图像设置为本地图像或网址。
  4. 要使用位置获取视图,请使用以下方法:

    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。它也有一个缓存,因此提高了性能,只需要在线代码。