将listview行的颜色填充到某个百分比

时间:2015-06-22 18:33:21

标签: android android-layout listview android-listview android-drawable

我正在尝试将列表视图的行填充到某个百分比的颜色。 这应该在用户点击任何列表项后完成。

很难说,所以请看下面的图片: enter image description here

请告诉我如何继续,我不知道如何实施。我正在考虑在用户点击事件后添加一个视图,并设置该视图的背景颜色。

如果可能的话,请告诉我。

由于

4 个答案:

答案 0 :(得分:3)

您可以为每个项目使用此布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:weightSum="100"
        android:baselineAligned="false">
        <View
            android:layout_weight="50"
            android:background="#0080FF"
            android:layout_width="0dp"
            android:layout_height="match_parent"/>
    </LinearLayout>

    <TextView
        android:text="@string/hello_world"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"/>
</RelativeLayout>

然后,通过修改最内层View的权重属性,您可以指定颜色宽度(以百分比表示)。这可以通过修改LayoutParams适配器内的视图ListView来完成。有关定制适配器和LayoutParam的大量教程,请点击此处。

以下是它的外观:

答案 1 :(得分:2)

我认为下面介绍了一个选项:

我会创建一个List视图,对于列表中的每个项目,我会创建两个视图:

  1. 一个TextView(显示文本选项) - &gt;默认是可见的
  2. 一个视图(如果用户在列表中单击,则绘制进度) - &gt;默认是不可见的。
  3. 注意:这个简单的View with progress将具有相同的TextView高度。它完全用背景颜色着色(例如蓝色)。然后,您可以通过设置其权重(从0到100)来设置此视图的长度。适配器将重量改变重量。您可以在布局资源文件(list_view_each_row.xml)中设置的其他属性。

    另外,我相信您必须创建自己的自定义列表适配器(如果列表应显示文本或进度,则要正确处理)。此自定义列表应扩展BaseAdapter,并应覆盖必需的方法。

    因此,在单击任何选项后,您可以更改您的适配器(您应该通知您的适配器用户在一些选项中使用了)。根据这些新信息,适配器可以隐藏所有TextView并仅显示带有进度的视图。

    下面是一个示例代码: 您可以在适配器中添加安全检查(null poiter)。我用了一个简单的数组。您可以更改为ArrayList并以dinamically方式添加/删除项目。此外,您只能在“OnItemClickListener”中设置进度值。这只是一个例子。

    <强> MainActivity

    public class MainActivity extends Activity {
    
        private MyCustomListAdapter adapter; 
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ((ListView) findViewById(R.id.list_view)).setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    // Force list view to populate its content again (now, with progress instead of text)
                    adapter.setIfUserAlreadyClickedOption(true);
                    adapter.notifyDataSetChanged();
                }
            });
    
            adapter = new MyCustomListAdapter();
    
            // Set click to false (user did not clicked yet)
            adapter.setIfUserAlreadyClickedOption(false);
    
            // Set text and progress
            adapter.setOptions(new String []{"Option1", "Option2", "Option3"});
            adapter.setProgressBarValues(new float [] {50,75,25});
            ((ListView)findViewById(R.id.list_view)).setAdapter(adapter);
        }
    }
    

    <强> MyCustomListAdapter.java

    public class MyCustomListAdapter extends BaseAdapter {
    
        private boolean userAlreadyCliced;
        private String [] stringTexts;
        private float [] progressBarValues;
    
        public MyCustomListAdapter() {
            userAlreadyCliced = false;
        }
    
        public void setIfUserAlreadyClickedOption(boolean clicked) {
            userAlreadyCliced = clicked;
        }
    
        public void setOptions(String  [] text) {
            stringTexts = text;
        }
    
        public void setProgressBarValues(float [] values) {
            progressBarValues = values;
        }
    
        @Override
        public int getCount() {
            return stringTexts.length;
        }
    
        @Override
        public Object getItem(int position) {
            return stringTexts[position];
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(int position, View view, ViewGroup parentViewGroup) {
            if(view == null) {
                view = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_view_each_row, parentViewGroup, false);
            }
    
            if(userAlreadyCliced) {
                // Hide Text
                view.findViewById(R.id.progress_view).setVisibility(View.VISIBLE);
    
                // Show Text and set progress
                ((LinearLayout.LayoutParams) view.findViewById(R.id.progress_view).getLayoutParams()).weight = progressBarValues[position];
                view.findViewById(R.id.text_view).setVisibility(View.GONE);
            } else {
                // Hide Progress
                view.findViewById(R.id.progress_view).setVisibility(View.GONE);
    
                // Show and set text
                view.findViewById(R.id.text_view).setVisibility(View.VISIBLE);
                ((TextView)view.findViewById(R.id.text_view)).setText(stringTexts[position]);
            }       
            return view;
        }
    }
    

    <强> activity_main.xml中

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    
        <ListView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
    
    </LinearLayout>
    

    <强> list_view_each_row.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="100" >
    
       <View
           android:id="@+id/progress_view"
           android:background="#0000FF"
           android:layout_width="0dp"
           android:layout_height="40dp"/>
    
        <TextView
            android:id="@+id/text_view"
            android:visibility="visible"
            android:layout_width="match_parent"
            android:layout_height="40dp" />
    
    </LinearLayout>
    

答案 2 :(得分:1)

您需要一个彩色组件来显示您的效果。

您可以使用背景颜色设置视图并添加到其他视图下。

或者,您可以覆盖视图并在绘图(画布)上绘制颜色。

答案 3 :(得分:1)

让我们假设您要放置一个需要左对齐的两个视图,其宽度应为百分比

你可以使用“android:layout_weight”来制作更大的一个

请参阅此Linear Layout and weight in Android

请参阅此Percentage width in a RelativeLayout