如何使用 BaseAdapter 刷新包含文本和图像的列表视图?
How do I refresh a listview with text and image using BaseAdapter?
我需要一些帮助来刷新我的列表视图数据。
我按照 this 教程制作了一个列表视图。
这里是:
ListAdapter.java:
package com.sanktips.customlistviewexample;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class ListAdapter extends BaseAdapter {
Context context;
private final String [] values;
private final String [] numbers;
private final int [] images;
public ListAdapter(Context context, String [] values, String [] numbers, int [] images){
//super(context, R.layout.single_list_app_item, utilsArrayList);
this.context = context;
this.values = values;
this.numbers = numbers;
this.images = images;
}
@Override
public int getCount() {
return values.length;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.single_list_item, parent, false);
viewHolder.txtName = (TextView) convertView.findViewById(R.id.aNametxt);
viewHolder.txtVersion = (TextView) convertView.findViewById(R.id.aVersiontxt);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.appIconIV);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
viewHolder.txtName.setText(values[position]);
viewHolder.txtVersion.setText("Version: "+numbers[position]);
viewHolder.icon.setImageResource(images[position]);
return convertView;
}
private static class ViewHolder {
TextView txtName;
TextView txtVersion;
ImageView icon;
}
}
MainActivity.java 文件:
package com.sanktips.customlistviewexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ListView lView;
ListAdapter lAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] images = {R.drawable.alpha, R.drawable.beta, R.drawable.cupcake, R.drawable.donut, R.drawable.eclair, R.drawable.froyo, R.drawable.gingerbread, R.drawable.honeycomb, R.drawable.icecreamsandwich, R.drawable.jellybean, R.drawable.kitkat, R.drawable.lollipop, R.drawable.marshmallow, R.drawable.nougat};
String[] version = {"Android Alpha", "Android Beta", "Android Cupcake", "Android Donut", "Android Eclair", "Android Froyo", "Android Gingerbread", "Android Honeycomb", "Android Ice Cream Sandwich", "Android JellyBean", "Android Kitkat", "Android Lollipop", "Android Marshmallow", "Android Nougat"};
String[] versionNumber = {"1.0", "1.1", "1.5", "1.6", "2.0", "2.2", "2.3", "3.0", "4.0", "4.1", "4.4", "5.0", "6.0", "7.0"};
lView = (ListView) findViewById(R.id.androidList);
lAdapter = new ListAdapter(MainActivity.this, version, versionNumber, images);
lView.setAdapter(lAdapter);
lView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, version[i]+" "+versionNumber[i], Toast.LENGTH_SHORT).show();
}
});
}
}
出于某种原因,当我在我的列表适配器上调用 notifySetDataChanged
时,它不起作用。
我也尝试重新创建适配器,但它没有更新。
谁能帮我正确刷新列表视图?
当您调用 notifyDataSetChanged()
时,您必须提供新的数据源。如果您只调用 notifyDataSetChanged()
而没有任何新数据,您的列表将不会刷新。因此,在调用 notifyDataSetChanged()
之前尝试更新您在构造函数中传递的数组数据。但在适配器内部添加更新功能是一个好习惯。此外,您可以使用 ArrayList 而不是简单的数组。
我需要一些帮助来刷新我的列表视图数据。
我按照 this 教程制作了一个列表视图。
这里是:
ListAdapter.java:
package com.sanktips.customlistviewexample;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class ListAdapter extends BaseAdapter {
Context context;
private final String [] values;
private final String [] numbers;
private final int [] images;
public ListAdapter(Context context, String [] values, String [] numbers, int [] images){
//super(context, R.layout.single_list_app_item, utilsArrayList);
this.context = context;
this.values = values;
this.numbers = numbers;
this.images = images;
}
@Override
public int getCount() {
return values.length;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.single_list_item, parent, false);
viewHolder.txtName = (TextView) convertView.findViewById(R.id.aNametxt);
viewHolder.txtVersion = (TextView) convertView.findViewById(R.id.aVersiontxt);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.appIconIV);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
viewHolder.txtName.setText(values[position]);
viewHolder.txtVersion.setText("Version: "+numbers[position]);
viewHolder.icon.setImageResource(images[position]);
return convertView;
}
private static class ViewHolder {
TextView txtName;
TextView txtVersion;
ImageView icon;
}
}
MainActivity.java 文件:
package com.sanktips.customlistviewexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ListView lView;
ListAdapter lAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] images = {R.drawable.alpha, R.drawable.beta, R.drawable.cupcake, R.drawable.donut, R.drawable.eclair, R.drawable.froyo, R.drawable.gingerbread, R.drawable.honeycomb, R.drawable.icecreamsandwich, R.drawable.jellybean, R.drawable.kitkat, R.drawable.lollipop, R.drawable.marshmallow, R.drawable.nougat};
String[] version = {"Android Alpha", "Android Beta", "Android Cupcake", "Android Donut", "Android Eclair", "Android Froyo", "Android Gingerbread", "Android Honeycomb", "Android Ice Cream Sandwich", "Android JellyBean", "Android Kitkat", "Android Lollipop", "Android Marshmallow", "Android Nougat"};
String[] versionNumber = {"1.0", "1.1", "1.5", "1.6", "2.0", "2.2", "2.3", "3.0", "4.0", "4.1", "4.4", "5.0", "6.0", "7.0"};
lView = (ListView) findViewById(R.id.androidList);
lAdapter = new ListAdapter(MainActivity.this, version, versionNumber, images);
lView.setAdapter(lAdapter);
lView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, version[i]+" "+versionNumber[i], Toast.LENGTH_SHORT).show();
}
});
}
}
出于某种原因,当我在我的列表适配器上调用 notifySetDataChanged
时,它不起作用。
我也尝试重新创建适配器,但它没有更新。
谁能帮我正确刷新列表视图?
当您调用 notifyDataSetChanged()
时,您必须提供新的数据源。如果您只调用 notifyDataSetChanged()
而没有任何新数据,您的列表将不会刷新。因此,在调用 notifyDataSetChanged()
之前尝试更新您在构造函数中传递的数组数据。但在适配器内部添加更新功能是一个好习惯。此外,您可以使用 ArrayList 而不是简单的数组。