0

배열 어댑터를 사용하여 이미지와 텍스트가있는 사용자 정의 lisview를 만들었습니다. 행 중 하나를 수동으로 강조하고 싶지만이 작업을 수행 할 수 없습니다. setItemCheckedsetSelection(1);을 사용해 보았습니다. 터치 이벤트가 사용 가능할 경우 수동 선택이 작동하지 않을 수 있음을 알고 있으므로 listView.setEnabled(false);으로 전화하여 터치 이벤트를 사용하지 않도록 설정했습니다. 이 문제에 대한 통찰력은 크게 감사 할 것입니다. 아래 소스 코드를 포함 시켰습니다. 이 문제를 해결할 수의 getView 방법에서 당신에 의해 팽창 및 클릭 이벤트 당신에있는 rootview 객체의arrayadapter를 사용하는 listview의 강조 표시 행

주요 활동

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

넣어 setonclick 리스너 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; 
    } 

나는이 좋은 solutionbut하지 알고있을 당신이 행 을 강조 setSelectedItem 방법을 사용하여 효율성을 위해 정적 자리 클래스를 사용하여 선택한 행의 위치를 ​​얻기 위해 정적 자리 클래스에 위치 필드를 사용하십시오 할 수 있습니다 밖으로 도움말

+0

그래, 어떻게 수동으로해야합니까? 클릭 할 때 행을 강조 표시하고 싶지는 않지만 코드 내에서 행을 자동으로 강조 표시하려고합니다. 어떤 아이디어? – Willis

+0

오, 오해해서 미안하지만 목록보기에서 모든 행을 강조 표시해야합니다.이 링크를보고 루트보기에 배경을 지정해야합니다. http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape – mcd

+0

감사합니다. 단지 호기심에서 벗어나서, 내 접근법이 나던 이유가 있습니까? 왜냐하면 나는 표준 listviews로 구현 된 그 메소드를 보았 기 때문이다. 감사합니다 – Willis