【问题标题】:Imageview and listviews - is custom adapter the solution?Imageview 和 listviews - 自定义适配器是解决方案吗?
【发布时间】:2013-12-13 17:44:09
【问题描述】:

我刚刚开始了一些基本的 Android 编程,但我有点卡住了。很简单,我想制作一个包含图像的列表视图(最终产品是排序的画廊,全屏,无文本)。我尝试从 URL 异步加载图像,然后将它们加载到我的列表视图中。真正发生的是,我的列表视图被文本填满(android.widget.id blabla)。这似乎是我的图像视图的 id,因此我认为问题出在适配器上。为图像创建自定义适配器会解决问题吗?该适配器会是什么样子?我尝试搜索一些示例(因为很多人都尝试过类似的东西),但我找不到适合的东西。

MainActivity.java:

public class MainActivity extends Activity {    
private ArrayList<ImageView> titles;
private ArrayAdapter<ImageView> adapter;

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

    titles = new ArrayList<ImageView>();


    final ListView listview = (ListView) findViewById(R.id.list);
    adapter = new ArrayAdapter<ImageView>(this, android.R.layout.simple_list_item_1, android.R.id.text1, titles);

    listview.setAdapter(adapter); 

    titles.add(new ImageView(this));

    loadItems("http://test.com/images/3da25cead4806472c8c27012f724be45d0022cc7.jpeg");
    loadItems("http://test.com/images/fbef951ceb9a83d86427d607d67f1ba93008bdfa.jpeg");
    loadItems("http://test.com/images/e982478695ab765bb746dce4da8328a60fbd0bf6.jpeg");
}

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

public void loadItems(String url){
    new LoadImage((ImageView) new ImageView(this), this).execute(url);
    //adapter.notifyDataSetChanged();
}

public void addToList(ImageView image){
    titles.add(image);
    adapter.notifyDataSetChanged();
}

}

LoadImage.java:

class LoadImage extends AsyncTask<String, Void, Bitmap> {
private ImageView image;
private MainActivity mainActivity;

  public LoadImage(ImageView image, MainActivity mainActivity) {
      this.image = image;
      this.mainActivity = mainActivity;
  }

  protected Bitmap doInBackground(String... urls) {
      String urldisplay = urls[0];
      Bitmap image = null;
      try{
        InputStream in = new java.net.URL(urldisplay).openStream();
        image = BitmapFactory.decodeStream(in);
      }catch(Exception e){
          Log.e("Error: ", e.getMessage());
      }
      return image;
  }

protected void onPostExecute(Bitmap result) {
      image.setImageBitmap(result);
      mainActivity.addToList(image);
  }
}

编辑: 所以,我按照建议尝试使用 Universal Image Loader,我也尝试创建自己的适配器。这是它现在的样子:

MainActivity.java:

public class MainActivity extends Activity {    
private ImageLoader imageLoader;
private List<ImageObject> images;
private CustomAdapter adapter;

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

    images = new ArrayList<ImageObject>();


    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.getBaseContext()).build();
    imageLoader = ImageLoader.getInstance();
    imageLoader.init(config);


    adapter = new CustomAdapter(this, R.layout.list_view_row_item, images);
    ListView listView = (ListView) findViewById(R.id.listview);
    listView.setAdapter(adapter);

    addImage("https://www.google.dk/images/srpr/logo11w.png");
    addImage("https://www.google.dk/images/srpr/logo11w.png");
    addImage("https://www.google.dk/images/srpr/logo11w.png");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
public void addImage(String url){
    ImageObject image = new ImageObject(url, imageLoader);
    images.add(image);
    adapter.notifyDataSetChanged(); //Is this legit??
}
}

CustomAdapter.java:

public class CustomAdapter extends ArrayAdapter<ImageObject>{
private List<ImageObject> images;
private Context context;
private int resourceID;

public CustomAdapter(Context context, int resourceID, List<ImageObject> images) {
    super(context, resourceID, images);

    this.context = context;
    this.images = images;
    this.resourceID = resourceID;
}

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

    if(view == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(resourceID, null);
    }

    ImageObject image = images.get(position);

    if(image != null){
        // What goes here?
    }

    return view;
}

}

ImageObject.java:

public class ImageObject {
private String url;
private ImageView image;

public ImageObject(String url, ImageLoader imageLoader){
    this.setUrl(url);
    imageLoader.displayImage(url, image);
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public ImageView getImage() {
    return image;
}

public void setImage(ImageView image) {
    this.image = image;
}
}

如何将加载的图像放入列表元素? (//这里发生了什么?)

再次编辑: 通过将通用加载器代码更改为适配器来解决它。 ImageView imageV = (ImageView) view.findViewById(R.id.imageview); imageLoader.displayImage(image.getUrl(), imageV);

【问题讨论】:

    标签: android android-listview android-imageview


    【解决方案1】:

    是的,你需要一个自定义的 arrayAdapter,这没什么大不了的,而且很容易实现。你可以在网上找到很多例子。您的代码中的问题是 simple_list_item_1 ...此参数用于适配器中要使用的布局。由于您提到了 simple_list_item_1,它是 android 代码中的 TextView,您只会看到 Text。请参阅下面的 simple_list_item_1 代码在 android 代码库中的外观:-

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
    />
    

    【讨论】:

      【解决方案2】:

      您应该使用此库将图像从网络加载到您的列表视图中。它会为你缓存它们。这是非常有效的。试一试 。 Android-Universal-Image-Loader

      而且您不必做太多就可以将图像加载到列表视图中。它只是一行代码。 有什么问题可以问我。

      【讨论】:

        【解决方案3】:

        简单的listView 将使用一个字符串作为它的列表,如果你想要其他或更多,那么你必须使用custom adapter。这里有一些例子供你使用

        androidexample.comvogella.comjavacodegeeks.comlearn2crack.com

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-11
          • 1970-01-01
          • 1970-01-01
          • 2021-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多