[Android] 안드로이드에서 ListView 행을 강조 표시하는 방법?


Answers

기본적으로 ListViews 는 선택 모드 NONE 으로 설정되므로 터치 모드에서는 setSelection 메서드가 시각적 효과를 갖지 않습니다.

이전 선택을 유지하거나 명시 적 선택을 시각적으로 표시하려면 먼저 목록보기의 선택 모드를 적절하게 설정해야합니다.

listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

다음 메소드의 API 문서를 읽는 것이 좋습니다.

  • setSelection
void android.widget.AdapterView.setSelection(int position)

현재 선택된 항목을 설정합니다. 액세스 가능성을 지원하려면이 메소드를 대체하는 서브 클래스가 우선 오버라이드 된 super 메소드를 호출해야합니다.

매개 변수 :
선택된 데이터 항목의 position 인덱스 (0에서 시작).

  • setChoiceMode
void android.widget.ListView.setChoiceMode(int choiceMode)

List에 대한 선택 동작을 정의합니다. 기본적으로 List에는 선택 동작 ( CHOICE_MODE_NONE )이 없습니다. choiceMode를 CHOICE_MODE_SINGLE 로 설정하면 목록에서 최대 하나의 항목을 선택한 상태로 만들 수 있습니다. choiceMode를 CHOICE_MODE_MULTIPLE 로 설정하면 목록에서 원하는 수의 항목을 선택할 수 있습니다.

매개 변수 :
choiceMode CHOICE_MODE_NONE , CHOICE_MODE_SINGLE , 또는 choiceMode 중 하나입니다.

이것이 충분하지 않은 경우 (현재 선택 항목과는 다른 마지막 선택 항목을 항상 표시하고 싶다고 가정), 마지막으로 선택한 항목 ( ListAdapter 를 채우는 데이터)을 lastSelectedItem 으로 저장하고 어댑터의 getView 메소드에서 이 lastSelectedItem 동일한 경우 렌더러에 대한 다른 배경 리소스.

마지막 선택이 선택 변경시 새로 고치지 않으면 어댑터 인스턴스에서 명시 적으로 notifyDataSetChanged 메소드를 호출해야합니다.

최신 정보
ListView 포함하는 활동은이 결과 ( setResult(Activity.RESULT_OK,pongIntent); 부분을 ​​기반으로 함)를 기다리는 활동의 하위이므로 초기 아이디어가 정확하며 마지막 위치는 의도를 통과해야합니다. 활동 시작 :

selectedListItem = getIntent().getIntExtra("PositionInList", -1);
lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvUsers.setSelection(selectedListItem);

ListView.CHOICE_MODE_SINGLE 솔루션은 동일한 활동을 유지하지만 모든 항목 클릭 (선택 변경)에서 완료하는 경우 작동합니다. 이것이 바로 추가 데이터가 시작 Intent 전달되어야하는 이유입니다.

위에서 언급 한 것처럼 어댑터에서 이전에 선택한 항목의 배경을 설정하여 getView 메소드를 재정의 할 수도 있습니다.

lvUsers.setAdapter(new ArrayAdapter(this, R.id.counlistView, groups)
{
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final View renderer = super.getView(position, convertView, parent);
        if (position == selectedListItem)
        {
            //TODO: set the proper selection color here:
            renderer.setBackgroundResource(android.R.color.darker_gray);
        }
        return renderer;
    }
});
Question

선택한 ListView 에서 사용자가 선택한 것을 표시하기 위해 행을 강조 표시해야합니다. 그래서 선택한 행이 아니며 이전에 선택한 것입니다.

나는 이미 위치를 다음과 같이 가지고있다.

ListView.setSelection(position);

그리고 지금 내가 원하는 것은이 특정 행을 선택하고 그것을 강조하는 것입니다.

ListView 가 포함 된 활동의 onCreate() 코드는 다음과 같습니다.

public class CountryView extends Activity
{
    protected static final String LOG_TAG = null;
    /** Called when the activity is first created. */
    String[] lv_arr = {};

    ListAdapter adapter;
    TextView t;
    private ListView lvUsers;
    private ArrayList<Coun> mListUsers;
    String responce=null;
    public int d;
    int selectedListItem = -1;


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.country);

        Intent data =getIntent();

        mListUsers = getCoun();
        lvUsers = (ListView) findViewById(R.id.counlistView);


        lvUsers.setAdapter(new ListAdapter(this, R.id.counlistView, mListUsers)); 


        selectedListItem=data.getExtras().getInt("PositionInList");

       lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE);



        lvUsers.setOnItemClickListener(new OnItemClickListener()
        {

            int positionItem;

            public void onItemClick(AdapterView<?> parent, View view,int position, long id)
            {
                Intent pongIntent = new Intent(getApplicationContext(),Trav.class);

                int counId=mListUsers.get(position).id;

                pongIntent.putExtra("response",mListUsers.get(position).p);
                pongIntent.putExtra("responseCounID",counId);

                //Put the position of the choose list inside extra
                positionItem=position;
                pongIntent.putExtra("PositionInListSet",positionItem);

                setResult(Activity.RESULT_OK,pongIntent);

                Log.i("CounID *******************************"," "+counId);
                finish();
            }
         });
    }
}



많은 튜토리얼과 답변에 라디오 버튼을 통한 단일 선택에 대한 정보가 포함되어있어 (RadioGroup에 크게 의존했기 때문에)이 문제를 쉽게 해결할 수있는 문제가있었습니다.

내 문제는 내가 "하이라이트"상태로 항목을 설정할 수 있지만 다음 항목을 선택하면 목록을 다시 설정할 수 없다는 것입니다. 다음은 내가 생각해 낸 것입니다.

listView.setOnItemClickListener(new ItemHighlighterListener ());

이 수업에서 :

private class ItemHighlighterListener implements OnItemClickListener{

    private View lastSelectedView = null;

    public void clearSelection()
    {
        if(lastSelectedView != null) lastSelectedView.setBackgroundColor(android.R.color.transparent);
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
        clearSelection();
        lastSelectedView = view;
        view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.shape_selected_menu_item));
    }
}



전환을 사용할 수 있습니다. 특정 목록 뷰 항목을 선택하여 강조 표시했기 때문에 코드를 따르십시오 . 5 초 동안 첫 번째 항목을 강조 표시하려고합니다.

 if(position == 0){
                    viewHolderThubnail.relImage.setBackgroundResource(R.drawable.translate);
                    TransitionDrawable transition = (TransitionDrawable) viewHolderThubnail.relImage.getBackground();
                    transition.startTransition(1000);

                }else{

                    viewHolderThubnail.relImage.setBackgroundResource(R.color.white);
                }

translate.xml

<?xml version="1.0" encoding="UTF-8"?>
   <transition xmlns:android="http://schemas.android.com/apk/res/android">
          <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. -->
          <item android:drawable="@drawable/new_state" />
          <item android:drawable="@drawable/original_state" />
   </transition>

new_state.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape   xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
    <solid android:color="#92BCE7"/>
</shape>

original_state.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape   xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
    <solid android:color="#FFFFFF"/>
</shape>

이 코드를 이해한다면, 간단히 말해서 제로 위치에있는 목록 뷰 항목은 파란색으로 5 초 동안 강조 표시되고 하얀색으로 페이드가 느려질 것입니다.







단순한 모든 것

보기 updatedview = null;

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


           //these two lines of code means that only one item can be selected at a time
            if(updatedview != null) updatedview.setBackgroundColor(Color.TRANSPARENT);
            updatedview=view;


            Toast.makeText(getApplicationContext(), " " + str[position], Toast.LENGTH_LONG).show();



            view.setBackgroundColor(Color.CYAN);


        }



레이아웃 파일에서 이것을 구현하고 안드로이드가 나머지를 처리하게하는 것이 훨씬 쉽습니다 ...

1) ListView 레이아웃 에서 android:choiceMode="" 설정했는지 확인하십시오 ( singleChoice , multipleChoice 등). 기본적으로 none 으로 설정됩니다.

<ListView
    android:id="@+id/invite_friends_fragment_contacts_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:choiceMode="multipleChoice"/> <!-- THIS LINE -->

2) 상태 선택기 XML 파일을 작성하여 드로어 블 폴더에 저장하십시오. 이 예제에서는 state_selector.xml로 이름을 지정합니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/blue" android:state_selected="true"/>
    <item android:drawable="@android:color/blue" android:state_activated="true"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

3) 목록 항목 레이아웃 에서 state_selector.xml 파일을 배경으로 추가하십시오.

<?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"
    android:background="@drawable/state_selector">  <!-- THIS LINE -->

    <!-- ALL OF YOUR ELEMENTS WILL GO HERE (TextViews, ImageViews, etc) -->

</RelativeLayout>

multipleChoice 를 사용 multipleChoice 경우 onItemClick() 재정의하고 선택한 항목을 설정 / 해제 할 수 있습니다. Android는 state_selector.xml 파일에 지정된 배경색을 변경합니다.




이 문제는 다음과 같은 방법으로 해결됩니다. 1. lastClickId를 설정합니다. listView에서 항목을 클릭하면 lastClickId를 값의 위치로 업데이트 한 다음 뷰의 배경을 업데이트합니다. 그런 다음 한 항목을 클릭하면이 항목이 강조 표시됩니다.하지만 getView () 메소드가 다시 실행되기 때문에 listView (화면에서 선택한 항목 만들기)를 스크롤하여 뒤로 스크롤하면 강조 표시가 사라집니다. 귀하의 어댑터, 그래서, 우리는 다음 일을해야합니다. 2. 어댑터에서 메소드 getView ()의 백그라운드를 변경하십시오. 코드는 다음과 같습니다.

private static int lastClickId = -1;
private OnItemClickListener listener = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        if ((lastClickId != -1) && (lastClickId != position)) {
            parent.getChildAt(lastClickId).setBackgroundResource(
                    R.color.grey);
            view.setBackgroundResource(R.color.blue);
        }
        if (lastClickId == -1) {
            view.setBackgroundResource(R.color.blue);
        }
        lastClickId = position;

    }

};

public static int getCurrentSelectedItemId() {
    return lastClickId;
}

어댑터:

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View view = mInflater.inflate(R.layout.tweet_list_layout, null);
    // set selected item's background to blue
    if (position == MainUserFeedFragment.getCurrentSelectedItemId()) {
        view.setBackgroundResource(R.color.blue);
        }
    }



왜 배열에 선택 항목을 저장하지 myArrayAdapter(context,layoutID,dataArray,selectionArray) 와 같은 ListView Array Adapter의 생성자에 배열을 전달합니다.

그런 다음 arrayadapter에 대한 getView 메소드에서 체크 만하면된다. 예를 들어 가상 코드

if row was previously selected
    change background color