2010-10-14 98 views
0

我有一個使用CheckedTextView填充數據的列表視圖。這裏是XML列表視圖setChecked()選擇多個項目而不是一個

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:textSize="14dp" 
    android:paddingTop="5dp" 
    android:paddingBottom="5dp" 
    android:paddingRight="5dp" 
    android:paddingLeft="5dp" 
    android:textColor="@color/blue" 
    android:checked="false" 
    android:id="@+id/listviewsubview_textview" > 
</CheckedTextView> 

在項目點擊監聽器,在項目的右側顯示刻度,但不是唯一的該項目顯示剔等多個項目也顯示打勾。奇怪的是所有的行都是在同一行數之後。我不知道我在做什麼錯。

下面是代碼

package com.chegg.android.account; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.Window; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.CheckedTextView; 
import android.widget.ListView; 
import android.widget.AdapterView.OnItemClickListener; 

import com.chegg.android.R; 
import com.chegg.android.api.RestClient; 
import com.chegg.android.objects.StudentInfo; 
import com.chegg.android.util.Util; 

public class MajorActivity extends MainActivity { 

    public ListView majorsListView; 
    public String url; 
    public HashMap<String, String> majorMap = new HashMap<String, String>(); 
    public JSONArray resultArray = new JSONArray(); 
    public JSONObject resultObj = new JSONObject(); 
    public ArrayList<String> majorNameArray = new ArrayList<String>(); 
    public RestClient restClient = null; 
    public StudentInfo studentInfo = null; 
    public HashMap majors = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.majors); 

     Object campusObj = this.getIntent().getStringExtra("campus_id"); 
     restClient = new RestClient(); 
     if(campusObj!=null) { 
      String campusId = campusObj.toString(); 
      url = "school/majors/"+campusId; 
     } else { 
      url = "school/majors"; 
     } 
     String result = restClient.connect(url); 
     try { 
      JSONArray jsonArray = new JSONArray(result); 
      for(int i=0;i<jsonArray.length();i++) { 
       JSONObject jsonObj = jsonArray.getJSONObject(i); 
       String name = jsonObj.getString("name"); 
       majorMap.put(name,jsonObj.getString("id")); 
       majorNameArray.add(name); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     majorsListView = (ListView)findViewById(R.id.majors_listview); 
     majorsListView.setChoiceMode(ListView.CHOICE_MODE_NONE); 
     majorsListView.setAdapter(new ArrayAdapter<String>(MajorActivity.this, R.layout.list_view_subview,majorNameArray)); 


     studentInfo = (StudentInfo)this.getIntent().getSerializableExtra("studentInfo"); 
     if(studentInfo.getMajors()!=null) { 
      majors = (HashMap)studentInfo.getMajors(); 
     } else { 
      majors = new HashMap(); 
     } 
     //majorsListView.setAdapter(new MajorsAdapter(MajorActivity.this, R.layout.list_view_subview,majorNameArray,majors)); 
     majorsListView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 
       CheckedTextView selectedView = (CheckedTextView)view; 
       Drawable chevron = getResources().getDrawable(R.drawable.chevron); 
       chevron.setBounds(0, 0, chevron.getMinimumWidth(), chevron.getMinimumHeight()); 

       String text = selectedView.getText().toString(); 


       if(!selectedView.isChecked()) { 
        selectedView.setChecked(true); 
        selectedView.setCheckMarkDrawable(R.drawable.chevron); 
        majors.put(text, majorMap.get(text)); 
       } else { 
        selectedView.setChecked(false); 
        selectedView.setCheckMarkDrawable(null); 
        if(majors.containsKey(text)) { 
         majors.remove(text); 
        } 
       } 
       JSONObject jsonFinalResult = new JSONObject(); 
       try { 
        Iterator it = majors.entrySet().iterator(); 
         while (it.hasNext()) { 
          Map.Entry pairs = (Map.Entry)it.next(); 
          JSONObject jsonObj = new JSONObject(); 
          System.out.println(pairs.getKey() + " = " + pairs.getValue()); 
          jsonObj.put("name", pairs.getKey()); 
          jsonObj.put("id",pairs.getValue()); 
          resultArray.put(jsonObj); 
         } 
        jsonFinalResult.accumulate("majors", resultArray); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       String url = "account?access_token="+ accessToken; 
       Log.i("json *****",jsonFinalResult.toString()); 
       String result = restClient.connectHttpsPostPutJson(url, jsonFinalResult.toString(), "PUT"); 

       Log.i("*******",result); 

       String checkError = Util.checkResponseForError(result); 
       if(checkError.equals("") || checkError == null) { 
        studentInfo = StudentInfo.getObjectFromJson(result); 
        cacheData(studentInfo, "studentInfo", "update"); 
       } else { 
        alertbox.setMessage(checkError); 
        alertbox.setNeutralButton("ok", null); 
        alertbox.show(); 
       } 

      } 
     }); 



    } 


} 

任何幫助理解

回答

2

majorsListView.setChoiceMode(ListView.CHOICE_MODE_NONE);

這應該是ListView.CHOICE_MODE_MULTIPLE,所以Android會跟蹤您的選擇。然後,你也可以擺脫你的OnItemClickListener。當用戶完成選擇時,getCheckedItemPositions()會告訴你他們選擇了哪些,以便更新數據模型。

您當前的實施忽略了行回收的影響(一個CheckedTextView小部件將用於您的ArrayAdapter中任意數量的可能位置)。

+0

感謝哥們,會試試看。 – rachana 2010-10-14 15:18:57

+0

我該如何擺脫OnItemClickListener – rachana 2010-10-14 16:02:09

+0

我想在選中該行時顯示右側的刻度圖標+想要在每次點擊時將選定的信息發送到服務器。我沒有豪華的「保存信息」按鈕:( – rachana 2010-10-14 16:03:17

相關問題