Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在GridView/ListView适配器上动态填充ImageView和TextView?_Java_Android_Arrays_Listview_Gridview - Fatal编程技术网

Java 如何在GridView/ListView适配器上动态填充ImageView和TextView?

Java 如何在GridView/ListView适配器上动态填充ImageView和TextView?,java,android,arrays,listview,gridview,Java,Android,Arrays,Listview,Gridview,我正在开发我的第一个应用程序,我被一些东西卡住了。有很多例子,但没有一个是我需要做的,我缺乏知识基础,以适应我所发现的 我正在尝试创建一个GridView/ListView,该GridView/ListView在同一网格/列表行中显示ImageView和TextView,并且图像和文本在滚动期间在该行上动态更新。列表中的每个网格/行都有不同的图像和文本(它们是从数组中填充的),我想确保在滚动期间正确地重新使用行,以保持应用程序的内存较低。图像存储在Res.Drawable文件夹中。我正在尝试做的

我正在开发我的第一个应用程序,我被一些东西卡住了。有很多例子,但没有一个是我需要做的,我缺乏知识基础,以适应我所发现的

我正在尝试创建一个GridView/ListView,该GridView/ListView在同一网格/列表行中显示ImageView和TextView,并且图像和文本在滚动期间在该行上动态更新。列表中的每个网格/行都有不同的图像和文本(它们是从数组中填充的),我想确保在滚动期间正确地重新使用行,以保持应用程序的内存较低。图像存储在Res.Drawable文件夹中。我正在尝试做的一个例子是WOW Armory应用程序的主屏幕

我一直在看下面的例子,相信这就是答案,但我不知道如何实现它:

我遇到的第一个问题是在适配器中处理ImageView,下一部分是在适配器工作后设置MainActivity。任何帮助都将不胜感激,并提前向您表示感谢。以下是我目前掌握的代码:

适配器:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MainButtonAdapter extends BaseAdapter {
    private static ArrayList<MainButtonObject>arraylist;
    private LayoutInflater mInflater;

    public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input) {        
        arraylist = input;
        mInflater = LayoutInflater.from(context);
    }    

    public int getCount() {        
        return arraylist.size();    
    }    

    public Object getItem(int position) {        
        return arraylist.get(position);    
    }    

    public long getItemId(int position) {        
        return position;    
    } 

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {        
        ViewHolder holder;        
        if (convertView == null) {  
            convertView = mInflater.inflate(R.layout.main_button_layout, null);
            holder = new ViewHolder();
            holder.icon = (ImageView)convertView.findViewById(R.id.ImageViewButton);
            holder.text = (TextView)convertView.findViewById(R.id.TextViewButton);
            convertView.setTag(holder);

        } 
        else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.icon.setImageResource(arraylist.get(position).getIcon());
        holder.text.setText(arraylist.get(position).getIcontxt());
        return convertView;
    }
    static class ViewHolder {
        ImageView icon;
        TextView text;
    }
}
字符串数组:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="item1">
        <item>icon1.png</item>
        <item>item 1</item>
    </string-array>
    <string-array name="item2">
        <item>icon2.png</item>
        <item>item 2</item>
    </string-array>
    <string-array name="item3">
        <item>icon3.png</item>
        <item>item 3</item>
    </string-array>
    <string-array name="item4">
        <item>icon4.png</item>
        <item>item 4</item>
    </string-array>
</resources>

icon1.png
项目1
icon2.png
项目2
icon3.png
项目3
icon4.png
项目4
视图的标准布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:background="@drawable/background_main_button" >

    <ImageView 
        android:id="@+id/ImageViewButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </ImageView>
    <TextView 
        android:id="@+id/TextViewButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingTop="2dp">
    </TextView>
</LinearLayout>

最后是主要活动:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;


public class MainActivity extends Activity {
    /** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);    

    GridView gridview = (GridView) findViewById(R.id.gridview);    
    gridview.setAdapter(new MainButtonAdapter(this));    

    gridview.setOnItemClickListener(new OnItemClickListener() {        
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {            
            Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();        
        }    
    });
}
} 
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.GridView;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView GridView=(GridView)findViewById(R.id.GridView);
setAdapter(新的MainButtonAdapter(this));
gridview.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
Toast.makeText(MainActivity.this,“+”位置,Toast.LENGTH_SHORT.show();
}    
});
}
} 

从源代码看,似乎有多个数组,每个数组将一个图像映射到一些文本。你想要的基本上是一个网格视图,在同一行上显示图像和文本?网格视图可能不是最佳选择,列表视图可能是更好的选择。具有包含文本和图像视图的自定义行的列表视图

在您的代码中,我看不到实际使用的数组,除非您故意忽略它。另外,您已经像这样初始化了适配器

new MainButtonAdapter(this)
但是您的适配器接受一个上下文和一个ArrayList

public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input)
然后从这些数组中创建一个MainButtonObject

MainButtonObject mbo1 = new MainButtonObject(item1[0],item1[1]);
MainButtonObject mbo2 = new MainButtonObject(item2[0],item2[1]);
MainButtonObject mbo3 = new MainButtonObject(item3[0],item3[1]);
MainButtonObject mbo4 = new MainButtonObject(item4[0],item4[1]);
然后将所有这些添加到ArrayList

ArrayList<MainButtonObject> list = new ArrayList<MainButtonObject>();
list.add(mbo1);
list.add(mbo2);
list.add(mbo3);
list.add(mbo4);
在适配器中,我注意到您

holder.icon.setImageResource(arraylist.get(position).getIcon());
这是一个字符串,在本例中无效,因为setImageResource()接受一个整数,该整数是您要访问的资源的ID:

因此,图标需要位于res/drawable目录中,然后您可以通过、R.drawable.icon1等访问它们


我不知道这是否是您正在寻找的答案,但我确实希望它能有所帮助:)

不要担心
重新使用
行,Android会为您这样做的。:)Android只分配那些可以让用户看到的行,而滚动时,它只是循环使用。如果您注意到
getView
方法,您会注意到,
convertView
首先被检查是否被重用或未初始化。
ArrayList<MainButtonObject> list = new ArrayList<MainButtonObject>();
list.add(mbo1);
list.add(mbo2);
list.add(mbo3);
list.add(mbo4);
gridview.setAdapter(new MainButtonAdapter(this,list));
holder.icon.setImageResource(arraylist.get(position).getIcon());