【问题标题】:ListView setChoiceMode not showing upListView setChoiceMode 未显示
【发布时间】:2014-03-21 05:19:42
【问题描述】:

我有一个使用特殊适配器组合在一起的 ListView,这样我就可以用不同的颜色显示所有其他列表视图。如何编写代码,以便无需扩展 ListActivity(我的活动仅扩展 Activity)即可查看清单。这是我的代码。

 public class TrackingMe extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.trackingme_layout);

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
            R.layout.custom_title_3);

    SharedPreferences prefs = getSharedPreferences("Settings", 0);
    final String id = prefs.getString("ID", "");

    final TextView myTitleText = (TextView) findViewById(R.id.tvTitle3);
    if (myTitleText != null)
        myTitleText.setText(getResources().getString(R.string.Trackingme));

    ImageButton addFriends = (ImageButton) findViewById(R.id.btnAddFriends);
    addFriends.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent addFriends = new Intent("com.cellphone.INVITEFOLLOWER");
            startActivity(addFriends);
        }
    });

    final ListView lv2 = (ListView) findViewById(R.id.trackingmelistview);
    lv2.setChoiceMode(2);
    lv2.setTextFilterEnabled(true);
    refreshList(id,lv2);

    ImageButton refresh = (ImageButton) findViewById(R.id.btnRefresh2);
    refresh.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            refreshList(id, lv2);

        }
    });
}

static final ArrayList<HashMap<String, String>> list2 = new ArrayList<HashMap<String, String>>();

private void refreshList(String id, ListView lv) {
    // removes the list and rebuilds it will choose different response
    // string to get the refreshed times.
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpPost httpost = new HttpPost(
            "http://iphone-radar.com/people_i_follow");

    JSONObject holder = new JSONObject();
    try {
        holder.put("userid", id);
        // pacific time zone for now

        StringEntity se = new StringEntity(holder.toString());
        httpost.setEntity(se);
        httpost.setHeader("Accept", "application/json");
        httpost.setHeader("Content-type", "application/json");

        ResponseHandler responseHandler = new BasicResponseHandler();
        final String response = httpclient
                .execute(httpost, responseHandler);
        list2.removeAll(list2);


        SpecialAdapter adapter = new SpecialAdapter(this, list2,
                R.layout.trackingme_row_layout, new String[] { "name" }, new int[] { R.id.tvTrackingMeNames});


        org.json.JSONObject obj = new org.json.JSONObject(response);
        JSONArray tracking_users = obj.getJSONArray("d");

        for (int i = 0; i < tracking_users.length(); i++) {
            // for loop to get all data
            HashMap<String, String> temp = new HashMap<String, String>();
            JSONObject user = tracking_users.getJSONObject(i);
            temp.put("name", user.getString("full_name"));
            list2.add(temp);
            // upload location time

        }

        lv.setAdapter(adapter);
    } catch (JSONException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}
    //here is the special adapter so that everyother line is a different color
    public class SpecialAdapter extends SimpleAdapter {
private int[] colors = new int[] { Color.GRAY, Color.WHITE };

public SpecialAdapter(Context context,
        ArrayList<HashMap<String, String>> list, int resource,
        String[] from, int[] to) {
    super(context, list, resource, from, to);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    int colorPos = position % colors.length;
    view.setBackgroundColor(colors[colorPos]);
    return view;
}
  }

到目前为止,它根据我从来源获得的信息显示为一行文本。但是,当我单击单个行时,它们不会突出显示,即使我编写了 lv.setChoiceMode(2),列表视图旁边也没有复选框。谢谢

编辑这里是我的 trackingme_row_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView 
        android:id="@+id/tvTrackingMeNames"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="31dp"              
        android:text="TextView"  
        android:textAppearance="?android:attr/textAppearanceMedium"  
        android:textColor="#000000"/>

</RelativeLayout>

和 trackingme_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ListView   
        android:id="@+id/trackingmelistview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingTop="10dp"/>

    <ImageButton 
        android:id="@+id/btnRefresh2" 
        android:text="Refresh" 
        android:src="@android:drawable/stat_notify_sync" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentLeft="true"/>

</RelativeLayout>

【问题讨论】:

  • 最好使用预定义的常量。lst.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  • 看看 layout.trackingme_row_layout 将有助于理解。请在您的问题中发布该 xml 布局。
  • 我发布了 xml 布局,感谢您的帮助

标签: android listview checkbox


【解决方案1】:

调用setChoiceMode 不足以在列表行旁边显示复选框。如果您对行使用基本布局,请尝试android.R.layout.simple_list_item_multiple_choice。否则,您必须在行布局中添加一个复选框,并在适​​配器的 getView 方法中自行管理其开/关状态。

HTH,

阿克谢

P.S:请致电 setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 而不是 setChoiceMode(2)

【讨论】:

  • 嗨,我用 setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 替换了 setChoiceMode(2) 但没有任何改变。
  • CHOICE_MODE_MULTIPLE 只是一个建议,它不会改变任何东西。正如我所说, setChoiceMode 不足以显示复选框。您还需要有适当的布局来显示复选框。举个简单的例子,看看androidpeople.com/android-listview-multiple-choice-example
  • setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);在我的情况下不起作用。它不会在列表视图中显示复选框。
【解决方案2】:

简短的回答是 listView 不适用于布局。

解决您的问题的简单方法是删除外部布局并改用复选框或 CheckedTextView。

这是更长的答案(马丁的答案是最好的)。 What is the difference between the states selected, checked and activated in Android?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多