突出显示使用arrayadapter的listview中的行

时间:2014-01-12 03:59:52

标签: android android-listview android-arrayadapter android-view

我已经使用数组适配器创建了包含图像和文本的自定义lisview。我想手动突出显示其中一行,但我似乎无法做到这一点。我尝试过使用setItemCheckedsetSelection(1);。我确保通过调用listView.setEnabled(false);来禁用触摸事件,因为我读到如果启用触摸事件,手动选择可能不起作用。任何有关此事的见解将不胜感激。我在下面提供了我的源代码。

主要活动

public class MainActivity extends Activity
{

    // GUI
    int Update_Frequency = 1000;
    double ack = 0;


// Sensor Constants
public static String temperature = "--";
public static String humidity = "--";
public static String lpg = "--";
public static String alcohol = "--";



// Layout
ListView listView;
ItemAdapter adapter;


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


    //Initialize Interface
    Model.LoadModel();
    listView = (ListView) findViewById(R.id.listView);
    String[] ids = new String[Model.Items.size()];
    for (int i= 0; i < ids.length; i++)
    {ids[i] = Integer.toString(i+1);}
    this.adapter = new ItemAdapter(this,R.layout.row, ids);
    listView.setAdapter(adapter);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listView.setEnabled(false);
    listView.setItemChecked(1, true);
    listView.setSelection(1);



    Model.LoadModel();
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    GUI_Management();

}   

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
        case R.id.action_connect:
            break;
        case R.id.action_disconnect:
            break;
        case R.id.action_settings:
            break;
        case R.id.action_about:
            break;
        case R.id.action_exit:
            break;
        default:
            break;
  }

  return true;
}


private void GUI_Management()
{
    new Thread()
    {
        public void run()
        {
            //Replace with a changeable variable
            while (true)
            {
                try
                {
                    runOnUiThread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            Model.LoadModel();
                            listView.setAdapter(adapter);
                            adapter.notifyDataSetChanged();
                        }
                    });
                    Thread.sleep(Update_Frequency);
                }
                catch (InterruptedException e)
                {
                }
            }
        }
    }.start();
}

}

阵列适配器

public class Model extends MainActivity
{
    public static ArrayList<Item> Items;

    public static void LoadModel() 
    {
        Items = new ArrayList<Item>();
        Items.add(new Item(1, "temperature_icon.png", "Temperature/Humidity               " + temperature + "°F / " + humidity + "%"));
        Items.add(new Item(2, "gas_icon.png", "LPG                                                   " + lpg +" ppm"));
        Items.add(new Item(3, "alcohol_icon.png", "Alcohol                                             " + alcohol + " ppm"));
    }  

    public static Item GetbyId(int id)
    {
        for(Item item : Items) 
        {
            if (item.Id == id) 
            {
                return item;
            }
        }
        return null;
    } 
}

class Item 
{
    public int Id;
    public String IconFile;
    public String Name;

    public Item(int id, String iconFile, String name)
    {
        Id = id;
        IconFile = iconFile;
        Name = name;
    }
}

class ItemAdapter extends ArrayAdapter<String> {

    private final Context context;
    private final String[] Ids;
    private final int rowResourceId;

    public ItemAdapter(Context context, int textViewResourceId, String[] objects) {

        super(context, textViewResourceId, objects);

        this.context = context;
        this.Ids = objects;
        this.rowResourceId = textViewResourceId;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(rowResourceId, parent, false);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView);
        TextView textView = (TextView) rowView.findViewById(R.id.textView);

        int id = Integer.parseInt(Ids[position]);
        String imageFile = Model.GetbyId(id).IconFile;

        textView.setText(Model.GetbyId(id).Name);
        // get input stream
        InputStream ims = null;
        try {
            ims = context.getAssets().open(imageFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // load image as Drawable
        Drawable d = Drawable.createFromStream(ims, null);
        // set image to ImageView
        imageView.setImageDrawable(d);
        return rowView;

    }


}

1 个答案:

答案 0 :(得分:1)

在rootview对象中放置setonclick监听器,这些监听器在getview方法中由你膨胀,这将解决你的问题,在点击事件上你可以改变rootview的背景,还有更多你可以用它来做。

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View rowView = inflater.inflate(rowResourceId, parent, false);
            ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView);
            TextView textView = (TextView) rowView.findViewById(R.id.textView);

            int id = Integer.parseInt(Ids[position]);
            String imageFile = Model.GetbyId(id).IconFile;

            textView.setText(Model.GetbyId(id).Name);

        if (position == selectedItem)
        {
            rootView /*or you can use any viewgroup*/
                    .setBackgroundResource(R.drawable.background_dark_blue);


        }
        else
        {
            rootView
                    .setBackgroundResource(R.drawable.border02);
        }

                return rowView;    
        }
   private int selectedItem;
    public void setSelectedItem(int position) {
        selectedItem = position;
    }

我知道这不是一个好的解决方案但是这可以帮助你,你可以使用setSelectedItem方法来突出显示行 请使用静态占位符类来提高效率,并使用静态占位符类中的位置字段来获取所选行的位置