Android¿ª·¢¼¼ÇÉ¡ª¡ª×Ô¶¨Ò嵥ѡ»ò¶àÑ¡µÄListView

ÅÝÔÚÍøÉϵÄÈÕ×Ó / ÎÄ ·¢±íÓÚ2015-06-19 22:20 µÚ´ÎÔĶÁ ListView,¶àÑ¡

ÕâÆªÆäʵӦ¸ÃÊÇÊôÓÚд×Ô¶¨Ò嵥ѡ»ò¶àÑ¡µÄListViewµÄ»ù´¡½Ì³Ì£¬ÎÞÄÎĿǰÐí¶àÈ˶Դ˵ÄʵÏÖ´ó¶à¶¼ÈÆÁËԶ·£¬·´¶øÊ¹µÃÕâÕý¹æµÄд·¨µ¹ÏÔµÃÓÐЩ¼¼ÇÉÐÔÁË¡£

 

AndroidÖУ¬ListView¿ÉÒÔÉèÖÃchoiceMode£¬¿É¼ûAndroid¶ÔListViewµÄµ¥Ñ¡»ò¶àÑ¡ÊÇÓнøÐзâ×°µÄ£¬È»¶øÎÒ¿´µ½µÄÐí¶àµ¥Ñ¡»ò¶àÑ¡µÄListView£¬°üÀ¨ÎÒÒÔǰдµÄÀý×Ó£¬ÒÔǰ¼¸¸öÀÏÍâ·â×°µÄ¿â£¬¶¼ÊÇ×Ô¼ºÎ¬»¤ÁËÒ»¸ö¼¯ºÏ£¬ÓÃÓÚ´æ·Åÿ¸öitemµÄÑ¡ÖÐ״̬¡£ÕâÑùÒ»À´£¬²»µ«´úÂëÏԵ÷±¸´£¬Âß¼­ÉÏÒ²³ÉÈßÓ࣬¶øÇÒÈÝÒ׳öBUG¡£

Æäʵ£¬ListViewÖУ¬ÒѾ­×Ô¼ºÎ¬»¤ÁËÒ»¸öSparseBooleanArray£¬ÓÃÓÚ±£´æÃ¿Ò»ÏîµÄÑ¡ÖÐ״̬¡£¶ø¶ÔÓÚÿһÏËüÊÇͨ¹ýadapterµÄgetViewÖлñÈ¡µÄview£¬À´ÉèÖÃËüµÄÑ¡ÖÐ״̬µÄ¡£ËùÒÔ£¬ÎÒÃÇÐèҪʹµÃadapterÖУ¬getViewÖзµ»ØµÄÕâ¸öviewʵÏÖCheckable½Ó¿Ú¡£ÏÂÃæ£¬½«½éÉܾßÌåʵÏÖ¡£

ÕâÀï½éÉܵÄʵÏÖ·½Ê½ÓÐÁ½¸ö£¬Ò»ÖÖÊÇ´ÓÁãдһ¸öµ¥Ñ¡µÄListView¡£ÁíÒ»ÖÖÊǵ÷ÓÃÎÒµÄÒ»¸ö¿âµÄ´úÂëÀ´ÊµÏÖ¡£ÒòΪÎÒÒѾ­¶ÔÏà¹ØµÄ±ØÒªÂß¼­¶¼·â×°ÔÚÁËÁ½¸öÀàÀʹµÃÒ×ÓÚʹÓá£


Ô­ÉúʵÏÖ

1£¬ÏÈдitemµÄ²¼¾ÖÎļþ¡£

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <RadioButton
        android:id="@+id/checkedView"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
    <TextView
        android:id="@+id/text"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
</RelativeLayout>

×¢Ò⣬ÕâÀïµÄRadioButton£¬ÐèÒªÉèÖÃÈý¸öÊôÐÔ£¬·Ö±ðÊÇ£º

        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"

2£¬½ÓÏÂÀ´£¬¼Ì³Ðij¸öLayout£¬À´ÊµÏÖ¿ÉÒÔµ¥Ñ¡µÄÕâ¸öitem¡£

package com.githang.android.choicelistview;
import android.content.Context;
import android.view.View;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.TextView;
/**
 * FIXME
 *
 * @author Geek_Soledad ([email protected])
 */
public class ChoiceView extends FrameLayout implements Checkable{
    private TextView mTextView;
    private RadioButton mRadioButton;
    public ChoiceView(Context context) {
        super(context);
        View.inflate(context, R.layout.item_single_choice, this);
        mTextView = (TextView) findViewById(R.id.text);
        mRadioButton = (RadioButton) findViewById(R.id.checkedView);
    }
    public void setText(String text) {
        mTextView.setText(text);
    }
    @Override
    public void setChecked(boolean checked) {
        mRadioButton.setChecked(checked);
    }
    @Override
    public boolean isChecked() {
        return mRadioButton.isChecked();
    }
    @Override
    public void toggle() {
        mRadioButton.toggle();
    }
}

×îºó£¬ÔÚlistviewµÄadapterµÄgetView·½·¨À·µ»ØÕâ¸öʵÏÖÁËCheckable½Ó¿ÚµÄChoiceView¡£

package com.githang.android.choicelistview;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<String> data = new ArrayList<>();
        for(int i = 0; i < 5; i++) {
            data.add("test" + i);
        }
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.item_single_choice, data) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                final ChoiceView view;
                if(convertView == null) {
                    view = new ChoiceView(MainActivity.this);
                } else {
                    view = (ChoiceView)convertView;
                }
                view.setText(getItem(position));
                return view;
            }
        };
        listView.setAdapter(adapter);
    }
}

´úÂëºÜ¼òµ¥·½±ã£¬ÍêÈ«²»ÓÃ×Ô¼ºÈ¥Î¬»¤Ò»¸öÑ¡ÖÐ״̬µÄ¼¯ºÏ¡£Demo ÏîÄ¿ÏÂÔØµØÖ·£ºhttp://www.400gb.com/file/94898213

ʹÓÃAndroidSnippetÀïµÄÀàʵÏÖ

½ÓÏÂÀ´»¹Óиü¼òµ¥µÄʵÏÖ·½·¨£¬¼´Ê¹ÓÃÎÒ·â×°µÄÀàÀ´ÊµÏÖ¡£ÕâÖÖÇé¿öÏ£¬Ö»ÐèҪдһ¸öitemµÄ²¼¾ÖÎļþ£¬È»ºóдһ¸öadapter¼´¿É£¬ºÍдÆÕͨµÄListViewû¶à´óÇø±ð¡£

item µÄ²¼¾ÖÎļþ£º

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <RadioButton
        android:id="@+id/checkedView"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
    <TextView
        android:id="@+id/text"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
</RelativeLayout>


¹ØÓÚRadioButtonµÄÈý¸öÊôÐÔÎÒÒѾ­ÔÚ´úÂëÀï·â×°ºÃÁË£¬ËùÒÔÕâÀïд²»Ð´ÄÇÈý¸öÊôÐÔ¶¼ÎÞËùν¡£

½ÓÏÂÀ´£¬¾ÍÊÇʹÓÃÎÒ·â×°µÄChoiceListAdapter£¬À´ÊµÏÖµ¥Ñ¡£¨»ò¶àÑ¡£©µÄListView£¬´úÂëÈçÏ£º

        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        ChoiceListAdapter adapter = new ChoiceListAdapter<String>(this, R.layout.item_single_choice,
                data, R.id.checkedView) {
            @Override
            protected void holdView(ChoiceLayout view) {
                view.hold(R.id.text);
            }
            @Override
            protected void bindData(ChoiceLayout view, int position, String data) {
                TextView text = view.get(R.id.text);
                text.setText(data);
            }
        };
        listView.setAdapter(adapter);

ÕâÀïµÄChoiceLayout ÎÒ»¹¶Ôholder½øÐÐÁË·â×°£¬ÓÃÆðÀ´ÊDz»ÊǸü¼ò½à·½±ã£¿

¹ØÓÚAndroidSnippet ¿â£¬ÎÒÒѰѴúÂëÍйܵ½github :https://github.com/msdx/AndroidSnippet¡£ÆäÖйØÓÚµ¥Ñ¡ÁбíµÄÀý×Ó£¬ÔÚapp moduleÖÐÓС£

×îºó¸½ÉÏʵÏÖЧ¹û¡£

Ч¹ûÊÓÆµ£ºhttp://v.youku.com/v_show/id_XOTYxMzE1MTQ4.html

Ч¹ûGIFͼ£º


ÉÏһƪ£ºÎÒÃÇÊÇÈçºÎÔÚAndroidÉÏʵÏÖÕ¡µ¶²Ëµ¥(Guillotine Menu)¶¯»­µÄ
Äã¿ÉÄÜÒѾ­ÔĶÁÁ˹ØÓÚÉè¼ÆÊ¦Vitaly Rubtsov ºÍios¿ª·¢ÕßMaksym Lazebnyi ´´½¨¶ÀÌØµÄtop bar¶¯»­µÄ ¹ÊÊ £¬Õâ¸ö¶¯»­²Ëµ¥±»È¡ÁËÒ»¸ö²»¼ªÀûµÄÃû×Ö £­ ¶Ïͷ̨²Ëµ¥£¨Äã¿ÉÒÔÔÚ Dribbble ºÍ GitHub ÉÏ¿´µ½Õâ¸öios¶¯»­£©¡£ºÜ¿ì£¬ÎÒÃǵݲ׿¿ª·¢ÕßDmytro Denysenko½Ó
ÏÂһƪ£ºAndroid LayoutAnimationʹÓü°À©Õ¹
ÔÚAndroidÖУ¬×î¼òµ¥µÄ¶¯»­¾ÍÊDz¹¼ä¶¯»­ÁË¡£Í¨¹ý²¹¼ä¶¯»­£¬¿ÉÒÔ¶ÔÒ»¸ö¿Ø¼þ½øÐÐÎ»ÒÆ¡¢Ëõ·Å¡¢Ðýת¡¢¸Ä±ä͸Ã÷¶ÈµÈ¶¯»­¡£µ«ÊDz¹¼ä¶¯»­Ö»ÄܶÔÒ»¸ö¿Ø¼þʹÓã¬Èç¹ûÒª¶Ôijһ×é¿Ø¼þ²¥·ÅÒ»ÑùµÄ¶¯»­µÄ»°£¬¿ÉÒÔ¿¼ÂÇlayout-animation¡£ LayoutAnimation layout-animation