Android Imageview和ListView-自定义适配器是解决方案吗?
我刚开始一些基本的Android编程,但我有点卡住了。简单的说,我想制作一个包含图像的列表视图(最终产品是一个分类的图库,全屏,无文本)。我尝试从URL异步加载图像,然后将它们加载到我的listview中。真正发生的是,我的listview被文本填满(android.widget.id blablabla)。它似乎是ImageView的id,因此我认为问题在于适配器。为图像创建自定义适配器是否可以解决此问题,以及该适配器的外观如何?我试着寻找一些例子(因为很多人都尝试过类似的东西),但我找不到适合的 mainActivity.java:Android Imageview和ListView-自定义适配器是解决方案吗?,android,android-listview,android-imageview,Android,Android Listview,Android Imageview,我刚开始一些基本的Android编程,但我有点卡住了。简单的说,我想制作一个包含图像的列表视图(最终产品是一个分类的图库,全屏,无文本)。我尝试从URL异步加载图像,然后将它们加载到我的listview中。真正发生的是,我的listview被文本填满(android.widget.id blablabla)。它似乎是ImageView的id,因此我认为问题在于适配器。为图像创建自定义适配器是否可以解决此问题,以及该适配器的外观如何?我试着寻找一些例子(因为很多人都尝试过类似的东西),但我找不到适
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();
}
}
如何将加载的图像放入列表元素?(//这里是什么?)
再次编辑:
通过将通用加载程序代码更改为适配器解决了此问题。
ImageView imageV=(ImageView)view.findViewById(R.id.ImageView);
imageLoader.displayImage(image.getUrl(),imageV) 是的,您需要一个定制的阵列适配器,这不是什么大问题,也很容易实现。你可以在网上找到很多例子。代码中的问题是简单列表\u项\u 1。。。此参数用于适配器中要使用的布局。由于您提到了简单列表项1,这是android代码中的文本视图,您将只看到文本。请参见以下内容简单列表\u项\u 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"
/>
您应该使用此库将图像从网络加载到列表视图中。它将为您缓存它们。这是非常有效的。试试看。 而且,将图像加载到listview中不需要做太多工作。这只是一行代码。
您可以问我任何问题。simple
listView
将使用字符串作为列表,如果您需要其他或更多内容,则必须使用自定义适配器。下面是一些示例
,
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??
}
}
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;
}
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;
}
}
<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"
/>