CustomAdapter不同的渐变列表项

时间:2016-08-27 00:09:46

标签: android listview background gradient

我正在尝试显示带有彩色背景项的ListView。每行应具有不同的渐变背景。我搜索了一段时间,但无法解决我的问题。现在每行都有相同的背景 - 上次保存的个人资料。此外,我未能将渐变设置为使用TextView作为背景的rounded.xml的背景。谢谢你的帮助。

Screenshot of my list

这是我的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;
    }
}

2 个答案:

答案 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;所以你看不到名字。

enter image description here

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;
}

}