Так что я считаю, что решил основную проблему, с которой столкнулся.
Я считаю, что проблема, с которой я столкнулся, заключалась в том, что мое представление не представляло состояние ListView. В ламенах; Я думал, что флажок был необходим, чтобы установить, был ли выбран элемент списка или нет (это веб-разработчик во мне). Однако ListView поддерживает свое собственное состояние того, что проверено, а что нет, независимо от того, есть ли у вас представление (CheckBox) для его представления.
макет / list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dip" />
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Line 1"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Line 2" />
</LinearLayout>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:visibility="gone" />
</LinearLayout>
Меню / menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/edit_menu_item"
android:title="KAMEHAMEHA!!!!!"/>
</menu>
Меню / edit.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/commit_menu_item"
android:title="Commit"/>
<item
android:id="@+id/cancel_menu_item"
android:title="Cancel"/>
</menu>
ListViewTestActivity.java
package com.loesak.listviewtest;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class ListViewTestActivity extends ListActivity {
private static final String[] GENRES = new String[] {
"Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
"Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
};
private ListView listView = null;
private MyArrayAdapter myArrayAdapter = null;
private boolean editMode = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.listView = getListView();
this.myArrayAdapter = new MyArrayAdapter(this, GENRES);
this.setListAdapter(this.myArrayAdapter);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
MenuInflater inflater = this.getMenuInflater();
if(!this.editMode) {
inflater.inflate(R.menu.menu, menu);
} else {
inflater.inflate(R.menu.edit, menu);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.edit_menu_item) {
Toast.makeText(this, "entering edit mode", Toast.LENGTH_SHORT).show();
this.editMode = true;
this.listView.setItemsCanFocus(false);
this.listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
this.myArrayAdapter.setEditMode(editMode);
} else if(item.getItemId() == R.id.commit_menu_item
|| item.getItemId() == R.id.cancel_menu_item) {
if(item.getItemId() == R.id.commit_menu_item) {
Toast.makeText(this, "committing changes", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "leaving edit mode", Toast.LENGTH_SHORT).show();
}
this.editMode = false;
this.listView.setItemsCanFocus(true);
this.listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
this.listView.clearChoices();
this.myArrayAdapter.setEditMode(editMode);
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if(!this.editMode) {
Toast.makeText(this, "list item selected at position " + position, Toast.LENGTH_SHORT).show();
} else {
String str = "";
SparseBooleanArray wtfit = l.getCheckedItemPositions();
for(int i = 0; i < GENRES.length; i++) {
if(wtfit.get(i)) {
str += i + ", ";
}
}
Toast.makeText(this, "Selected item positions: " + str, Toast.LENGTH_SHORT).show();
}
super.onListItemClick(l, v, position, id);
}
class MyArrayAdapter extends ArrayAdapter<String> {
private Context context;
private String[] entires;
private boolean editMode = false;
public MyArrayAdapter(Context context, String[] entries) {
super(context, R.layout.list_item, entries);
this.context = context;
this.entires = entries;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
final ListView listView = (ListView) parent;
final ViewHolder viewHolder;
if(view == null) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.list_item, null, true);
viewHolder = new ViewHolder();
viewHolder.text1 = (TextView) view.findViewById(R.id.textView1);
viewHolder.text2 = (TextView) view.findViewById(R.id.textView2);
viewHolder.checkbox1 = (CheckBox) view.findViewById(R.id.checkBox1);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.text1.setText(this.entires[position] + "_1");
viewHolder.text2.setText(this.entires[position] + "_2");
viewHolder.checkbox1.setChecked(listView.isItemChecked(position));
if(this.editMode) {
viewHolder.checkbox1.setVisibility(View.VISIBLE);
} else {
viewHolder.checkbox1.setVisibility(View.GONE);
}
return view;
}
public void setEditMode(boolean editMode) {
this.editMode = editMode;
this.notifyDataSetChanged();
}
class ViewHolder {
TextView text1;
TextView text2;
CheckBox checkbox1;
}
}
}
Чтобы флажок отражал фактический выбранный режим элемента списка:
viewHolder.checkbox1.setChecked(listView.isItemChecked(position));
Вот и все. Вид очевиден, если вы знаете, как все это работает. Жаль, что мне понадобилось так много времени, чтобы понять. Иногда я чувствую, что программирование Android иногда слишком сложно.
Единственная проблема, с которой я столкнулся сейчас, заключается в том, что элементы ListView всегда перерисовываются при нажатии на элемент списка. Это наносит ущерб моим спискам, которые содержат асинхронно загруженные изображения из файла. Надеюсь, что когда я увеличу производительность этой части моего кода, это исчезнет.