我正在尝试显示带有彩色背景项的ListView
。每行应具有不同的渐变背景。我搜索了一段时间,但无法解决我的问题。现在每行都有相同的背景 - 上次保存的个人资料。此外,我未能将渐变设置为使用TextView
作为背景的rounded.xml
的背景。谢谢你的帮助。
这是我的CustomAdapter
:
public class CustomAdapterProfiles extends ArrayAdapter<Profile> {
private static final String TAG = "MyActivity";
ArrayList<Profile> myArrayList = null;
PaintDrawable paint;
int[] arrColors;
int numColors;
float[] result;
Profile i;
CustomAdapterProfiles(Context context, ArrayList<Profile> menuAdapter){
super(context, R.layout.customrow , menuAdapter);
this.myArrayList = menuAdapter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater listInflater = LayoutInflater.from(getContext());
View customView = listInflater.inflate(R.layout.customrow, parent, false);
i = myArrayList.get(position);
String singleItem = i.getObjectName();
TextView mobileText = (TextView) customView.findViewById(R.id.listID);
mobileText.setText(singleItem);
numColors = i.getArrayList().size();
arrColors = new int[i.getArrayList().size()];
if (numColors>1) {
//positions of colors defined by user
result = new float[numColors];
for (int a = 0; a < numColors; a++) {
result[a] = (float) i.getGradients().get(a);
}
//make sure user didnt write error values (not fixed yet)
result[0]=0;
result[numColors - 1] = 1;
//colors
for (int j = 0; j < numColors; j++) {
arrColors[j] = Integer.parseInt(i.getArrayList().get(j).toString(), 16) + 0xFF000000;
}
ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient linearGradient = new LinearGradient(0, 0, width, height,
arrColors, //pouzity array farieb
result,
Shader.TileMode.REPEAT);
return linearGradient;
}
};
paint = new PaintDrawable();
paint.setShape(new RectShape());
paint.setShaderFactory(shaderFactory);
mobileText.setBackgroundDrawable((Drawable) paint);
}
else {
//cant set shaderFactory becouse it needs 2 or more colors
mobileText.getBackground().setColorFilter(Color.parseColor("#" + i.getArrayList().get(0).toString()), PorterDuff.Mode.SRC_ATOP);
}
return customView;
}
}
答案 0 :(得分:0)
从列表项的布局中删除背景集。从您的代码中,我看到您为每个列表项使用的布局为customrow.xml
。那里你可能有rounded.xml
背景。删除该行。
现在关于为每个列表项显示正确的颜色......
从图片中我可以看到你正在设置一些渐变,所以我猜你可以正确生成渐变。
现在我可以从您的代码中看到,您为ListView
的每个项目设置了相同的颜色。所以我猜你误解了getView()
函数的行为。所以我在这里清除这个想法。
getView()
显示在屏幕上,就会为{p> ListView
调用ListView
。假设您的列表中有20个项目。现在当第一次加载列表时,让我们猜测屏幕上会显示前7个项目,并且您要滚动查看其他项目。
现在,ListView
如何重新循环已生成的视图。 getView()
不会一次填充所有20个项目。相反,它填充屏幕中显示的前7个。因此,第一次调用getView()
函数7次以填充屏幕中可见的每个项目。滚动列表时,将再次为列表中的每个新可见项调用int[] arrColors = {/* ..get the user input and populate the colour array outside of the adapter. */};
int numColors = 10; // I've just set a default value
函数。
希望你从解释中得到一个想法。现在,您可以通过以下方式解决问题。
让我们拍摄一组由用户定义的颜色。
getView
现在这是你的@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater listInflater = LayoutInflater.from(getContext());
View customView = listInflater.inflate(R.layout.customrow, parent, false);
// ... Set the text
// position of colors defined by user
// ... Get the user defined colour here.
Color color = arrColors[position];
// Now modify the colour as you wish
Paint paint = prepareTheBackground();
// Now set the colour as background
mobileText.setBackgroundDrawable((Drawable) paint);
return customView;
}
函数的伪代码。
{{1}}
答案 1 :(得分:0)
最大的问题(我猜是这个)是使用ArrayAdapter而不是BaseAdapter。我已经尝试过(作为noob android程序员)许多东西和教程,但在我尝试了这个之后:enter link description here它有效。此外,正如您所看到的,我找到了圆形textview的解决方案(在下面的代码中标记为&#34; ---&#34;)。行项目的名称设置为&#34;&#34;所以你看不到名字。
public class CustomListAdapter extends BaseAdapter {
private Context context; //context
private ArrayList<Profile> items; //data source of the list adapter
//public constructor
public CustomListAdapter(Context context, ArrayList<Profile> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return items.size(); //returns total of items in the list
}
@Override
public Object getItem(int position) {
return items.get(position); //returns list item at the specified position
}
@Override
public long getItemId(int position) {
return position;
}
public void updateResults(ArrayList<Profile> results) {
items = results;
//Triggers the list update
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.customrow, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// get current item to be displayed
Profile currentItem = (Profile) getItem(position);
viewHolder.itemName.setText(currentItem.getObjectName());
int numColors = currentItem.getArrayList().size();
if (numColors > 1) {
int[] arrColors = new int[numColors];
//positions of colors defined by user
final float[] result = new float[numColors];
for (int a = 0; a < numColors; a++) {
result[a] = (float) currentItem.getGradients().get(a);
}
//make sure user didnt write error values (not fixed yet)
result[0] = 0;
result[numColors - 1] = 1;
//colors
for (int j = 0; j < numColors; j++) {
arrColors[j] = Integer.parseInt(currentItem.getArrayList().get(j).toString(), 16) + 0xFF000000;
}
final int[] finalArrColors = arrColors;
ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient linearGradient = new LinearGradient(0, 0, width, height,
finalArrColors, //pouzity array farieb
result,
Shader.TileMode.REPEAT);
return linearGradient;
}
};
// --- rounded textView !
PaintDrawable paint = new PaintDrawable();
paint.setShape(new RectShape());
paint.setShaderFactory(shaderFactory);
paint.setCornerRadius(100);
// --- end of rounded textView code
viewHolder.itemName.setBackgroundDrawable(paint);
}
else if (numColors == 1) {
//not important
}
else {
viewHolder.itemName.setText("empty object");
}
return convertView;
}
private class ViewHolder {
TextView itemName;
public ViewHolder(View view) {
itemName = (TextView) view.findViewById(R.id.listID);
}
}
}
调用BaseAdapter:
CustomListAdapter adapter = new CustomListAdapter(this, profiles);
ListView menuListView = (ListView) findViewById(R.id.listViewHS);
menuListView.setAdapter(adapter);
adapter.updateResults(profiles);
个人资料类:
public class Profile implements Serializable {
private String objectName;
private ArrayList<String> arrayColorList;
private ArrayList<Float> gradients;
public Profile(String objectName, ArrayList<String> arrayList, ArrayList<Float> gradients){
this.objectName=objectName;
this.arrayColorList=arrayList;
this.gradients=gradients;
}
public String getObjectName() {
return objectName;
}
public ArrayList<String> getArrayList() {
return arrayColorList;
}
public ArrayList<Float> getGradients() {
return gradients;
}
}