Android 使用ViewHolder设置图像和文本
我无法从getView()函数访问图像和音频数组。我已经注释掉了我尝试过的语句。这些注释位于代码的底部,在ViewHolder类之前 我尝试过使用如下语句:Android 使用ViewHolder设置图像和文本,android,performance,android-layout,android-listview,android-fragments,Android,Performance,Android Layout,Android Listview,Android Fragments,我无法从getView()函数访问图像和音频数组。我已经注释掉了我尝试过的语句。这些注释位于代码的底部,在ViewHolder类之前 我尝试过使用如下语句: holder.imageView.setImageResource(images[position]); holder.textView.setText(audio[position]); 但是图像和音频阵列无法从该位置访问。如何从getView()访问它们 import java.util.ArrayList; 导入android.co
holder.imageView.setImageResource(images[position]);
holder.textView.setText(audio[position]);
但是图像和音频阵列无法从该位置访问。如何从getView()访问它们
import java.util.ArrayList;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Color;
导入android.graphics.Typeface;
导入android.media.MediaPlayer;
导入android.os.Bundle;
导入android.provider.MediaStore.Images;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.TextView;
公共类MyList扩展了片段{
列表视图列表;
MediaPlayer mp;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
mp=MediaPlayer.create(getActivity(),R.raw.wave1);
返回充气机。充气(R.layout.mylistview,容器,假);
}
@凌驾
public void onStart(){
super.onStart();
list=(ListView)getView().findViewById(R.id.listView1);
setAdapter(新的MyAdapter(getActivity());
setCacheColorHint(Color.TRANSPARENT);
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共单击(适配器视图arg0,视图arg1,内部位置,
长arg3)
{
开关(位置)
{
案例0:
mp.release();
mp=MediaPlayer.create(getActivity(),R.raw.wave1);
mp.start();
}
}
});
}
}
类MyAdapter扩展了BaseAdapter
{
数组列表;
语境;
公共MyAdapter(上下文c)
{
上下文=c;
列表=新的ArrayList();
Resources res=c.getResources();
String[]audio=res.getStringArray(R.array.audio);
int[]图像={
R.drawable.image,
};
对于(inti=0;i类MyAdapter扩展BaseAdapter)
{
数组列表;
语境;
//只需将它们声明为类成员
int[]图像=null;
字符串[]音频=null;
公共MyAdapter(上下文c)
{
上下文=c;
列表=新的ArrayList();
//初始化它们。。。
Resources res=c.getResources();
audio=res.getStringArray(R.array.audio);
images1=新int[]{R.drawable.image};
//注意到你只有一个元素,
//虽然我不建议对职位进行硬编码,
//我添加它是为了编译
添加(新的单行(音频[0],图像[0]);
//…还有其他
}
在类级别而不是在类构造函数内部声明这两个属性,这样您就可以在整个类中访问它们。与您在MyAdapter
中声明和初始化上下文和列表一样,感谢您的回复。将它们移出构造函数后,list.setAdapter(新建MyAdapter(getActivity());捕捉到一条红线,表示“构造函数MyAdapter(FragmentActivity)未定义”。因此我尝试了两件事。首先,注释掉它,应用程序在屏幕上没有任何列表视图的情况下运行(它是空的)。其次,我尝试按要求创建一个空构造函数,但程序崩溃了。谢谢,但现在在应用程序启动时,片段是空的。没有视图。注意到有一些错误,代码无法编译。编辑了答案以反映这一点。关于片段问题,请确保将片段附加到cor响应碎片活动:
import java.util.ArrayList;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.provider.MediaStore.Images;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MyList extends Fragment {
ListView list;
MediaPlayer mp;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedinstanceState)
{
mp=MediaPlayer.create(getActivity(), R.raw.wave1);
return inflater.inflate(R.layout.mylistview, container, false);
}
@Override
public void onStart() {
super.onStart();
list=(ListView)getView().findViewById(R.id.listView1);
list.setAdapter(new MyAdapter(getActivity()));
list.setCacheColorHint(Color.TRANSPARENT);
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3)
{
switch(position)
{
case 0:
mp.release();
mp=MediaPlayer.create(getActivity(), R.raw.wave1);
mp.start();
}
}
});
}
}
class MyAdapter extends BaseAdapter
{
ArrayList<SingleRow> list;
Context context;
public MyAdapter(Context c)
{
context=c;
list=new ArrayList<SingleRow>();
Resources res=c.getResources();
String[] audio=res.getStringArray(R.array.audio);
int[] images={
R.drawable.image,
};
for(int i=0;i<2;i++)
{
list.add(new SingleRow(audio[i],images[i]));
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row=convertView;
MyViewHolder holder=null;
if(row==null)
{
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row=inflater.inflate(R.layout.list_rows, parent, false);
holder=new MyViewHolder(row);
row.setTag(holder);
}
else
{
holder=(MyViewHolder)row.getTag();
}
/* The following two statements don't work, because images and the audio array are not accessible.
holder.imageView.setImageResource(images[position]);
holder.textView.setText(audio[position]);
*/
return row;
}
class MyViewHolder
{
ImageView imageView;
TextView textView;
MyViewHolder(View v)
{
textView=(TextView)v.findViewById(R.id.textView1);
imageView=(ImageView)v.findViewById(R.id.imageView1);
}
}
class SingleRow
{
String audio;
int image;
SingleRow(String audio, int image)
{
this.audio=audio;
this.image=image;
}
}
}
class MyAdapter extends BaseAdapter
{
ArrayList<SingleRow> list;
Context context;
int[] images1 = null;
String[] audio = null;
public MyAdapter(Context c) {
context=c;
list=new ArrayList<SingleRow>();
//Initialize them...
Resources res=c.getResources();
audio = res.getStringArray(R.array.audio);
int[] images1={
R.drawable.image,
};
for(int i=0;i<2;i++)
{
list.add(new SingleRow(audio[i],images1[i]));
}
}
Resources res=context.getResources();
String[] audio=res.getStringArray(R.array.audio);
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row=convertView;
MyViewHolder holder=null;
if(row==null)
{
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row=inflater.inflate(R.layout.list_rows, parent, false);
holder=new MyViewHolder(row);
row.setTag(holder);
}
else
{
holder=(MyViewHolder)row.getTag();
}
holder.imageView.setImageResource(images1[position]);
holder.textView.setText(audio[position]);
return row;
}
class MyViewHolder
{
ImageView imageView;
TextView textView;
MyViewHolder(View v)
{
textView=(TextView)v.findViewById(R.id.textView1);
imageView=(ImageView)v.findViewById(R.id.imageView1);
}
}
class SingleRow
{
String audio;
int image;
SingleRow(String audio, int image)
{
this.audio=audio;
this.image=image;
}
}
}
class MyAdapter extends BaseAdapter
{
ArrayList<SingleRow> list;
Context context;
//Just declare them as class members
int[] images = null;
String[] audio = null;
public MyAdapter(Context c)
{
context=c;
list=new ArrayList<SingleRow>();
//Initialize them...
Resources res=c.getResources();
audio = res.getStringArray(R.array.audio);
images1= new int[] { R.drawable.image };
//Noticed you only have an element,
//while I do not recommend to hardcode the positions,
//I added it for compilation's sake
list.add(new SingleRow(audio[0],images[0]));
//... And the rest
}