【问题标题】:Highlight and keep highlighted the selected item in Listview突出显示并保持突出显示列表视图中的选定项目
【发布时间】:2013-12-22 17:34:47
【问题描述】:

我有一个从光标填充数据的列表视图。列表视图有一个自定义适配器。我想在列表视图中突出显示所选项目

public class BillOfSaleActivity extends Activity {

    ListView lv1;
    CustomAdapter listAdapter;

    DbHandler dbHandler;
    Cursor c;

    TextView salesman;
    TextView customer;
    TextView TC;

    String userName;
    String custName;

    Float TotalCost = 0f;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bos_main);

        Intent i = getIntent();
        userName = i.getStringExtra("userName");
        custName = i.getStringExtra("custName");

        salesman = (TextView) findViewById(R.id.tv_bosSalesman);
        customer = (TextView) findViewById(R.id.tv_boscust);
        TC = (TextView) findViewById(R.id.textView_bos_total);

        salesman.setText(userName);
        customer.setText(custName);

        dbHandler = new DbHandler(getApplicationContext());
        c = dbHandler.getBosList();

        if (c != null) {
            if (c.moveToFirst())
                do {
                    Float qty = Float.parseFloat(c.getString(4));
                    Float price = Float.parseFloat(c.getString(5)) * qty;
                    TotalCost = TotalCost + price;
                } while (c.moveToNext());
        }

        c.moveToFirst();
        lv1 = (ListView) findViewById(R.id.listView_bos);
        lv1.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        lv1.setSelector(R.drawable.list_selector);

        // String []from = new String []
        // {DbHandler.Bos_List_col5,DbHandler.Bos_List_col6};
        listAdapter = new CustomAdapter(getApplicationContext(), c);
        lv1.setAdapter(listAdapter);

        TC.setText("$" + TotalCost);

        lv1.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                    long arg3) {
                view.getFocusables(position);               
                view.setSelected(true);                 
            }
        });
    }

    public class CustomAdapter extends BaseAdapter {
        Cursor cursor;
        Context context;

        public CustomAdapter(Context cont, Cursor c) {

            this.cursor = c;
            this.context = cont;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return c.getCount();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int position, View view, ViewGroup arg2) {

            Log.i("dhiraj", "In getView");

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.activity_bos_list, null);

            cursor.moveToPosition(position);

            TextView textView1 = (TextView) view
                    .findViewById(R.id.textView1_bos);
            TextView textView2 = (TextView) view
                    .findViewById(R.id.textView2_bos);
            TextView textView3 = (TextView) view
                    .findViewById(R.id.textView3_bos);
            TextView textView4 = (TextView) view
                    .findViewById(R.id.textView4_bos);

            textView1.setText(cursor.getString(3));
            textView2.setText(cursor.getString(2));
            textView3.setText(cursor.getString(4) + " x  $"
                    + cursor.getString(5));

            Float qty = Float.parseFloat(cursor.getString(4));
            Float price = Float.parseFloat(cursor.getString(5)) * qty;

            textView4.setText("$ " + price);

            return view;
        }

    }
}

我使用的布局是……这是主要布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/linz"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:weightSum="2" >

        <TextView
            android:id="@+id/tv_bosSalesman"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingLeft="20dp"
            android:text="Salesman"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/red" />

        <TextView
            android:id="@+id/tv_boscust"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Customer"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/lightBlue" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_bos_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/linz"
        android:background="@android:color/darker_gray"
        android:gravity="center"
        android:text="Nota de Venta"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
        android:id="@+id/lin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tv_bos_header"
        android:weightSum="4" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Cant"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Cod"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Nombre"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Total"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </LinearLayout>

    <ListView
        android:id="@+id/listView_bos"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/linz12"
        android:layout_below="@+id/lin"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:dividerHeight="1dp"
        android:drawSelectorOnTop="true" />

    <LinearLayout
        android:id="@+id/linz234"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:weightSum="3" >

        <Button
            android:id="@+id/button_bos_eliminar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Eliminar"
            android:textColorHint="@color/red" />

        <Button
            android:id="@+id/button_bos_agregar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Agregar"
            android:textColorHint="@color/green" />

        <Button
            android:id="@+id/button_bos_finalizar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Finalizar"
            android:textColorHint="@color/blue" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linz12"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/linz234"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView_bos_total"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

</RelativeLayout>

另一个布局包含 4 个用于 Listview 的文本框。

现在我想在 Listview 中突出显示按下的项目。我怎样才能做到这一点。我尝试使用选择器但没有效果。我希望该项目突出显示,直到下一个项目被选中。

【问题讨论】:

标签: android listview android-listview


【解决方案1】:

看看this answer,它对我也有帮助。

在那里,您将了解如何在 listView 中突出显示一个项目,并保持它突出显示直到另一个项目被选中。

【讨论】:

    【解决方案2】:

    继续 Rashi 的回答,这是对我有用的简单方法 - 只需跟踪最后一个选定的项目,以便在打开当前选定的项目之前知道从上一次点击中关闭哪个项目。

    public class SomeActivity extends Activity {
    
        View previouslySelectedItem = null;
    
        ...
        protected void onCreate(Bundle savedInstanceState) {
    
            ListView myListView = (ListView)findViewById(R.id.some_list);
    
            myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    if (previouslySelectedItem != null)
                    {
                        previouslySelectedItem.setBackgroundColor(
                                getResources().getColor(R.color.transparent));
                    }
    
                    view.setBackgroundColor(
                            getResources().getColor(R.color.orange));
    
                    previouslySelectedItem = view;
                }
            });
    

    【讨论】:

      【解决方案3】:

      如果你想在列表视图中突出显示所有选定的项目,

         **@Override
           public void onItemClick(AdapterView<?> adapterView, View view,
                          int position, long arg3) {
                    view.setBackgroundColor(getResources().getColor(
                              R.color.pressed_color)); 
                  //change the background color or image of the selected item
               }**
      

      【讨论】:

      • 如果你点击另一个项目?您将突出显示更多项目
      • 在 SO 上跨多个线程的数十个答案中,这一个 - 虽然不完整 - 似乎是实际有效的最简单的解决方案!我在下面发布了添加到此的代码,以便也可以取消选择项目。感谢您让我朝着正确的方向前进
      【解决方案4】:

      ListViews默认没有choiceMode设置,所以默认不显示当前选择。

      要改变这一点,您只需将 ListView 的choiceMode 属性设置为singleChoice。 要在列表中显示所选项目,您还应该设置 listSelector 属性。

      例子:

      <ListView android:id="@+id/my_list"
              android:choiceMode="singleChoice" 
              android:listSelector="@android:color/darker_gray" />
      

      【讨论】:

      • 它只是突出显示项目被按下的时间。我希望当我按下并释放它时,该项目应连续突出显示,直到选择其他项目。当按下其他项目时,突出显示应该从第一个转移到第二个
      • 哦,好的。这个链接就是你要找的。 stackoverflow.com/questions/9281000/….. 如果它对您有用,请不要忘记接受并投票。干杯!
      • 谢谢,但是还有其他选择吗?
      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2023-03-31
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多