잡동사니

반응형

질문

나는 iistview가 있고 모바일에서 모든 시뮬레이션 메시지를 자동으로 필터링 한 다음 클릭을 통해 목록보기의 항목을 강조 표시하고 작동하지만 문제는 강조 표시된 항목이 모두 사라진 새 메시지가 있을 때입니다. 강조 표시된 항목을 유지하는 해결책이 있습니까? 새 메시지가 도착하면 항목? 다음 코드를 사용합니다. 응답해 주셔서 감사합니다.

before 여기에 이미지 설명 입력

레이아웃 : activity_main.xml

<ListView
    android:id="@+id/textlistview"
    android:layout_width="match_parent"
    android:choiceMode="multipleChoice"
    android:listSelector="@drawable/default_color"
    android:layout_height="match_parent" />

방송 수신기 : SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {
public static  final String SMS_BUNDLE = "pdus";

public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();

    if(intent.getAction().equalsIgnoreCase("android.provider.Telephony.SMS_RECEIVED")) {
        if (bundle != null) {
            Object[] sms = (Object[]) bundle.get(SMS_BUNDLE);
            String smsMsg = "";
            SmsMessage smsMessage;
            for (int i = 0; i < sms.length; i++) {
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                    String format = bundle.getString("format");

                    smsMessage = SmsMessage.createFromPdu((byte[]) sms[i], format);
                }
                else {
                    smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
                }

                String msgBody = smsMessage.getMessageBody().toString();
                smsMsg +=msgBody;
            }
                text_message inst = text_message.Instance();
                inst.receive_data(smsMsg);
        }
    }
}}

MainActivity : text_message.java

public void receive_data (final String smsMsg) {
        arrayAdapter = new ArrayAdapter(this,R.layout.list_item, list_items);
        text_listview.setAdapter(arrayAdapter);
        arrayAdapter.add(smsMsg);
        arrayAdapter.notifyDataSetChanged();
}

필터 메시지 : text_message.java

 public  void refreshInbox(){
    arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list_items);
    ContentResolver cResolver = getContentResolver();
    Cursor smsInboxCursor = cResolver.query(Uri.parse("content://sms/inbox"),null,null,null,null);
    int indexBody = smsInboxCursor.getColumnIndex("body");
    if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;

    do{
        str = smsInboxCursor.getString(indexBody) ;
        arrayAdapter.add(str);
    }while (smsInboxCursor.moveToNext());
      }

 

답변1

다음과 같이 isSelected라는 전역 배열을 만듭니다.

private boolean[] isSelected;

그런 다음 다음과 같은 크기로 배열을 할당하십시오.

 isSelected=new boolean[arrayAdapter.getCount()]; // Do this after setting adapter

및 .setOnItemClickListener on listview 및 클릭이 발생하여 해당 인덱스 중 선택된 항목이 true로 설정되었는지 확인합니다.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               isSelected[position]=!isSelected[position];
           }
       });

그리고 receive_data ()에서 선택한 위치를 다시 선택하십시오.

public void receive_data (final String smsMsg) {
        arrayAdapter = new ArrayAdapter(this,R.layout.list_item, list_items);
        text_listview.setAdapter(arrayAdapter);
        arrayAdapter.add(smsMsg);
        arrayAdapter.notifyDataSetChanged();
        boolean[] tempSelected=new boolean[arrayAdapter.getCount()];

        for(int i=0;i<isSelected.length;i++)
        {
             tempSelected[i]=isSelected[i];
             if(tempSelected[i])
             {
               text_listview.setItemChecked(i,true);
             }
        }

        isSelected=tempSelected;

}



 

 

 

 

출처 : https://stackoverflow.com/questions/62107231/highlighted-item-on-listview-gone-when-new-message-arrived-android-studio

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band