我的问题是,我无法解决改变我的TextView的外观在正确的位置,当我切换一个复选框,这是一个列表视图的一部分。目标是STRIKE_THRU文本,并(作为下一步)将更改后的状态返回给数据库,当CheckBox被选中时。
每次更改第一行时,独立于单击列表的哪个复选框。我怎么能改变代码,得到STRIKE_THRU文本受影响的行?(我刚开始使用Android)
重要的是,我仍然可以启动另一个活动来显示细节,当点击TextView
ListActivity的代码import android.app.ListActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TextView;
public class TaskListActivity extends ListActivity implements OnCheckedChangeListener {
private Cursor dbCursor;
private TaskAdapter listAdapter;
String lUID;
CheckBox cb;
TextView textview1, textview2;
ContentValues values;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
lUID = intent.getStringExtra("List");
Uri uri = Uri.withAppendedPath(Provider.CONTENT_URI_TASKSLIST, lUID);
dbCursor = getContentResolver().query(uri,
null, null, null, OpenHandler.TASKS_NAME + " DESC");
startManagingCursor(dbCursor);
listAdapter = new TaskAdapter(this, dbCursor);
setListAdapter(listAdapter);
lv=getListView();
lv.setItemsCanFocus(true);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO
Log.d("Position", "Test: " + position);
//works fine
}
});
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos = (Integer)buttonView.getTag();
//Gives the correct position of the clicked CheckBox
System.out.println("Pos ["+pos+"]");
if (pos != ListView.INVALID_POSITION) {
CheckBox cb = (CheckBox) buttonView.findViewById(R.id.checkbox);
textview1 = (TextView) findViewById(R.id.text1);
textview2 = (TextView) findViewById(R.id.text2);
if(cb.isChecked()==true){
cb.setChecked(true);
textview1.setTextColor(Color.GRAY);
textview1.setPaintFlags(textview1.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
textview2.setTextColor(Color.GRAY);
textview2.setPaintFlags(textview2.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
}
}
}
适配器代码
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.TextView;
public class TaskAdapter extends CursorAdapter {
private LayoutInflater inflator;
private int ciTasksList, ciTasksName;
private Context context;
private Cursor c;
private CheckBox cb;
public TaskAdapter(Context context, Cursor c) {
super(context, c);
this.c = c;
this.context = context;
inflator = LayoutInflater.from(context);
ciTasksName = c.getColumnIndex(OpenHandler.TASKS_NAME);
ciTasksList = c.getColumnIndex(OpenHandler.TASKS_LIST);
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
if (!c.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(context, c, viewGroup);
} else {
v = convertView;
}
bindView(v, context, c);
cb = (CheckBox) v.findViewById(R.id.checkbox);
cb.setTag(position);
cb.setOnCheckedChangeListener((TaskListActivity) context);
return v;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView textview1 = (TextView) view.findViewById(R.id.text1);
TextView textview2 = (TextView) view.findViewById(R.id.text2);
String TasksName = cursor.getString(ciTasksName);
String TasksList = cursor.getString(ciTasksList);
textview1.setText(TasksName);
textview2.setText("ID " + TasksList);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflator.inflate(R.layout.check_text_text, null);
}
}
和Layout的代码:
<CheckBox android:id="@+id/checkbox"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="6dip"
android:layout_width="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/text1"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginTop="4dip"
android:layout_toRightOf="@id/checkbox"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView android:id="@+id/text2"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_below="@id/text1"
android:layout_alignLeft="@id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
编辑而不是
cb = (CheckBox) v.findViewById(R.id.checkbox);
cb.setTag(position);
cb.setOnCheckedChangeListener((TaskListActivity) context);
适配器类中的我更改为(非常感谢erdomester):
cb = (CheckBox) v.findViewById(R.id.checkbox);
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
cb = (CheckBox) view.findViewById(R.id.checkbox);
textview1 = (TextView) v.findViewById(R.id.text1);
textview2 = (TextView) v.findViewById(R.id.text2);
if(cb.isChecked()==true){
cb.setChecked(true);
textview1.setTextColor(Color.GRAY);
// [...]
}
}
});
从活动的onCheckedChanged中获取onClick的代码
Edit2
仍然不是预期的结果。我在第一次测试中没有得到的是,它现在只对最后一行有效。(在onClick
中删除cb = (CheckBox) view.findViewById(R.id.checkbox);
,结果相同)。什么好主意吗?
去掉onCheckedChangeListener()
,在getView()
函数里面使用setOnClickListener()
怎么样?(记住也要从类起始行中删除它)。
checkBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
final boolean isChecked = checkBox.isChecked();
// Do something here.
}
});