簡體   English   中英

ListView 以編程方式突出顯示單行或多行

[英]ListView highlight a single or multiple rows programmatically

這是我的代碼,它使用從 firebase 存儲的數據填充 ListView。 我希望能夠根據我之前選擇的項目(存儲在 firebase 中)以編程方式突出顯示項目列表中的一個項目或幾個項目。 感謝任何幫助/指針。

我已將choiceMode 設置為multipleChoice。

謝謝你。

    <ListView
        android:id="@+id/listv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/holidayChecklist"
        android:layout_marginTop="100dp"
        android:divider="@color/midGreen"
        android:dividerHeight="2dp"
        android:padding="15dp"
        android:choiceMode="multipleChoice"/>


    public class ChecklistActivity2 extends AppCompatActivity {
    
        ImageButton back;
        ListView checklist;
        ArrayAdapter<String> displayChecklist;
        private Firebase mRef;
        ArrayList<String> items = new ArrayList<>();
        ArrayList<Boolean> values = new ArrayList<>();
        ArrayList<Boolean> valuesog = new ArrayList<>();
        TextView text;
        public int SIZE_OF_CHECKLIST = 16;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_checklist);
    
            Firebase.setAndroidContext(this);
            mRef = new Firebase("https://vacay.firebaseio.com/");
    
            back = findViewById(R.id.backButton);
            checklist = findViewById(R.id.listv);
            text = findViewById(R.id.txtitem);
    
            back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(ChecklistActivity2.this, HomeScreenActivity.class);
                    startActivity(intent);
                }
            });
    
            getChecklist();
    
            checklist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String item = (String) checklist.getItemAtPosition(position);
                    System.out.println("HERE " + item + " position: " + position);
                    if (values.get(items.indexOf(item))) {
                        values.set(items.indexOf(item), false);
                        view.setSelected(false);
                        System.out.println(item+" NOW FALSE");
                    }
                    else {
                        values.set(items.indexOf(item), true);
                        view.setSelected(true);
                        System.out.println(item+ " NOW TRUE");
                    }
                }
            });
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            setChecklist();
            items.clear();
            values.clear();
            valuesog.clear();
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            setChecklist();
            items.clear();
            values.clear();
            valuesog.clear();
        }
    
        public void getChecklist() {
            System.out.println("RUNNING GETCHECKLIST, SIZE " + items.size());
            Firebase mRefChild = mRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("holiday_checklist");
            mRefChild.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    System.out.println("data changed!");
                    if (dataSnapshot.getValue() != null) {
                        Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                        for (Map.Entry<String, Object> entry : map.entrySet()){
                            //Get user map
                            Boolean value = (Boolean) entry.getValue();
                            String item = entry.getKey();
    
                            items.add(item);
                            valuesog.add(value);
                        }
                        values.addAll(valuesog);
    
                        displayChecklist = new ArrayAdapter<String>(
                                ChecklistActivity2.this,
                                R.layout.list_item,
                                items
                        );
    
                        checklist.setAdapter(displayChecklist);
    
                    }
    
                    for (int i = 0; i < SIZE_OF_CHECKLIST; i++) {
                        if (values.get(i)) {
                            System.out.println("owo " + checklist.getItemAtPosition(i));
    //                        displayChecklist.getView(i, null, checklist).setBackgroundResource(R.drawable.selected_item);
    //                        TextView t = (TextView) displayChecklist.getView(3, text, checklist);
    //                t.setBackgroundColor(Color.BLUE);
    
    //                System.out.println(displayChecklist.getItemViewType(0));
                        }
                    }
                }
    
                @Override
                public void onCancelled(FirebaseError firebaseError) {
                    System.out.println("firebase canceled oops");
                }
            });
        }
    
        public void setChecklist() {
            System.out.println("SETTING CHECKLIST, SIZE " + values.size());
            if (values.size() > 0) {
                for (int i = 0; i < SIZE_OF_CHECKLIST; i++) {
                    Firebase mRefChild = mRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("holiday_checklist")
                            .child(items.get(i));
                    if (values.get(i) != valuesog.get(i)) {
                        System.out.println(items.get(i) + " CHANGED");
                        if (valuesog.get(i)) {
                            System.out.println(items.get(i) + " SET TO FALSE");
                            mRefChild.setValue(false);
                        }
                        else {
                            System.out.println(items.get(i) + " SET TO TRUE");
                            mRefChild.setValue(true);
                        }
                    }
                }
            }
            System.out.println("FINISHED SETTING, SIZE " + values.size());
        }

下面是當用戶點擊一個項目時將背景變為綠色的選擇器。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <item
        android:drawable="@color/midGreen"
        android:state_activated="true"/>


</selector>

您必須首先創建數據 model 並添加isSelected Boolean state 變量。 例子:

  class YourDataModel {
        String data;
        String whatever;
        Boolean isSelected;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM