如何使用两个textview和一个切换按钮创建Listview?

时间:2015-02-18 12:07:17

标签: android listview textview togglebutton

我创建了listview,其中包含两个textview作为名称和电话号码。并在这一个切换按钮前面。当我点击切换按钮时,我应该得到名字。但它正在给出错误

  

' 02-17 06:49:53.170:E / AndroidRuntime(1425):java.lang.ClassCastException:android.widget.TextView无法强制转换为android.widget.ToggleButton   02-17 06:49:53.170:E / AndroidRuntime(1425):at com.example.comparearray.MainActivity $ 1.onItemClick(MainActivity.java:85)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.widget.AdapterView.performItemClick(AdapterView.java:299)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.widget.AbsListView.performItemClick(AbsListView.java:1113)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:2904)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.widget.AbsListView $ 3.run(AbsListView.java:3638)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.os.Handler.handleCallback(Handler.java:733)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.os.Handler.dispatchMessage(Handler.java:95)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.os.Looper.loop(Looper.java:136)   02-17 06:49:53.170:E / AndroidRuntime(1425):在android.app.ActivityThread.main(ActivityThread.java:5017)   02-17 06:49:53.170:E / AndroidRuntime(1425):at java.lang.reflect.Method.invokeNative(Native Method)   02-17 06:49:53.170:E / AndroidRuntime(1425):at java.lang.reflect.Method.invoke(Method.java:515)   02-17 06:49:53.170:E / AndroidRuntime(1425):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)   02-17 06:49:53.170:E / AndroidRuntime(1425):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)   02-17 06:49:53.170:E / AndroidRuntime(1425):at dalvik.system.NativeStart.main(Native Method)

以下是我的代码

 lvCountries = (ListView) findViewById(R.id.lv_countries);

OnItemClickListener itemClickListener = new OnItemClickListener() {
 @Override

public void onItemClick(AdapterView<?> lv, View item, int position, long id) {

     ListView lView = (ListView) lv;

     SimpleAdapter adapter = (SimpleAdapter) lView.getAdapter();

     HashMap<String,Object> hm = (HashMap) adapter.getItem(position);

     /** The clicked Item in the ListView */
     RelativeLayout rLayout = (RelativeLayout) item;

     /** Getting the toggle button corresponding to the clicked item */
    ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);


     String strStatus = "";
     if(tgl.isChecked()){
         tgl.setChecked(false);
         strStatus = "Off";
         status[position]=false;
     }else{
         tgl.setChecked(true);
         strStatus = "On";
         status[position]=true;
     }
     Toast.makeText(getBaseContext(), (String) hm.get("txt") + " : " + strStatus, Toast.LENGTH_SHORT).show();
 }

};

lvCountries.setOnItemClickListener(itemClickListener);

请帮助我,我被困在这里。

5 个答案:

答案 0 :(得分:0)

显然您正在尝试在切换按钮中投射textview,因此请首先检查布局中的切换位置。索引1上有textview rLayout.getChildAt(1);

答案 1 :(得分:0)

而不是使用静态索引从所选行布局中获取ToggleButton,而使用instanceof来检查是ToggleButton还是TextView

RelativeLayout rLayout = (RelativeLayout) arg1;
for (int index = 0; index < rLayout.getChildCount(); index++) {
     View view=rLayout.getChildAt(index);
     if(view instanceof ToggleButton){      
        ToggleButton tgl = (ToggleButton)view;       
         //... do task here...
        break;
     }
}

答案 2 :(得分:0)

错误说“TextView无法转换为android.widget.ToggleButton”,因此,方法“rLayout.getChildAt(1)”显然不适合你。 你可以在XML中设置id,然后从你的“rLayout”中找到它。

答案 3 :(得分:0)

更改以下行

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(2);

注意:如果清洁项目后再次尝试无效,请重试。

希望这会对你有所帮助。

答案 4 :(得分:0)

您正在将TextView转换为ToggleButton。问题出在这一行:

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);

由于某种原因,1处的孩子是TextView而不是预期的ToggleButton。

我建议您使用findViewById代替getChildAt,这样您就可以通过ID找到它们而不是布局中的位置。它将避免这些与小部件顺序相关的错误。