Reputation: 3724
I am trying to create an interactive ListView
without extending the ListActivity
class.The layout should be a RatingBar
to the left and a label to the right. This is the code I have so far, which does not have any compile errors, but crashes on startup of the app:
public class ProDroid_BAActivity extends Activity {
private static final String[] items = { "lorem", "ipsum", "dolor", "sit",
"amet", "consectetuer", "adipiscing", "elit", "morbi", "vel",
"ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel",
"erat", "placerat", "ante", "porttitor", "sodales", "pellentesque",
"augue", "purus" };
ListView listv = (ListView) findViewById(R.id.listView1);
ArrayAdapter<RowModel> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<RowModel> list = new ArrayList<RowModel>();
for (String s : items) {
list.add(new RowModel(s));
}
adapter = new RatingAdapter(list);
listv.setAdapter(adapter);
}
private RowModel getModel(int position) {
return adapter.getItem(position);
}
class RatingAdapter extends ArrayAdapter<RowModel> {
public RatingAdapter(ArrayList<RowModel> list) {
super(ProDroid_BAActivity.this, R.layout.row, R.id.label, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = super.getView(position, convertView, parent);
ViewHolder holder = (ViewHolder) row.getTag();
if (holder == null) {
holder = new ViewHolder(row);
row.setTag(holder);
RatingBar.OnRatingBarChangeListener l = new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar,
float rating, boolean fromTouch) {
Integer myPosition = (Integer) ratingBar.getTag();
RowModel model = getModel(myPosition);
model.rating = rating;
LinearLayout parent = (LinearLayout) ratingBar
.getParent();
TextView label = (TextView) parent
.findViewById(R.id.label);
label.setText(model.toString());
}
};
holder.rate.setOnRatingBarChangeListener(l);
}
RowModel model = getModel(position);
holder.rate.setTag(new Integer(position));
// holder.text.setTag(new Integer(position));
holder.rate.setRating(model.rating);
// holder.text.setText(model.label);
return row;
}
}
class RowModel {
String label;
float rating = 2.0f;
RowModel(String label) {
this.label = label;
}
public String toString() {
if (rating >= 3.0) {
return (label.toUpperCase());
}
return (label);
}
}
}
Upvotes: 2
Views: 754
Reputation: 87064
Move the line:
ListView listv = (ListView) findViewById(R.id.listView1);
in the onCreate()
method after you set the content view.
Upvotes: 3