Mam niestandardowego adaptera:Android ListView zwyczaj powtarza wybór tła
public class PhraseCustomAdapter extends BaseAdapter
{
public String original[];
public String translation[];
public String transcription[];
public Activity context;
public LayoutInflater inflater;
public PhraseCustomAdapter(Activity context,String[] original, String[] translation, String[] transcription) {
super();
this.context = context;
this.original = original;
this.translation = translation;
this.transcription = transcription;
inflater = LayoutInflater.from(context);
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return original.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public String getItemTranlation(int position) {
return translation[position];
}
public String getItemTranscription(int position) {
// TODO Auto-generated method stub
return transcription[position];
}
public String getItemOriginal(int position) {
// TODO Auto-generated method stub
return original[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
static class ViewHolder
{
ImageView imgViewLogo;
TextView txtViewOriginal;
TextView txtViewTranslation;
TextView txtViewTranscription;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.phrase_row, null);
holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
holder.txtViewOriginal = (TextView) convertView.findViewById(R.id.txtViewOriginal);
holder.txtViewTranslation = (TextView) convertView.findViewById(R.id.txtViewTranslation);
holder.txtViewTranscription = (TextView) convertView.findViewById(R.id.txtViewTranscription);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
holder.txtViewOriginal.setText(original[position]);
holder.txtViewTranslation.setText(translation[position]);
holder.txtViewTranscription.setText(transcription[position]);
return convertView;
}
}
I muszę wdrożyć android4 stylu wielo wyboru (długo naciśnij, a następnie kliknij, aby wybrać pozycję). Więc:
lview1 = (ListView) findViewById(R.id.listViewPhrase);
adapter = new PhraseCustomAdapter(this, original, translation, transcription);
lview1.setAdapter(adapter);
lview1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
lview1.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
View view;
if (checked){
Log.v ("checked?", "YES");
Log.v ("Position", Integer.toString(position));
view = lview1.getChildAt(position);
view.setBackgroundColor(Color.LTGRAY);
original_list.add (adapter.getItemOriginal(position));
translation_list.add (adapter.getItemTranlation(position));
transcription_list.add (adapter.getItemTranscription(position));
countSelected += 1;
}
if (!checked){
Log.v ("checked?", "NO");
Log.v ("Position", Integer.toString(position));
for (int i = 0; i < original_list.size(); i++)
{
if (original_list.get(i) == adapter.getItemOriginal(position)){
original_list.remove (i);
translation_list.remove (i);
transcription_list.remove (i);
}
}
countSelected -= 1;
}
mode.setTitle(Integer.toString(countSelected) + " " + getString(R.string.selectItem));
}
Problemem jest: kiedy długo-press element (na przykład pierwsza pozycja), 7. pozycja jest podświetlona zbyt (poprzez zmianę tła). Gdy próbuję "unhighlight" podświetlić 7. element, aplikacja ulega awarii. Jeśli spróbuję kliknąć najnowszy element, aplikacja ulega zawieszeniu. Czytałem kilka artykułów o tym, jak widok jest renderowany i recyklingu przedmiotów, ale nie wiem Ewentualne rozwiązanie dla mojego problemu
UPD: wyjście logcat kiedy „unhighlighting” 7th przedmiot:
V/checked?(24966): YES
V/Position(24966): 7
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x2b542210)
AndroidRuntime(24966): FATAL EXCEPTION: main
java.lang.NullPointerException
at com.alextee.phrases.PhraseActivity$1.onItemCheckedStateChanged(PhraseActivity.java:145)
at android.widget.AbsListView$MultiChoiceModeWrapper.onItemCheckedStateChanged(AbsListView.java:5688)
at android.widget.AbsListView.performItemClick(AbsListView.java:1040)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2522)
at android.widget.AbsListView$1.run(AbsListView.java:3183)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4441)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
można opublikować StackTrace logcat, kiedy Twoja aplikacja ulega awarii, gdy nie zauważysz 7. elementu? – tolgap
Dodano do końca postu. –