0

Ich habe ein Problem mit einem langen Druck auf eine Zeile, um hervorgehoben zu werden.Hervorhebung der Liste Zeilen

Ich überlegte, wie man mit dem einzelnen Klick zu einer anderen Aktivität führt und ein langer Druck, um die kontextabhängige Aktionsleiste aufzurufen. Ich habe mich entschieden, die Listenansicht durch ListView.CHOICE_MODE_MULTIPLE_MODAL und ListView.CHOICE_MODE_NONE zu wechseln, damit die eingebauten Android-Methoden ihre Arbeit an ausgewählten Zeilen ausführen können. Der einzelne Klick funktioniert wie vorgesehen. Das multiple Modal funktioniert und die kontextabhängige Aktionsleiste zeigt die Anzahl der ausgewählten Noten an, die Zeilen sind jedoch nicht markiert. Ich habe das Thema überprüft und es funktioniert nicht für Theme.AppCompat und Theme.AppCompat.Light.

Hier sind die Code -

Klassen

MainActivity extends AppCompatActivity {} 

ObjectListFragment extends ListFragment implements 
    AdapterView.OnItemLongClickListener, AbsListView.MultiChoiceModeListener {} 

NoteListAdapter extends ArrayAdapter<NoteTO> {} 

Initialisierung von Hörern und anderen Objekten in ListFragment

//get the data 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    LogUtils.LOGD(getClass().getSimpleName(), "onViewCreated"); 

    ListView listView = getListView(); 
    listView.setOnItemLongClickListener(this); 
    listView.setMultiChoiceModeListener(this); 

    int choiceMode = (savedInstanceState == null ? ListView.CHOICE_MODE_NONE : savedInstanceState.getInt(STATE_CHOICE_MODE)); 
    listView.setChoiceMode(choiceMode); 
} 

Action-Modus Methoden, lange Pressverfahren und private Methoden

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    l.setItemChecked(position, true); 

    NoteTO note = (NoteTO) l.getItemAtPosition(position); 
    Intent i = new Intent(getActivity(), NoteActivity.class); 
    NotePreferences.setNote(getActivity(), note); 
    AppPreferences.setActionFlag(getActivity(), AppConstants.ACTION_UPDATE); 
    startActivityForResult(i, 1); 
} 

@Override 
public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) { 
    if (mActiveMode != null) { 
     updateSubtitle(actionMode); 
    } 
} 

@Override 
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { 
    MenuInflater inflater = getActivity().getMenuInflater(); 
    inflater.inflate(R.menu.contextual_menu, menu); 

    this.mActiveMode = actionMode; 
    updateSubtitle(mActiveMode); 

    return true; 
} 

@Override 
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { 
    return false; 
} 

@Override 
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { 
    boolean result = performActions(menuItem); 

    updateSubtitle(mActiveMode); 

    return(result); 
} 

@Override 
public void onDestroyActionMode(ActionMode actionMode) { 
    if (mActiveMode != null) { 
     mActiveMode = null; 
     getListView().setChoiceMode(ListView.CHOICE_MODE_NONE); 
     getListView().setAdapter(getListView().getAdapter()); 
    } 
} 

public boolean performActions(MenuItem item) { 
    List<NoteTO> list = listAdapter.getList(); 
    Set<Integer> positionSet = listAdapter.getCurrentCheckedPosition(); 
    Integer[] positions = listAdapter.getCurrentCheckedPosition().toArray(new Integer[positionSet.size()]); 

    if(item.getItemId() == R.id.item_delete) { 
     List<NoteTO> notesToBeDeleted = new ArrayList<NoteTO>(); 
     String text = ""; 

     for(int i = 0; i < positions.length; i++) { 
      NoteTO note = (NoteTO) list.get(positions[i]); 
      notesToBeDeleted.add(note); 
     } 
     task = new ObjectListFragment.deleteNotesTask().execute(notesToBeDeleted); 
     return true; 
    } 

    else if(item.getItemId() == R.id.item_share) { 
     String text = ""; 

     for(int i = 0; i < positions.length; i++) { 
      NoteTO note = (NoteTO) list.get(positions[i]); 
      text = text + note.getBody() + "\r\n"+ "\r\n"; 
     } 
     shareNotes(text); 
     return true; 
    } 

    return false; 
} 

private void updateSubtitle(ActionMode mode) { 
    mode.setSubtitle("(" + getListView().getCheckedItemCount() + ")"); 
} 

@Override 
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) { 

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    getListView().setItemChecked(position, true); 

    return(true); 
} 

Adapter - Es gibt keinen Code, der die Selektoren der Zeilen überschreibt.

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    View row = super.getView(position, convertView, parent); 
    NoteHolder holder = (NoteHolder) row.getTag(); 

    if(holder == null) { 
     holder = new NoteHolder(row); 
     row.setTag(holder); 
    } 

    NoteTO note = getItem(position); 

    if(mSettings.getListSingleLine() == 0) { 
     holder.textviewNote.setEllipsize(null); 
     holder.textviewNote.setSingleLine(false); 
    } 
    else { 
     holder.textviewNote.setEllipsize(TextUtils.TruncateAt.END); 
     holder.textviewNote.setSingleLine(); 
    } 

    holder.textviewNote.setText(note.getBody()); 
    holder.textviewNote.setTextSize(getmSettings().getListViewTextSize()); 
    holder.textviewNote.setTypeface(getmSettings().getGeneralFontStyleTypeFace()); 
    //holder.textviewNote.setBackgroundColor(ContextCompat.getColor(context, android.R.color.background_dark)); 
    //holder.textviewNote.setBackground(selector); 

    //arraylist has containers to get the boolean of the position 
    if (mSelection.get(position) != null) { 

     //holder.textviewNote.setSelected(true); 
     //holder.textviewNote.setBackgroundColor(ContextCompat.getColor(context, android.R.color.holo_blue_light)); 
     //holder.textviewNote.setTextColor(mSettings.getListViewTextColor()); 
     //holder.textviewNote.setBackground(selector); 
    } 

    return row; 
} 

Antwort

0

ich die Lösung gefunden, übersah ich die Stile wo die markierten Zeilen bekommen -

<item name="android:background">?android:attr/activatedBackgroundIndicator</item> 

Dank

Highlight custom listview item when long click

und

Commonsware - The Busy Coders Guide zur Android-Entwicklung