2011-12-12 50 views
1

我通过使用基本适配器来扩展列表视图在列表视图中,它们是两个小部件Textview和Edittext。当任何UI元素的行被触摸时突出显示列表视图行

Listview充气正常,它也显示。我们的要求是当用户点击任何行必须是彩色或突出显示的行。当用户点击该行突出显示的其他行时。并且之前的行颜色变得正常。

回答

1

要做到这一点,要求重点查看的最好办法,是被感动了,要做到这一点重写方法getView适配器:

 @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      <prepare or create view here> 
      convertView.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        convertView.requestFocus(); 
       } 
      }); 
      return convertView; 
     } 

,用于提供不同的状态不同的颜色,你可以使用selector背景资源。

+0

感谢吉姆这是为我工作。我有四个视图里面的列表视图3是Textview和1是Edittext。 Listener设置在Textview上,颜色正在改变但是当我点击Edittext时,颜色不会改变。编辑文本上的监听器未设置。 –

+1

发生这种情况是因为EditText捕获触摸事件并执行它自己的操作(如显示键盘等)。如果你想禁止在EditText中输入文本,只需执行'setClickable(false)'。如果你想离开文本输入的可能性,请点击EditText.setOnFocusChanged()' - 并在那里标记孔列表项。 – Jin35

+0

感谢Jim,你能解释一下我必须做些什么来设置List视图的编辑文本上的点击监听器。以便我的问题得到解决。我不理解我有3文本视图,当我点击其中任何一个监听器正在设置,但当我点击编辑文本什么都不会发生 –

1

那么,它的简单。这是我如何做到的。

首先,您需要两张图像来显示ListView项目的高亮和正常状态。然后你需要为你的ListView使用自定义行。可以说它有一个TextView。

在活动中保留一个整数变量。这个整数将保持ListView的选定索引。最初分配-1值。

现在,由于您使用的是自定义适配器,因此您可以在getView()中检查int变量==是否为postition。相同时,将TextView的背景设置为高亮,否则为正常。并重写OnListItemClick()。在这里,保存该int变量中的位置并调用notifyDataSetChanged()。下面是此示例代码:

public class MySampleActivity extends ListActivity 
{ 
    ArrayList<String> lst_string = new ArrayList<String>(); 
    int selected_item = -1; 
    MyListAdapter adptr; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     lst_string.add("item 1"); 
     lst_string.add("item 2"); 
     lst_string.add("item 3"); 
     lst_string.add("item 4"); 
     lst_string.add("item 5"); 
     lst_string.add("item 6"); 
     lst_string.add("item 7"); 
     lst_string.add("item 8"); 
     lst_string.add("item 9"); 

     adptr = new MyListAdapter(); 
     setListAdapter(adptr); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
     selected_item = position; 
     adptr.notifyDataSetChanged(); 
    } 

    private class MyListAdapter extends BaseAdapter 
    { 
     @Override 
     public int getCount() 
     { 
      return lst_string.size(); 
     } 

     @Override 
     public Object getItem(int position) 
     { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) 
     { 
      return position; 
     } 

     private LayoutInflater mInflater; 

     public MyListAdapter() 
     { 
      mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null; 
      if (convertView == null) 
      { 
       convertView = mInflater.inflate(R.layout.list_row, null); 
       holder = new ViewHolder(); 
       holder.textView = (TextView)convertView.findViewById(R.id.tv_row); 
       convertView.setTag(holder); 
      } 
      else 
      { 
       holder = (ViewHolder)convertView.getTag(); 
      } 
      holder.textView.setText(lst_string.get(position)); 
      if(selected_item == position) 
      { 
       holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_selected)); 
      } 
      else 
      { 
       holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_normal)); 
      } 
      return convertView; 
     } 
    } 

    public static class ViewHolder 
    { 
     public TextView textView; 
    } 
} 
+0

感谢Khawar,对于这样一个奇妙的解释。我正在扩展活动,这就是为什么他们的任何替代方案都是@Override protected void onListItemClick方法,以及您为列表视图设置单击监听器的位置。 –

相关问题