【问题标题】:Changing list item background color更改列表项背景颜色
【发布时间】:2017-01-30 09:02:05
【问题描述】:

我有两个 ListView 在屏幕上分开。我想实现以下目标: 单击顶部列表项会更改其背景颜色,以及底部列表中相同位置的项的背景颜色。

我有以下问题: 底部列表项的背景仅在我将其从屏幕上滚动并将其滚动回屏幕后才会发生变化。如何立即更改颜色?

另外,如何更改单个项目的背景颜色?现在,当我单击一个项目时,它会改变它的颜色,当我单击另一个列表项时,前一个项目保持彩色。我想一次为 1 个列表项着色。我该怎么做?

这是我的代码...

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    ListView listViewTop, listViewBottom;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listViewTop = (ListView) findViewById(R.id.list1);
        listViewBottom = (ListView) findViewById(R.id.list2);

        CustomAdapter customAdapter = new CustomAdapter(this, addUsersToList());

        listViewTop.setAdapter(customAdapter);
        listViewBottom.setAdapter(customAdapter);

    }

    private ArrayList<Model> addUsersToList() {
        ArrayList<Model> modelList = new ArrayList<>();

        modelList.add(new Model("John"));
        modelList.add(new Model("Mary"));
        modelList.add(new Model("Bob"));
        modelList.add(new Model("Tom"));
        modelList.add(new Model("Danny"));
        modelList.add(new Model("Mike"));
        modelList.add(new Model("Ron"));
        modelList.add(new Model("Harry"));
        modelList.add(new Model("Dan"));

        return modelList;
    }

}

CustomAdapter.java:

public class CustomAdapter extends ArrayAdapter<Model> {
    private static class ViewHolder {
        TextView userTextView;
    }

    public CustomAdapter(Context context, ArrayList<Model> usersArray) {
        super(context, 0, usersArray);
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Model currentUser = getItem(position);
        View userRowView = convertView;
        final ViewHolder viewHolder;

        if (userRowView == null) {
            viewHolder = new ViewHolder();
            userRowView = LayoutInflater.from(getContext()).inflate(
                    R.layout.user_layout, parent, false);

            viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);

            final View finalUserRowView = userRowView;
            viewHolder.userTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentUser.setClicked(true);
                    finalUserRowView.setBackgroundColor(Color.YELLOW);
                }
            });
            userRowView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) userRowView.getTag();
        }

        viewHolder.userTextView.setText(currentUser.getUserName());

        if (currentUser.isClicked())
            userRowView.setBackgroundColor(Color.YELLOW);
        else
            userRowView.setBackgroundColor(Color.WHITE);

        return userRowView;
    }
}

模型.java:

public class Model {

    private String userName;
    private boolean isClicked;

    public Model(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public boolean isClicked() {
        return isClicked;
    }

    public void setClicked(boolean clicked) {
        isClicked = clicked;
    }
}

编辑:解决了我的问题,感谢您的帮助。这是我的适配器:

private static Model mSelectedUser = null;

private static class ViewHolder {
    TextView userTextView;
}

public CustomAdapter(Context context, ArrayList<Model> usersArray) {
    super(context, 0, usersArray);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Model currentUser = getItem(position);
    View userRowView = convertView;
    final ViewHolder viewHolder;

    if (userRowView == null) {
        viewHolder = new ViewHolder();
        userRowView = LayoutInflater.from(getContext()).inflate(
                R.layout.user_layout, parent, false);
        viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);
        userRowView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) userRowView.getTag();
    }

    viewHolder.userTextView.setText(currentUser.getUserName());

    userRowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mSelectedUser != null)
                mSelectedUser.setClicked(false);

            mSelectedUser = currentUser;
            mSelectedUser.setClicked(true);

            notifyDataSetChanged();
        }
    });

    if (currentUser.isClicked()) {
        userRowView.setBackgroundColor(Color.YELLOW);
        ((ListView) parent).setSelection(position);
        parent.requestFocus();
    }
    else
        userRowView.setBackgroundColor(Color.TRANSPARENT);

    return userRowView;
}

【问题讨论】:

  • 没有适合你的解决方案??
  • 不是我真正想要的,我用解决方案编辑了我的原始帖子。

标签: android


【解决方案1】:

你应该去 layout 和 android: background = "" 在这里添加你的自定义颜色 像这样:

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"/>

【讨论】:

    【解决方案2】:

    对于最后一个问题,您必须将上一个彩色项目的颜色更改为默认颜色,或者您可以将所有项目颜色更改为默认颜色,然后更改所选项目颜色。 对于其他问题,您可以使用这个:
    myListView.invalidateViews();

    【讨论】:

      【解决方案3】:

      希望对你有帮助 您可以使用选择器。更改颜色值并根据需要修改以下内容。

      drawable 文件夹中的backgroundlistview.xml

      <?xml version="1.0" encoding="utf-8"?>
       <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_pressed="true" 
      android:drawable="@drawable/pressed" />
        <item  android:state_focused="false" 
             android:drawable="@drawable/normal" />
        </selector>
      

      drawable 文件夹中的pressed.xml

      <?xml version="1.0" encoding="UTF-8"?> 
       <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
       <solid android:color="#FF1A47"/>  // color   
        <stroke android:width="3dp"
          android:color="#0FECFF"/> // border
          <padding android:left="5dp"
           android:top="5dp"
           android:right="5dp"
           android:bottom="5dp"/> 
         <corners android:bottomRightRadius="7dp" // for rounded corners
           android:bottomLeftRadius="7dp" 
           android:topLeftRadius="7dp"
           android:topRightRadius="7dp"/> 
        </shape>
      

      drawable 文件夹中的 normal.xml

      <?xml version="1.0" encoding="UTF-8"?> 
       <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <solid android:color="#FFFFFF"/>    
        <stroke android:width="3dp"
          android:color="#0FECFF" />
      
         <padding android:left="5dp"
           android:top="5dp"
           android:right="5dp"
           android:bottom="5dp"/> 
          <corners android:bottomRightRadius="7dp"
           android:bottomLeftRadius="7dp" 
           android:topLeftRadius="7dp"
           android:topRightRadius="7dp"/> 
         </shape>
      

      将背景drawable设置为listview自定义布局,为每一行充气

      我建议使用带有自定义适配器的自定义列表视图。

      android:background="@drawable/backgroundlistview"    
      

      如果您没有使用自定义适配器,您可以将 listselector 设置为 listview,如下所示

        android:listSelector="@drawable/backgroundlistview" 
      

      【讨论】:

        【解决方案4】:

        试试这个:在你的活动中

         listViewTop.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
         listViewBottom.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
         listViewTop.setSelector(android.R.color.holo_blue_light); // replace with your color
         listViewBottom.setSelector(android.R.color.holo_blue_light);
        

        【讨论】:

          【解决方案5】:
          1. 将 singleChoice 指定为choiceMode
          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:id="@+id/activity_main"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:paddingBottom="@dimen/activity_vertical_margin"
              android:paddingLeft="@dimen/activity_horizontal_margin"
              android:paddingRight="@dimen/activity_horizontal_margin"
              android:paddingTop="@dimen/activity_vertical_margin"
              tools:context="com.prgmaker.background_color_list.MainActivity">
          
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="List1"
                  android:textAppearance="@style/TextAppearance.AppCompat.Large"
                  android:textColor="#0000ff" />
          
              <ListView
                  android:id="@+id/list1"
                  android:layout_width="match_parent"
                  android:layout_height="0dp"
                  android:layout_weight="1"
                  android:choiceMode="singleChoice" />
          
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="List2"
                  android:textAppearance="@style/TextAppearance.AppCompat.Large"
                  android:textColor="#0000ff" />
          
              <ListView
                  android:id="@+id/list2"
                  android:layout_width="match_parent"
                  android:layout_height="0dp"
                  android:layout_weight="1"
                  android:choiceMode="singleChoice" />
          </LinearLayout>
          
          1. 创建Checkable Layout,当用户点击ListView中的一个item时,允许自动修改checked状态,实现android.widge.Cheackable接口。
          public class CheckableLinearLayout extends LinearLayout implements Checkable {
              private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
          
              private boolean mChecked = false;
          
              public CheckableLinearLayout(Context context, AttributeSet attrs) {
                  super(context, attrs);
              }
          
              public boolean isChecked() {
                  return mChecked;
              }
          
              public void setChecked(boolean b) {
                  if (b != mChecked) {
                      mChecked = b;
                      refreshDrawableState();
                  }
              }
          
              public void toggle() {
                  setChecked(!mChecked);
              }
          
              @Override
              public int[] onCreateDrawableState(int extraSpace) {
                  final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
                  if (isChecked()) {
                      mergeDrawableStates(drawableState, CHECKED_STATE_SET);
                  }
                  return drawableState;
              }
          }
          

          1. 为 ListView 的项定义 StateListDrawable
          <?xml version="1.0" encoding="utf-8"?>
          <selector xmlns:android="http://schemas.android.com/apk/res/android">
              <item android:drawable="@android:color/holo_orange_light" android:state_checked="true" />
              <item android:drawable="@android:color/white" />
          </selector>
          

          1. 定义项目布局,其中背景颜色将更改为选中状态
          <com.prgmaker.background_color_list.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@drawable/list_item_background"
              android:gravity="center_vertical"
              android:minHeight="?android:listPreferredItemHeight"
              android:orientation="horizontal"
              android:paddingLeft="8dp"
              android:paddingRight="8dp">
          
              <TextView
                  android:id="@+id/userTextView"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:paddingLeft="15dp"
                  android:paddingStart="15dp"
                  android:textAppearance="?android:textAppearanceMedium"
                  android:textColor="@color/colorAccent" />
          
          </com.prgmaker.background_color_list.CheckableLinearLayout>
          
          1. 除查看相关代码外,删除点击相关代码。
          public class CustomAdapter extends ArrayAdapter<Model> {
              public CustomAdapter(Context context, ArrayList<Model> usersArray) {
                  super(context, 0, usersArray);
              }
          
              @NonNull
              @Override
              public View getView(int position, View convertView, ViewGroup parent) {
                  final Model currentUser = getItem(position);
                  View userRowView = convertView;
                  final ViewHolder viewHolder;
          
                  if (userRowView == null) {
                      viewHolder = new ViewHolder();
                      userRowView = LayoutInflater.from(getContext()).inflate(
                              R.layout.user_layout, parent, false);
          
                      viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);
                      userRowView.setTag(viewHolder);
                  } else {
                      viewHolder = (ViewHolder) userRowView.getTag();
                  }
          
                  viewHolder.userTextView.setText(currentUser.getUserName());
                  return userRowView;
              }
          
              private static class ViewHolder {
                  TextView userTextView;
              }
          }
          
          1. 最后,在 listViewTop(list1) 和 listViewBottm(list2) 之间同步检查状态
          listViewTop.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                      @Override
                      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                          listViewBottom.setItemChecked(position, true);
                      }
                  });
          

          【讨论】:

            【解决方案6】:

            您只需更换适配器即可。

            public class CustomAdapter extends ArrayAdapter<Model> {
                private static class ViewHolder {
                    TextView userTextView;
                }
            
                public CustomAdapter(Context context, ArrayList<Model> usersArray) {
                    super(context, 0, usersArray);
                }
            
                @NonNull
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    final Model currentUser = getItem(position);
                    View userRowView = convertView;
                    final ViewHolder viewHolder;
            
                    if (userRowView == null) {
                        viewHolder = new ViewHolder();
                        userRowView = LayoutInflater.from(getContext()).inflate(
                                R.layout.user_layout, parent, false);
            
                        viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);
            
                        final View finalUserRowView = userRowView;
                        viewHolder.userTextView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
            Object posTag = v.getTag("pos");
            if(pasTag != null) {
            int pos = (int)posTag;
            Model model = getItem(pos);
            model.setClicked(true);
            }
                        }});
                        userRowView.setTag(viewHolder);
                    } else {
                        viewHolder = (ViewHolder) userRowView.getTag();
                    }
            
                    viewHolder.userTextView.setText(currentUser.getUserName());
            viewHolder.userTextView.setTag("pos",position);
            
                    if (currentUser.isClicked())
                        userRowView.setBackgroundColor(Color.YELLOW);
                    else
                        userRowView.setBackgroundColor(Color.WHITE);
            
                    return userRowView;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-19
              • 1970-01-01
              • 2012-10-23
              • 2016-01-15
              • 1970-01-01
              • 1970-01-01
              • 2019-12-08
              • 2011-01-09
              相关资源
              最近更新 更多