【发布时间】:2016-02-26 12:21:06
【问题描述】:
我正在将我的活动更改为我的一个应用程序的片段,并遇到了以下错误。错误中没有说明导致错误的原因,但我将其缩小到以下片段。
我还遇到了另一个奇怪的错误,当一个项目被添加到列表中时,它的复选框不能被勾选,直到活动被离开并再次重新进入?有没有办法让复选框在添加到列表后立即删除,而不必离开并再次回来?
谁能给我解释一下这个错误?
片段
import android.app.Dialog;
import android.support.v4.app.ListFragment;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
public class ShoppingList extends ListFragment{
private Cursor cursor;
private static int measurementValue;
private static String unitValue;
private String name;
private String unit;
private int measurement;
private int currMeasurement;
private int newMeasure;
public ShoppingList() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View rootView = inflater.inflate(R.layout.fragment_shopping, container, false);
final DBMain db = new DBMain(getActivity());
db.open();
cursor = db.getAllItems();
String[] values = new String[cursor.getCount()];
cursor.moveToFirst();
for(int i = 0; i < cursor.getCount(); i++)
{
String row = cursor.getString(cursor.getColumnIndex("name"));
values[i] = row;
cursor.moveToNext();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
R.layout.shopping_list_row, values);
setListAdapter(adapter);
FloatingActionButton filterButton = (FloatingActionButton) rootView.findViewById(R.id.addButton);
filterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// custom ingredient_dialog
final Dialog dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.shopping_dialog);
dialog.setTitle("Add Item");
final EditText item = (EditText) dialog.findViewById(R.id.item);
final Spinner measurement = (Spinner) dialog.findViewById(R.id.measurement);
measurement.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
final String measurementValue = measurement.getSelectedItem().toString();
int finalMeasurement = Integer.parseInt(measurementValue);
ShoppingList.measurementValue = finalMeasurement;
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
final Spinner unit = (Spinner) dialog.findViewById(R.id.unit);
unit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
String finalUnit = unit.getSelectedItem().toString();
unitValue = finalUnit;
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
Button dialogButtonOk = (Button) dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom ingredient_dialog
dialogButtonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newItem = item.getText().toString();
db.open();
db.insertItem(newItem, measurementValue, unitValue);
Cursor cursor = db.getAllItems();
//String[] columns = new String[] {db.KEY_NAME, db.KEY_CODE, db.KEY_ROWID};
String[] columns = new String[]{db.KEY_ITEM_NAME, db.KEY_MEASUREMENT, db.KEY_UNIT};
int[] to = new int[]{R.id.ingredientName, R.id.ingredientMeasurement, R.id.ingredientUnit};
final SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.shopping_list_row, cursor, columns, to, 0);
//final ListView shoppingList = (ListView) rootView.findViewById(R.id.shoppingList);
//shoppingList.setAdapter(myCursorAdapter);
setListAdapter(myCursorAdapter);
dialog.dismiss();
}
});
Button dialogButtonNext = (Button) dialog.findViewById(R.id.dialogButtonNext);
// if button is clicked, close the custom ingredient_dialog
dialogButtonNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newItem = item.getText().toString();
db.open();
db.insertItem(newItem, measurementValue, unitValue);
item.setText("");
Cursor cursor = db.getAllItems();
//String[] columns = new String[] {db.KEY_NAME, db.KEY_CODE, db.KEY_ROWID};
String[] columns = new String[]{db.KEY_ITEM_NAME, db.KEY_MEASUREMENT, db.KEY_UNIT};
int[] to = new int[]{R.id.ingredientName, R.id.ingredientMeasurement, R.id.ingredientUnit};
final SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.shopping_list_row, cursor, columns, to, 0);
//final ListView shoppingList = (ListView) rootView.findViewById(R.id.shoppingList);
//shoppingList.setAdapter(myCursorAdapter);
setListAdapter(myCursorAdapter);
}
});
dialog.show();
}
}
);
return rootView;
}
public class ShoppingCustomAdapter extends SimpleCursorAdapter implements CompoundButton.OnCheckedChangeListener {
private Context mContext;
private Context appContext;
private int layout;
private Cursor cr;
private final LayoutInflater inflater;
//private Context context = this;
//DBMain db = new DBMain(context);
public ShoppingCustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.layout = layout;
this.mContext = context;
this.inflater = LayoutInflater.from(context);
this.cr = c;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflater.inflate(layout, null);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
super.bindView(view, context, cursor);
CheckBox checkBox1 = (CheckBox) view.findViewById(R.id.checkBox1);
checkBox1.setOnCheckedChangeListener(this);
int columnIndex = cursor.getColumnIndex("_id");
int columnvalue = cursor.getInt(columnIndex);
checkBox1.setTag(columnvalue);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int id = (Integer) buttonView.getTag();
final DBMain db = new DBMain(getActivity());
db.open();
//getting information about deleted item from the shopping list
Cursor item = db.getSingleItem(id);
item.moveToPosition(-1);
while(item.moveToNext())
{
name = item.getString(item.getColumnIndex("name"));
measurement = item.getInt(item.getColumnIndex("measurement"));
unit = item.getString(item.getColumnIndex("unit"));
}
item.close();
//check if item is in Kitchen
Cursor check = db.getSingleItem(id);
//if yes, update it
if(check!=null && check.getCount()>0)
{
//get current kitchen measurement
Cursor measure = db.getKitchenMeasurementID(id);
measure.moveToPosition(-1);
while(measure.moveToNext())
{
currMeasurement = measure.getInt(measure.getColumnIndex("measurement"));
}
measure.close();
newMeasure = measurement + currMeasurement;
db.updateContents(name, newMeasure);
}
else
{
db.insertContent(name, measurement, unit);
}
db.deleteItem(id);
}
}
}
片段的 XML
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@android:id/list"
android:layout_below="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/addButton"
app:backgroundTint="@color/floatingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:clickable="true"
android:src="@drawable/ic_tab_add"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_marginBottom="63dp"
android:layout_marginRight="16dp" />
</android.support.design.widget.CoordinatorLayout>
行布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:id="@+id/ingredientName"
android:layout_width="wrap_content"
android:textColor="#000000"
android:layout_height="wrap_content"
android:padding="5dp"
android:hint="wewewe"/>
<TextView
android:id="@+id/ingredientMeasurement"
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ingredientName"
android:padding="5dp"
android:hint="fefefef"/>
<TextView
android:id="@+id/ingredientUnit"
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ingredientMeasurement"
android:padding="5dp"
android:hint="qqqqq"/>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="#fff"
android:text=""/>
</LinearLayout>
Logcat 错误
Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
【问题讨论】:
标签: android android-layout android-fragments