当前位置: 首页 > 面试题库 >

单击时创建具有可选行的ListView /更改ListView行的背景颜色

巫马自明
2023-03-14
问题内容

问题

我正在尝试创建ListView带有可选项目的。我希望能够单击中的一个项目,ListView并使该项目在列表中更改颜色,然后继续对行中的数据进行其他处理。

我正在使用SimpleAdapter

如何做到这一点,以便当我点击一行时,它会变成不同的颜色,然后当我点击另一行时,新的行被选中并更改为新的颜色,而旧的行又变回普通颜色。 ?

到目前为止,这是我的代码。该DBTools班是有所有的数据,我想显示在我的ListView组织和照顾。该getAllReceivers()方法返回ArrayListHashMap<String, String>其中包含我所有数据的。

MainActivity.java:

public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

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

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] {"receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath});
            setListAdapter(adapter);
        }
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />

</TableLayout>

receiver_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />


</TableRow>

问题答案:

解决这个问题的方法非常简单。我们需要添加一个OnItemClickListenerListView监听点击并做出相应的响应。

因此,在该onCreate()方法中,一旦确保数据集不为空,就将要重写该onItemClick()方法以侦听单击并更改颜色。您还将要跟踪后面的步骤中选择了哪个项目,因此请public int selectionId = -1;在课程顶部添加。此外,您需要ListAdapter通过致电告知您已更改了某些内容((SimpleAdapter) getListAdapter()).notifyDataSetChanged()

if(receiverList.size() != 0) {
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) {
            view.setBackgroundColor(Color.RED);
            TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
            selectionId = Integer.valueOf(receiverIdTextView.getText().toString());
            ((SimpleAdapter) getListAdapter()).notifyDataSetChanged();
         }

    });
    SimpleAdapter adapter = getNewAdapter();
    setListAdapter(adapter);

}

大!现在,我们有了一个可以更改您点击的行的颜色的工作系统。但是我们还没有完成。我们需要确保先前的选择变回正常颜色。

对于这一点,我们将使用替代的SimpleAdaptergetView()方法,这就是所谓的每次ListView进入画显示在它的项目。

它实际上只显示需要的项目-
您可以看到的项目。它不会渲染屏幕上方或下方的内容。因此,如果您在中有200个项目,则一次ListView只能渲染5个或6个项目,具体取决于屏幕的大小和项目的大小。

要覆盖此getView()方法,请转到初始化的位置,adapter然后将代码更改为此:

SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] { "receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath}) {
    @Override
    public View getView (int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
        if(receiverIdTextView.getText().toString().equals(String.valueOf(selectionId))) {
            view.setBackgroundColor(Color.RED);
        } else {
            view.setBackgroundColor(Color.WHITE);
        }
        return view;
    }
};

每次绘制其中一行时,由于getView()都会调用,因此ListView它将检查当前view行是否具有所选行的ID。如果没有,它将背景色更改为白色。如果是这样,它将背景色更改为红色。

瞧!而已!现在,当您单击中的项目时,将背景色设置为红色ListView

最终密码

MainActivity.java:

public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

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

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) {
                    view.setBackgroundColor(Color.RED);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    selectionId = Integer.valueOf(receiverIdTextView.getText().toString());
                    ((SimpleAdapter) getListAdapter()).notifyDataSetChanged();
                 }

            });

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] { "receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath}) {
                @Override
                public View getView (int position, View convertView, ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    if(receiverIdTextView.getText().toString().equals(String.valueOf(selectionId))) {
                        view.setBackgroundColor(Color.RED);
                    } else {
                        view.setBackgroundColor(Color.WHITE);
                    }
                    return view;
                }
            };
            setListAdapter(adapter);
        }
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />
</TableLayout>

receiver_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />

</TableRow>


 类似资料:
  • 我有一个自定义列表视图的应用程序,它有一个textview和一个imageview。当我点击图像视图时,背景颜色应该改变。我试图这样做,但是得到了。。。这是我的密码 CustomListViewAdapter。JAVA 任何建议都将不胜感激。谢谢

  • 我有一个多栏的列表视图。。。要更改选定或单击的行项目的背景色。参考了关于stackoverflow的各种文章,但它们似乎没有帮助。。。我在McClick做的是。挫折背景色。当应用程序重新启动时,无法使用选择器,因为我希望记住我已更改颜色的行的颜色更改。。。我把标志值放在数据库中,可以在getView中设置颜色,但是第一次怎么做呢?这是代码。。。。。 我现在所做的是在getView方法中,将转换视图

  • 我有一个FragmentActivity,它可以包含用户想要的任意多个ListFragments。ListFragments在HorizontalScrollView中并排排列(在ActionBar中选择一个选项时)。每个ListFragment项都包含一个TextView和一个按钮。单击按钮可更改按钮的ViewParent(包含按钮和TextView的线性布局)的背景色。 现在,单击每个List

  • 你能帮帮我吗。我需要更改我的列表视图项目的背景色,该项目由setSelection(int pos)功能手动选择,我需要保留新颜色,直到调用新的setSelection。我读过一些关于如何做到这一点的主题,但仍然没有成功。谢谢

  • 问题内容: 我有一个3列的JTable。我已经为所有3列设置了这样的代码(也许不是很有效?)。 在一个随机的背景颜色为每一行返回一个组件。 程序运行时如何将背景更改为其他随机颜色? 问题答案: 一种方法是存储模型中每一行的当前颜色。这是一个固定在3列3行的简单模型: 注意通话; 这将导致仅更新表的该行。 渲染器可以从表中获取模型: 更改行的颜色很简单:

  • 我有一个列表视图。我想为listView项设置边框,所以我使用“Shape”XML。 shape_panel_drawable.xml文件 谢谢!