Изменение ширины отдельных элементов в списке

Так что я искал ответ или возможное решение этой проблемы в течение пары недель и до сих пор не получил дальше. Я работаю над созданием приложения, которое награждает пользователей баллами за определенные вещи. Одна из страниц, которую они могут посетить, - это таблица лидеров, основанная на друзьях пользователя. Я могу реализовать таблицу лидеров и распечатать пользователей в порядке, основанном на их точках, но не могу реализовать стиль гистограммы. Как и так: http://imgur.com/tF51RsA (пришлось опубликовать ссылку, потому что я не могу вставить изображение здесь)

Вот что я пробовал до сих пор: 1. Добавить a в xml и попытаться получить getLayoutParams в пользовательском адаптере, а затем установить ширину, что не сработало. 2. используя onDraw, чтобы нарисовать прямоугольник поверх элемента списка.

Вот мой XML-файл Leader board (или близко к нему):

<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/leader_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left|top"
        android:background="#00000000">

</LinearLayout>

Моя строка списка просмотра xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frame"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"> 

        <ImageView
             android:id="@+id/user_image"
             android:layout_width="40dp"
             android:layout_height="40dp"
             android:layout_alignParentLeft="true"
             android:layout_alignParentTop="true"
             android:layout_centerVertical="true"
             android:background="@drawable/ic_default_user"/>

         <TextView
             android:id="@+id/rank"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
             android:paddingLeft="10dp"
             android:layout_toRightOf="@+id/user_image"/>

         <TextView
             android:id="@+id/user_name"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
             android:paddingLeft="20dp"
             android:textSize="16sp"
             android:layout_toRightOf="@+id/rank"/>

         <TextView
             android:id="@+id/score"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
             android:layout_toRightOf="@+id/user_name"
             android:gravity="right"
             android:paddingRight="15dp"/>

    </RelativeLayout>

</FrameLayout>

и мой пользовательский ArrayAdapter в моем классе лидеров

public class LeaderAdapter extends ArrayAdapter<LeaderboardDM>{
    ArrayList<LeaderboardDM> leaders;
    int layoutResourceId;

    public LeaderAdapter(Context context, int layoutResourceId, ArrayList<LeaderboardDM> leaders){
        super(context, layoutResourceId, leaders);
        this.leaders = new ArrayList<LeaderboardDM>();
        this.leaders = leaders;
        this.layoutResourceId = layoutResourceId;
    }

    public View getView(int position, View convertView, ViewGroup parent){
        View v = convertView;
        ViewHolder viewHolder = null;
        if(v == null){
            v = getLayoutInflater().inflate(layoutResourceId, null, false);
            viewHolder = new ViewHolder();
            viewHolder.userImage = (ImageView) v.findViewById(R.id.user_image);
            viewHolder.rank = (TextView) v.findViewById(R.id.rank);
            viewHolder.userName = (TextView) v.findViewById(R.id.user_name);
            viewHolder.score = (TextView) v.findViewById(R.id.score);
            v.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) v.getTag();
        }
        LeaderboardDM lead = leaders.get(position);
        if(lead != null){
            //doesn't set user image yet
            viewHolder.userName.setText(lead.user);
            viewHolder.score.setText(String.valueOf(lead.points));
            viewHolder.rank.setText("#"+String.valueOf(position+1));

        }
        return v;
    }
    class ViewHolder{
        ImageView userImage;
        TextView rank, userName, score;

    }
}

и класс лидеровДМ

public class LeaderboardDM{
    public String user;
    public int points;
    public String profilePicUrl;

    public void setUserName(String user){
        this.user = user;
    }
    public String getUserName(){
        return user;
    }
    public void setPoints(int points){
        this.points = points;
    }
    public int getPoints(){
        return points;
    }
    public void setProfilePic(String url){
        this.profilePicUrl = url;
    }
    public String getProfilePicUrl(){
        return profilePicUrl;
    }
}

Список сортируется с помощью компаратора и снова печатается в порядке их оценки. Если у кого-то есть идея, как создать что-то подобное, пожалуйста, помогите указать мне правильное направление.

Спасибо!

Изменить: Благодаря @Ridcully мне удалось решить эту проблему. В будущем решение отлично работало для любого, кто может это сделать, заключалось в том, чтобы создать пользовательский индикатор выполнения и получить отрисовку из ресурсов, а затем установить ProgressDrawable для этого отрисовки. Оттуда я бы установил ширину с помощью setProgress(int width).

1 ответ

Решение

Вы могли бы использовать RelativeLayout и положить ProgressBar (с настроенным drawable) в спине. Таким образом, вы можете установить ширину полосы простым setProgress(),

Другие вопросы по тегам